blob: d27aa0c9d9a58a2068fdc94bfe1ae21d36c3d222 [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
Karl Schultz6addd812016-02-02 17:17:23 -07006576TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006577 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6578 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006579 // Create a valid cmd buffer
6580 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006581 uint64_t fake_pipeline_handle = 0xbaad6001;
6582 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006583 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6584 "Invalid VkPipeline Object 0xbaad6001");
6585 ASSERT_NO_FATAL_FAILURE(InitState());
6586 BeginCommandBuffer();
6587 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6588 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
6589 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006590 // Now issue a draw call with no pipeline bound
6591 m_errorMonitor->SetDesiredFailureMsg(
6592 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6593 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tony Barbourdf4c0042016-06-01 15:55:43 -06006594
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006595 BeginCommandBuffer();
6596 Draw(1, 0, 0, 0);
6597 m_errorMonitor->VerifyFound();
6598 // Finally same check once more but with Dispatch/Compute
6599 m_errorMonitor->SetDesiredFailureMsg(
6600 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6601 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006602 BeginCommandBuffer();
6603 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6604 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006605}
6606
Karl Schultz6addd812016-02-02 17:17:23 -07006607TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
6608 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
6609 // CommandBuffer
6610 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006611
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006612 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006613 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006614
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006615 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006616 ASSERT_NO_FATAL_FAILURE(InitViewport());
6617 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006618 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006619 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6620 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006621
6622 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006623 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6624 ds_pool_ci.pNext = NULL;
6625 ds_pool_ci.maxSets = 1;
6626 ds_pool_ci.poolSizeCount = 1;
6627 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006628
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006629 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006630 err =
6631 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006632 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006633
Tony Barboureb254902015-07-15 12:50:33 -06006634 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006635 dsl_binding.binding = 0;
6636 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6637 dsl_binding.descriptorCount = 1;
6638 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6639 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006640
Tony Barboureb254902015-07-15 12:50:33 -06006641 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006642 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6643 ds_layout_ci.pNext = NULL;
6644 ds_layout_ci.bindingCount = 1;
6645 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006646 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006647 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6648 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006649 ASSERT_VK_SUCCESS(err);
6650
6651 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006652 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006653 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006654 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006655 alloc_info.descriptorPool = ds_pool;
6656 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006657 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6658 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006659 ASSERT_VK_SUCCESS(err);
6660
Tony Barboureb254902015-07-15 12:50:33 -06006661 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006662 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6663 pipeline_layout_ci.pNext = NULL;
6664 pipeline_layout_ci.setLayoutCount = 1;
6665 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006666
6667 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006668 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6669 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006670 ASSERT_VK_SUCCESS(err);
6671
Karl Schultz6addd812016-02-02 17:17:23 -07006672 VkShaderObj vs(m_device, bindStateVertShaderText,
6673 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006674 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006675 // on more devices
6676 VkShaderObj fs(m_device, bindStateFragShaderText,
6677 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006678
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006679 VkPipelineObj pipe(m_device);
6680 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006681 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006682 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006683 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006684
6685 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006686 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6687 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6688 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6689 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
6690 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006691
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006692 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006693
Chia-I Wuf7458c52015-10-26 21:10:41 +08006694 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6695 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6696 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006697}
6698
Karl Schultz6addd812016-02-02 17:17:23 -07006699TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006700 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006701 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006702
Karl Schultz6addd812016-02-02 17:17:23 -07006703 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006704 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
6705 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006706
6707 ASSERT_NO_FATAL_FAILURE(InitState());
6708 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006709 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6710 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006711
6712 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006713 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6714 ds_pool_ci.pNext = NULL;
6715 ds_pool_ci.maxSets = 1;
6716 ds_pool_ci.poolSizeCount = 1;
6717 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006718
6719 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006720 err =
6721 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006722 ASSERT_VK_SUCCESS(err);
6723
6724 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006725 dsl_binding.binding = 0;
6726 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6727 dsl_binding.descriptorCount = 1;
6728 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6729 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006730
6731 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006732 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6733 ds_layout_ci.pNext = NULL;
6734 ds_layout_ci.bindingCount = 1;
6735 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006736 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006737 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6738 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006739 ASSERT_VK_SUCCESS(err);
6740
6741 VkDescriptorSet descriptorSet;
6742 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006743 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006744 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006745 alloc_info.descriptorPool = ds_pool;
6746 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006747 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6748 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006749 ASSERT_VK_SUCCESS(err);
6750
Karl Schultz6addd812016-02-02 17:17:23 -07006751 VkBufferView view =
6752 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006753 VkWriteDescriptorSet descriptor_write;
6754 memset(&descriptor_write, 0, sizeof(descriptor_write));
6755 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6756 descriptor_write.dstSet = descriptorSet;
6757 descriptor_write.dstBinding = 0;
6758 descriptor_write.descriptorCount = 1;
6759 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6760 descriptor_write.pTexelBufferView = &view;
6761
6762 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6763
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006764 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006765
6766 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6767 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6768}
6769
Mark Youngd339ba32016-05-30 13:28:35 -06006770TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
6771 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has"
6772 " no memory bound to it.");
6773
6774 VkResult err;
6775 m_errorMonitor->SetDesiredFailureMsg(
6776 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6777 "vkCreateBufferView called with invalid memory ");
6778
6779 ASSERT_NO_FATAL_FAILURE(InitState());
6780
6781 // Create a buffer with no bound memory and then attempt to create
6782 // a buffer view.
6783 VkBufferCreateInfo buff_ci = {};
6784 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6785 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6786 buff_ci.size = 256;
6787 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6788 VkBuffer buffer;
6789 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6790 ASSERT_VK_SUCCESS(err);
6791
6792 VkBufferViewCreateInfo buff_view_ci = {};
6793 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6794 buff_view_ci.buffer = buffer;
6795 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6796 buff_view_ci.range = VK_WHOLE_SIZE;
6797 VkBufferView buff_view;
6798 err =
6799 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
6800
6801 m_errorMonitor->VerifyFound();
6802 vkDestroyBuffer(m_device->device(), buffer, NULL);
6803 // If last error is success, it still created the view, so delete it.
6804 if (err == VK_SUCCESS) {
6805 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6806 }
6807}
6808
Karl Schultz6addd812016-02-02 17:17:23 -07006809TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6810 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6811 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006812 // 1. No dynamicOffset supplied
6813 // 2. Too many dynamicOffsets supplied
6814 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006815 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006817 " requires 1 dynamicOffsets, but only "
6818 "0 dynamicOffsets are left in "
6819 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006820
6821 ASSERT_NO_FATAL_FAILURE(InitState());
6822 ASSERT_NO_FATAL_FAILURE(InitViewport());
6823 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6824
6825 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006826 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6827 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006828
6829 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006830 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6831 ds_pool_ci.pNext = NULL;
6832 ds_pool_ci.maxSets = 1;
6833 ds_pool_ci.poolSizeCount = 1;
6834 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006835
6836 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006837 err =
6838 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006839 ASSERT_VK_SUCCESS(err);
6840
6841 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006842 dsl_binding.binding = 0;
6843 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6844 dsl_binding.descriptorCount = 1;
6845 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6846 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006847
6848 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006849 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6850 ds_layout_ci.pNext = NULL;
6851 ds_layout_ci.bindingCount = 1;
6852 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006853 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006854 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6855 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006856 ASSERT_VK_SUCCESS(err);
6857
6858 VkDescriptorSet descriptorSet;
6859 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006860 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006861 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006862 alloc_info.descriptorPool = ds_pool;
6863 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006864 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6865 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006866 ASSERT_VK_SUCCESS(err);
6867
6868 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006869 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6870 pipeline_layout_ci.pNext = NULL;
6871 pipeline_layout_ci.setLayoutCount = 1;
6872 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006873
6874 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006875 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6876 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006877 ASSERT_VK_SUCCESS(err);
6878
6879 // Create a buffer to update the descriptor with
6880 uint32_t qfi = 0;
6881 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006882 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6883 buffCI.size = 1024;
6884 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6885 buffCI.queueFamilyIndexCount = 1;
6886 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006887
6888 VkBuffer dyub;
6889 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6890 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006891 // Allocate memory and bind to buffer so we can make it to the appropriate
6892 // error
6893 VkMemoryAllocateInfo mem_alloc = {};
6894 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6895 mem_alloc.pNext = NULL;
6896 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006897 mem_alloc.memoryTypeIndex = 0;
6898
6899 VkMemoryRequirements memReqs;
6900 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
6901 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
6902 0);
6903 if (!pass) {
6904 vkDestroyBuffer(m_device->device(), dyub, NULL);
6905 return;
6906 }
6907
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006908 VkDeviceMemory mem;
6909 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6910 ASSERT_VK_SUCCESS(err);
6911 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6912 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006913 // Correctly update descriptor to avoid "NOT_UPDATED" error
6914 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006915 buffInfo.buffer = dyub;
6916 buffInfo.offset = 0;
6917 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006918
6919 VkWriteDescriptorSet descriptor_write;
6920 memset(&descriptor_write, 0, sizeof(descriptor_write));
6921 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6922 descriptor_write.dstSet = descriptorSet;
6923 descriptor_write.dstBinding = 0;
6924 descriptor_write.descriptorCount = 1;
6925 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6926 descriptor_write.pBufferInfo = &buffInfo;
6927
6928 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6929
6930 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006931 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6932 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
6933 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006934 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006935 uint32_t pDynOff[2] = {512, 756};
6936 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07006937 m_errorMonitor->SetDesiredFailureMsg(
6938 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07006939 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07006940 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6941 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
6942 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006943 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006944 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6946 " dynamic offset 512 combined with "
6947 "offset 0 and range 1024 that "
6948 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006949 // Create PSO to be used for draw-time errors below
6950 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12006951 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07006952 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006953 "out gl_PerVertex { \n"
6954 " vec4 gl_Position;\n"
6955 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07006956 "void main(){\n"
6957 " gl_Position = vec4(1);\n"
6958 "}\n";
6959 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12006960 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07006961 "\n"
6962 "layout(location=0) out vec4 x;\n"
6963 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6964 "void main(){\n"
6965 " x = vec4(bar.y);\n"
6966 "}\n";
6967 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6968 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6969 VkPipelineObj pipe(m_device);
6970 pipe.AddShader(&vs);
6971 pipe.AddShader(&fs);
6972 pipe.AddColorAttachment();
6973 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6974
Karl Schultz6addd812016-02-02 17:17:23 -07006975 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6976 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6977 // This update should succeed, but offset size of 512 will overstep buffer
6978 // /w range 1024 & size 1024
6979 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6980 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
6981 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006982 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006983 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006984
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006985 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006986 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006987
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006988 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006989 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006990 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6991}
6992
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006993TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006994 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006995 ASSERT_NO_FATAL_FAILURE(InitState());
6996 ASSERT_NO_FATAL_FAILURE(InitViewport());
6997 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6998
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006999 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007000 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007001 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7002 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7003 pipeline_layout_ci.pushConstantRangeCount = 1;
7004 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7005
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007006 //
7007 // Check for invalid push constant ranges in pipeline layouts.
7008 //
7009 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007010 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007011 char const *msg;
7012 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007013
Karl Schultzc81037d2016-05-12 08:11:23 -06007014 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7015 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7016 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7017 "vkCreatePipelineLayout() call has push constants index 0 with "
7018 "size 0."},
7019 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7020 "vkCreatePipelineLayout() call has push constants index 0 with "
7021 "size 1."},
7022 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7023 "vkCreatePipelineLayout() call has push constants index 0 with "
7024 "size 1."},
7025 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7026 "vkCreatePipelineLayout() call has push constants index 0 with "
7027 "size 0."},
7028 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7029 "vkCreatePipelineLayout() call has push constants index 0 with "
7030 "offset 1. Offset must"},
7031 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7032 "vkCreatePipelineLayout() call has push constants index 0 "
7033 "with offset "},
7034 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7035 "vkCreatePipelineLayout() call has push constants "
7036 "index 0 with offset "},
7037 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
7038 "vkCreatePipelineLayout() call has push constants index 0 "
7039 "with offset "},
7040 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7041 "vkCreatePipelineLayout() call has push "
7042 "constants index 0 with offset "},
7043 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7044 "vkCreatePipelineLayout() call has push "
7045 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007046 }};
7047
7048 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007049 for (const auto &iter : range_tests) {
7050 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007051 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7052 iter.msg);
7053 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7054 NULL, &pipeline_layout);
7055 m_errorMonitor->VerifyFound();
7056 if (VK_SUCCESS == err) {
7057 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7058 }
7059 }
7060
7061 // Check for invalid stage flag
7062 pc_range.offset = 0;
7063 pc_range.size = 16;
7064 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007065 m_errorMonitor->SetDesiredFailureMsg(
7066 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007067 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007068 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7069 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007070 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007071 if (VK_SUCCESS == err) {
7072 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7073 }
7074
7075 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06007076 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007077 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007078 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007079 char const *msg;
7080 };
7081
Karl Schultzc81037d2016-05-12 08:11:23 -06007082 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007083 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7084 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7085 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7086 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7087 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7088 "vkCreatePipelineLayout() call has push constants with overlapping "
7089 "ranges: 0:[0, 4), 1:[0, 4)"},
7090 {
7091 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7092 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7093 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7094 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7095 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7096 "vkCreatePipelineLayout() call has push constants with "
7097 "overlapping "
7098 "ranges: 3:[12, 20), 4:[16, 20)",
7099 },
7100 {
7101 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7102 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7103 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7104 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7105 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7106 "vkCreatePipelineLayout() call has push constants with "
7107 "overlapping "
7108 "ranges: 0:[16, 20), 1:[12, 20)",
7109 },
7110 {
7111 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7112 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7113 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7114 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7115 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7116 "vkCreatePipelineLayout() call has push constants with "
7117 "overlapping "
7118 "ranges: 0:[16, 20), 3:[12, 20)",
7119 },
7120 {
7121 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7122 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
7123 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
7124 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
7125 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
7126 "vkCreatePipelineLayout() call has push constants with "
7127 "overlapping "
7128 "ranges: 0:[16, 20), 2:[4, 100)",
7129 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007130
Karl Schultzc81037d2016-05-12 08:11:23 -06007131 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007132 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007133 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
7134 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007135 iter.msg);
7136 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7137 NULL, &pipeline_layout);
7138 m_errorMonitor->VerifyFound();
7139 if (VK_SUCCESS == err) {
7140 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7141 }
7142 }
7143
7144 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06007145 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
7146 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7147 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7148 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7149 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
7150 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7151 ""},
7152 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
7153 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
7154 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
7155 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
7156 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7157 ""}}};
7158 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007159 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
7160 m_errorMonitor->ExpectSuccess();
7161 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7162 NULL, &pipeline_layout);
7163 m_errorMonitor->VerifyNotFound();
7164 if (VK_SUCCESS == err) {
7165 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7166 }
7167 }
7168
7169 //
7170 // CmdPushConstants tests
7171 //
Karl Schultzc81037d2016-05-12 08:11:23 -06007172 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007173
7174 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06007175 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
7176 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7177 "vkCmdPushConstants() call has push constants with size 0. Size "
7178 "must be greater than zero and a multiple of 4."},
7179 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7180 "vkCmdPushConstants() call has push constants with size 1. Size "
7181 "must be greater than zero and a multiple of 4."},
7182 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7183 "vkCmdPushConstants() call has push constants with size 1. Size "
7184 "must be greater than zero and a multiple of 4."},
7185 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7186 "vkCmdPushConstants() call has push constants with offset 1. "
7187 "Offset must be a multiple of 4."},
7188 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7189 "vkCmdPushConstants() call has push constants with offset 1. "
7190 "Offset must be a multiple of 4."},
7191 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
7192 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
7193 "0x1 not within flag-matching ranges in pipeline layout"},
7194 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
7195 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
7196 "0x1 not within flag-matching ranges in pipeline layout"},
7197 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
7198 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
7199 "0x1 not within flag-matching ranges in pipeline layout"},
7200 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
7201 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
7202 "0x1 not within flag-matching ranges in pipeline layout"},
7203 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7204 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
7205 "any of the ranges in pipeline layout"},
7206 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7207 0, 16},
7208 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
7209 "any of the ranges in pipeline layout"},
7210 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007211 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007212 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007213 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007214 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007215 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007216 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007217 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007218 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007219 "vkCmdPushConstants() call has push constants with offset "},
7220 }};
7221
7222 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06007223 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007224 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06007225 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007226 };
Karl Schultzc81037d2016-05-12 08:11:23 -06007227 pipeline_layout_ci.pushConstantRangeCount =
7228 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007229 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007230 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7231 &pipeline_layout);
7232 ASSERT_VK_SUCCESS(err);
7233 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06007234 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7236 iter.msg);
7237 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06007238 iter.range.stageFlags, iter.range.offset,
7239 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007240 m_errorMonitor->VerifyFound();
7241 }
7242
7243 // Check for invalid stage flag
7244 m_errorMonitor->SetDesiredFailureMsg(
7245 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7246 "vkCmdPushConstants() call has no stageFlags set.");
7247 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06007248 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007249 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06007250 EndCommandBuffer();
7251 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
7252 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007253
Karl Schultzc81037d2016-05-12 08:11:23 -06007254 // overlapping range tests with cmd
7255 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
7256 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
7257 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
7258 "0x1 not within flag-matching ranges in pipeline layout"},
7259 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7260 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
7261 "0x1 not within flag-matching ranges in pipeline layout"},
7262 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
7263 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
7264 "0x1 not within flag-matching ranges in pipeline layout"},
7265 }};
7266 const VkPushConstantRange pc_range3[] = {
7267 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
7268 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7269 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7270 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
7271 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
7272 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
7273 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
7274 };
7275 pipeline_layout_ci.pushConstantRangeCount =
7276 sizeof(pc_range3) / sizeof(VkPushConstantRange);
7277 pipeline_layout_ci.pPushConstantRanges = pc_range3;
7278 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7279 &pipeline_layout);
7280 ASSERT_VK_SUCCESS(err);
7281 BeginCommandBuffer();
7282 for (const auto &iter : cmd_overlap_tests) {
7283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7284 iter.msg);
7285 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
7286 iter.range.stageFlags, iter.range.offset,
7287 iter.range.size, dummy_values);
7288 m_errorMonitor->VerifyFound();
7289 }
7290 EndCommandBuffer();
7291 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
7292 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7293
7294 // positive overlapping range tests with cmd
7295 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
7296 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
7297 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
7298 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
7299 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
7300 }};
7301 const VkPushConstantRange pc_range4[] = {
7302 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
7303 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
7304 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7305 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7306 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
7307 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
7308 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
7309 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
7310 };
7311 pipeline_layout_ci.pushConstantRangeCount =
7312 sizeof(pc_range4) / sizeof(VkPushConstantRange);
7313 pipeline_layout_ci.pPushConstantRanges = pc_range4;
7314 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7315 &pipeline_layout);
7316 ASSERT_VK_SUCCESS(err);
7317 BeginCommandBuffer();
7318 for (const auto &iter : cmd_overlap_tests_pos) {
7319 m_errorMonitor->ExpectSuccess();
7320 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
7321 iter.range.stageFlags, iter.range.offset,
7322 iter.range.size, dummy_values);
7323 m_errorMonitor->VerifyNotFound();
7324 }
7325 EndCommandBuffer();
7326 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007327 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7328}
7329
Karl Schultz6addd812016-02-02 17:17:23 -07007330TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007331 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007332 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007333
7334 ASSERT_NO_FATAL_FAILURE(InitState());
7335 ASSERT_NO_FATAL_FAILURE(InitViewport());
7336 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7337
Mike Stroyanb8a61002016-06-20 16:00:28 -06007338 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
7339 VkImageTiling tiling;
7340 VkFormatProperties format_properties;
7341 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
7342 if (format_properties.linearTilingFeatures &
7343 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
7344 tiling = VK_IMAGE_TILING_LINEAR;
7345 } else if (format_properties.optimalTilingFeatures &
7346 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
7347 tiling = VK_IMAGE_TILING_OPTIMAL;
7348 } else {
7349 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
7350 "skipped.\n");
7351 return;
7352 }
7353
Tobin Ehlis559c6382015-11-05 09:52:49 -07007354 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7355 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007356 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7357 ds_type_count[0].descriptorCount = 10;
7358 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7359 ds_type_count[1].descriptorCount = 2;
7360 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7361 ds_type_count[2].descriptorCount = 2;
7362 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7363 ds_type_count[3].descriptorCount = 5;
7364 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7365 // type
7366 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7367 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7368 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007369
7370 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007371 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7372 ds_pool_ci.pNext = NULL;
7373 ds_pool_ci.maxSets = 5;
7374 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7375 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007376
7377 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007378 err =
7379 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007380 ASSERT_VK_SUCCESS(err);
7381
7382 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7383 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007384 dsl_binding[0].binding = 0;
7385 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7386 dsl_binding[0].descriptorCount = 5;
7387 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7388 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007389
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007390 // Create layout identical to set0 layout but w/ different stageFlags
7391 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007392 dsl_fs_stage_only.binding = 0;
7393 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7394 dsl_fs_stage_only.descriptorCount = 5;
7395 dsl_fs_stage_only.stageFlags =
7396 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7397 // bind time
7398 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007399 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007400 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7401 ds_layout_ci.pNext = NULL;
7402 ds_layout_ci.bindingCount = 1;
7403 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007404 static const uint32_t NUM_LAYOUTS = 4;
7405 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007406 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007407 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7408 // layout for error case
7409 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7410 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007411 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007412 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007413 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7414 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007415 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007416 dsl_binding[0].binding = 0;
7417 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007418 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007419 dsl_binding[1].binding = 1;
7420 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7421 dsl_binding[1].descriptorCount = 2;
7422 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7423 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007424 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007425 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07007426 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7427 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007428 ASSERT_VK_SUCCESS(err);
7429 dsl_binding[0].binding = 0;
7430 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007431 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007432 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007433 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7434 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007435 ASSERT_VK_SUCCESS(err);
7436 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007437 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07007438 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7439 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007440 ASSERT_VK_SUCCESS(err);
7441
7442 static const uint32_t NUM_SETS = 4;
7443 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7444 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007445 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007446 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007447 alloc_info.descriptorPool = ds_pool;
7448 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007449 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7450 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007451 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007452 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007453 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007454 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007455 err =
7456 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007457 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007458
7459 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007460 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7461 pipeline_layout_ci.pNext = NULL;
7462 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7463 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007464
7465 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007466 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7467 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007468 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007469 // Create pipelineLayout with only one setLayout
7470 pipeline_layout_ci.setLayoutCount = 1;
7471 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007472 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7473 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007474 ASSERT_VK_SUCCESS(err);
7475 // Create pipelineLayout with 2 descriptor setLayout at index 0
7476 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7477 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07007478 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7479 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007480 ASSERT_VK_SUCCESS(err);
7481 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7482 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7483 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07007484 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7485 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007486 ASSERT_VK_SUCCESS(err);
7487 // Create pipelineLayout with UB type, but stageFlags for FS only
7488 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7489 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007490 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7491 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007492 ASSERT_VK_SUCCESS(err);
7493 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7494 VkDescriptorSetLayout pl_bad_s0[2] = {};
7495 pl_bad_s0[0] = ds_layout_fs_only;
7496 pl_bad_s0[1] = ds_layout[1];
7497 pipeline_layout_ci.setLayoutCount = 2;
7498 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7499 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07007500 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7501 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007502 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007503
7504 // Create a buffer to update the descriptor with
7505 uint32_t qfi = 0;
7506 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007507 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7508 buffCI.size = 1024;
7509 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7510 buffCI.queueFamilyIndexCount = 1;
7511 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007512
7513 VkBuffer dyub;
7514 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7515 ASSERT_VK_SUCCESS(err);
7516 // Correctly update descriptor to avoid "NOT_UPDATED" error
7517 static const uint32_t NUM_BUFFS = 5;
7518 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007519 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007520 buffInfo[i].buffer = dyub;
7521 buffInfo[i].offset = 0;
7522 buffInfo[i].range = 1024;
7523 }
Karl Schultz6addd812016-02-02 17:17:23 -07007524 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07007525 const int32_t tex_width = 32;
7526 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007527 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007528 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7529 image_create_info.pNext = NULL;
7530 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7531 image_create_info.format = tex_format;
7532 image_create_info.extent.width = tex_width;
7533 image_create_info.extent.height = tex_height;
7534 image_create_info.extent.depth = 1;
7535 image_create_info.mipLevels = 1;
7536 image_create_info.arrayLayers = 1;
7537 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06007538 image_create_info.tiling = tiling;
7539 image_create_info.usage =
7540 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07007541 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007542 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7543 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007544
Karl Schultz6addd812016-02-02 17:17:23 -07007545 VkMemoryRequirements memReqs;
7546 VkDeviceMemory imageMem;
7547 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007548 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007549 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7550 memAlloc.pNext = NULL;
7551 memAlloc.allocationSize = 0;
7552 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007553 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
7554 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007555 pass =
7556 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007557 ASSERT_TRUE(pass);
7558 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
7559 ASSERT_VK_SUCCESS(err);
7560 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
7561 ASSERT_VK_SUCCESS(err);
7562
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007563 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007564 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
7565 image_view_create_info.image = image;
7566 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7567 image_view_create_info.format = tex_format;
7568 image_view_create_info.subresourceRange.layerCount = 1;
7569 image_view_create_info.subresourceRange.baseMipLevel = 0;
7570 image_view_create_info.subresourceRange.levelCount = 1;
7571 image_view_create_info.subresourceRange.aspectMask =
7572 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007573
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007574 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007575 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7576 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007577 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007578 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007579 imageInfo[0].imageView = view;
7580 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
7581 imageInfo[1].imageView = view;
7582 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007583 imageInfo[2].imageView = view;
7584 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
7585 imageInfo[3].imageView = view;
7586 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007587
7588 static const uint32_t NUM_SET_UPDATES = 3;
7589 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
7590 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7591 descriptor_write[0].dstSet = descriptorSet[0];
7592 descriptor_write[0].dstBinding = 0;
7593 descriptor_write[0].descriptorCount = 5;
7594 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7595 descriptor_write[0].pBufferInfo = buffInfo;
7596 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7597 descriptor_write[1].dstSet = descriptorSet[1];
7598 descriptor_write[1].dstBinding = 0;
7599 descriptor_write[1].descriptorCount = 2;
7600 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7601 descriptor_write[1].pImageInfo = imageInfo;
7602 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7603 descriptor_write[2].dstSet = descriptorSet[1];
7604 descriptor_write[2].dstBinding = 1;
7605 descriptor_write[2].descriptorCount = 2;
7606 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007607 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007608
7609 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007610
Tobin Ehlis88452832015-12-03 09:40:56 -07007611 // Create PSO to be used for draw-time errors below
7612 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007613 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007614 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007615 "out gl_PerVertex {\n"
7616 " vec4 gl_Position;\n"
7617 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007618 "void main(){\n"
7619 " gl_Position = vec4(1);\n"
7620 "}\n";
7621 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007622 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007623 "\n"
7624 "layout(location=0) out vec4 x;\n"
7625 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7626 "void main(){\n"
7627 " x = vec4(bar.y);\n"
7628 "}\n";
7629 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7630 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007631 VkPipelineObj pipe(m_device);
7632 pipe.AddShader(&vs);
7633 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007634 pipe.AddColorAttachment();
7635 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007636
7637 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07007638
Karl Schultz6addd812016-02-02 17:17:23 -07007639 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7640 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7641 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7642 // of PSO
7643 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7644 // cmd_pipeline.c
7645 // due to the fact that cmd_alloc_dset_data() has not been called in
7646 // cmd_bind_graphics_pipeline()
7647 // TODO : Want to cause various binding incompatibility issues here to test
7648 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007649 // First cause various verify_layout_compatibility() fails
7650 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007651 // verify_set_layout_compatibility fail cases:
7652 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07007653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis10fad692016-07-07 12:00:36 -06007654 "Invalid VkPipelineLayout Object ");
Karl Schultz6addd812016-02-02 17:17:23 -07007655 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7656 VK_PIPELINE_BIND_POINT_GRAPHICS,
7657 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
7658 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007659 m_errorMonitor->VerifyFound();
7660
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007661 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07007662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7663 " attempting to bind set to index 1");
7664 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7665 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
7666 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007667 m_errorMonitor->VerifyFound();
7668
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007669 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007670 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7671 // descriptors
7672 m_errorMonitor->SetDesiredFailureMsg(
7673 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06007674 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07007675 vkCmdBindDescriptorSets(
7676 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7677 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007678 m_errorMonitor->VerifyFound();
7679
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007680 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7681 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07007682 m_errorMonitor->SetDesiredFailureMsg(
7683 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06007684 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07007685 vkCmdBindDescriptorSets(
7686 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7687 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007688 m_errorMonitor->VerifyFound();
7689
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007690 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7691 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07007692 m_errorMonitor->SetDesiredFailureMsg(
7693 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06007694 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07007695 vkCmdBindDescriptorSets(
7696 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7697 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007698 m_errorMonitor->VerifyFound();
7699
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007700 // Cause INFO messages due to disturbing previously bound Sets
7701 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07007702 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7703 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7704 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007705 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07007706 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007707 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007708 " previously bound as set #0 was disturbed ");
7709 vkCmdBindDescriptorSets(
7710 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7711 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007712 m_errorMonitor->VerifyFound();
7713
Karl Schultz6addd812016-02-02 17:17:23 -07007714 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7715 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7716 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007717 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007719 " newly bound as set #0 so set #1 and "
7720 "any subsequent sets were disturbed ");
7721 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7722 VK_PIPELINE_BIND_POINT_GRAPHICS,
7723 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007724 m_errorMonitor->VerifyFound();
7725
Tobin Ehlis10fad692016-07-07 12:00:36 -06007726 // Now that we're done actively using the pipelineLayout that gfx pipeline
7727 // was created with, we should be able to delete it. Do that now to verify
7728 // that validation obeys pipelineLayout lifetime
7729 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7730
Tobin Ehlis88452832015-12-03 09:40:56 -07007731 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007732 // 1. Error due to not binding required set (we actually use same code as
7733 // above to disturb set0)
7734 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7735 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7736 2, &descriptorSet[0], 0, NULL);
7737 vkCmdBindDescriptorSets(
7738 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7739 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
7740 m_errorMonitor->SetDesiredFailureMsg(
7741 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7742 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07007743 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007744 m_errorMonitor->VerifyFound();
7745
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007746 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007747 // 2. Error due to bound set not being compatible with PSO's
7748 // VkPipelineLayout (diff stageFlags in this case)
7749 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7750 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7751 2, &descriptorSet[0], 0, NULL);
7752 m_errorMonitor->SetDesiredFailureMsg(
7753 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7754 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007755 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007756 m_errorMonitor->VerifyFound();
7757
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007758 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007759 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007760 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7761 }
7762 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06007763 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
7764 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007765 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007766 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7767 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007768 vkFreeMemory(m_device->device(), imageMem, NULL);
7769 vkDestroyImage(m_device->device(), image, NULL);
7770 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007771}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007772
Karl Schultz6addd812016-02-02 17:17:23 -07007773TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007774
Karl Schultz6addd812016-02-02 17:17:23 -07007775 m_errorMonitor->SetDesiredFailureMsg(
7776 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007777 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007778
7779 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007780 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007781 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007782 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007783
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007784 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007785}
7786
Karl Schultz6addd812016-02-02 17:17:23 -07007787TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7788 VkResult err;
7789 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007790
Karl Schultz6addd812016-02-02 17:17:23 -07007791 m_errorMonitor->SetDesiredFailureMsg(
7792 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07007793 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007794
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007795 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007796
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007797 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007798 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007799 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007800 cmd.commandPool = m_commandPool;
7801 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007802 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007803
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007804 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007805 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007806
7807 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007808 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007809 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007810 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007811 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007812 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
7813 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007814 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007815
7816 // The error should be caught by validation of the BeginCommandBuffer call
7817 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7818
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007819 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007820 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007821}
7822
Karl Schultz6addd812016-02-02 17:17:23 -07007823TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007824 // Cause error due to Begin while recording CB
7825 // Then cause 2 errors for attempting to reset CB w/o having
7826 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7827 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007829 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007830
7831 ASSERT_NO_FATAL_FAILURE(InitState());
7832
7833 // Calls AllocateCommandBuffers
7834 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7835
Karl Schultz6addd812016-02-02 17:17:23 -07007836 // Force the failure by setting the Renderpass and Framebuffer fields with
7837 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007838 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007839 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007840 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7841 cmd_buf_info.pNext = NULL;
7842 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007843 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007844
7845 // Begin CB to transition to recording state
7846 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7847 // Can't re-begin. This should trigger error
7848 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007849 m_errorMonitor->VerifyFound();
7850
Karl Schultz6addd812016-02-02 17:17:23 -07007851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7852 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007853 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
7854 // Reset attempt will trigger error due to incorrect CommandPool state
7855 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007856 m_errorMonitor->VerifyFound();
7857
Karl Schultz6addd812016-02-02 17:17:23 -07007858 m_errorMonitor->SetDesiredFailureMsg(
7859 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7860 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007861 // Transition CB to RECORDED state
7862 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7863 // Now attempting to Begin will implicitly reset, which triggers error
7864 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007865 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007866}
7867
Karl Schultz6addd812016-02-02 17:17:23 -07007868TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007869 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007870 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007871
Karl Schultz6addd812016-02-02 17:17:23 -07007872 m_errorMonitor->SetDesiredFailureMsg(
7873 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007874 "Invalid Pipeline CreateInfo State: Vtx Shader required");
7875
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007876 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007877 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007878
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007879 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007880 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7881 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007882
7883 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007884 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7885 ds_pool_ci.pNext = NULL;
7886 ds_pool_ci.maxSets = 1;
7887 ds_pool_ci.poolSizeCount = 1;
7888 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007889
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007890 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007891 err =
7892 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007893 ASSERT_VK_SUCCESS(err);
7894
Tony Barboureb254902015-07-15 12:50:33 -06007895 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007896 dsl_binding.binding = 0;
7897 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7898 dsl_binding.descriptorCount = 1;
7899 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7900 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007901
Tony Barboureb254902015-07-15 12:50:33 -06007902 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007903 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7904 ds_layout_ci.pNext = NULL;
7905 ds_layout_ci.bindingCount = 1;
7906 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007907
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007908 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007909 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7910 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007911 ASSERT_VK_SUCCESS(err);
7912
7913 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007914 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007915 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007916 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007917 alloc_info.descriptorPool = ds_pool;
7918 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007919 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7920 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007921 ASSERT_VK_SUCCESS(err);
7922
Tony Barboureb254902015-07-15 12:50:33 -06007923 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007924 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7925 pipeline_layout_ci.setLayoutCount = 1;
7926 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007927
7928 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007929 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7930 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007931 ASSERT_VK_SUCCESS(err);
7932
Tobin Ehlise68360f2015-10-01 11:15:13 -06007933 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07007934 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007935
7936 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007937 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7938 vp_state_ci.scissorCount = 1;
7939 vp_state_ci.pScissors = &sc;
7940 vp_state_ci.viewportCount = 1;
7941 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007942
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007943 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7944 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7945 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7946 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7947 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7948 rs_state_ci.depthClampEnable = VK_FALSE;
7949 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7950 rs_state_ci.depthBiasEnable = VK_FALSE;
7951
Tony Barboureb254902015-07-15 12:50:33 -06007952 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007953 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7954 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007955 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007956 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7957 gp_ci.layout = pipeline_layout;
7958 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06007959
7960 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007961 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7962 pc_ci.initialDataSize = 0;
7963 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007964
7965 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007966 VkPipelineCache pipelineCache;
7967
Karl Schultz6addd812016-02-02 17:17:23 -07007968 err =
7969 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007970 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007971 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7972 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007973
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007974 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007975
Chia-I Wuf7458c52015-10-26 21:10:41 +08007976 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7977 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7978 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7979 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007980}
Tobin Ehlis912df022015-09-17 08:46:18 -06007981/*// TODO : This test should be good, but needs Tess support in compiler to run
7982TEST_F(VkLayerTest, InvalidPatchControlPoints)
7983{
7984 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007985 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007986
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007988 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7989primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007990
Tobin Ehlis912df022015-09-17 08:46:18 -06007991 ASSERT_NO_FATAL_FAILURE(InitState());
7992 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007993
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007994 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007995 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007996 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007997
7998 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7999 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8000 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008001 ds_pool_ci.poolSizeCount = 1;
8002 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06008003
8004 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008005 err = vkCreateDescriptorPool(m_device->device(),
8006VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06008007 ASSERT_VK_SUCCESS(err);
8008
8009 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08008010 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06008011 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08008012 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008013 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8014 dsl_binding.pImmutableSamplers = NULL;
8015
8016 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008017 ds_layout_ci.sType =
8018VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008019 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008020 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008021 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06008022
8023 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008024 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8025&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008026 ASSERT_VK_SUCCESS(err);
8027
8028 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07008029 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
8030VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06008031 ASSERT_VK_SUCCESS(err);
8032
8033 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008034 pipeline_layout_ci.sType =
8035VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008036 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008037 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008038 pipeline_layout_ci.pSetLayouts = &ds_layout;
8039
8040 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008041 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8042&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008043 ASSERT_VK_SUCCESS(err);
8044
8045 VkPipelineShaderStageCreateInfo shaderStages[3];
8046 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
8047
Karl Schultz6addd812016-02-02 17:17:23 -07008048 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
8049this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008050 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07008051 VkShaderObj
8052tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
8053this);
8054 VkShaderObj
8055te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
8056this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008057
Karl Schultz6addd812016-02-02 17:17:23 -07008058 shaderStages[0].sType =
8059VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008060 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008061 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008062 shaderStages[1].sType =
8063VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008064 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008065 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008066 shaderStages[2].sType =
8067VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008068 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008069 shaderStages[2].shader = te.handle();
8070
8071 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008072 iaCI.sType =
8073VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08008074 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06008075
8076 VkPipelineTessellationStateCreateInfo tsCI = {};
8077 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
8078 tsCI.patchControlPoints = 0; // This will cause an error
8079
8080 VkGraphicsPipelineCreateInfo gp_ci = {};
8081 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8082 gp_ci.pNext = NULL;
8083 gp_ci.stageCount = 3;
8084 gp_ci.pStages = shaderStages;
8085 gp_ci.pVertexInputState = NULL;
8086 gp_ci.pInputAssemblyState = &iaCI;
8087 gp_ci.pTessellationState = &tsCI;
8088 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008089 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06008090 gp_ci.pMultisampleState = NULL;
8091 gp_ci.pDepthStencilState = NULL;
8092 gp_ci.pColorBlendState = NULL;
8093 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8094 gp_ci.layout = pipeline_layout;
8095 gp_ci.renderPass = renderPass();
8096
8097 VkPipelineCacheCreateInfo pc_ci = {};
8098 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8099 pc_ci.pNext = NULL;
8100 pc_ci.initialSize = 0;
8101 pc_ci.initialData = 0;
8102 pc_ci.maxSize = 0;
8103
8104 VkPipeline pipeline;
8105 VkPipelineCache pipelineCache;
8106
Karl Schultz6addd812016-02-02 17:17:23 -07008107 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
8108&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06008109 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008110 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8111&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06008112
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008113 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008114
Chia-I Wuf7458c52015-10-26 21:10:41 +08008115 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8116 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8117 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8118 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06008119}
8120*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06008121// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07008122TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008123 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008124
Karl Schultz6addd812016-02-02 17:17:23 -07008125 m_errorMonitor->SetDesiredFailureMsg(
8126 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008127 "Gfx Pipeline viewport count (1) must match scissor count (0).");
8128
Tobin Ehlise68360f2015-10-01 11:15:13 -06008129 ASSERT_NO_FATAL_FAILURE(InitState());
8130 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008131
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008132 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008133 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8134 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008135
8136 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008137 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8138 ds_pool_ci.maxSets = 1;
8139 ds_pool_ci.poolSizeCount = 1;
8140 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008141
8142 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008143 err =
8144 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008145 ASSERT_VK_SUCCESS(err);
8146
8147 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008148 dsl_binding.binding = 0;
8149 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8150 dsl_binding.descriptorCount = 1;
8151 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008152
8153 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008154 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8155 ds_layout_ci.bindingCount = 1;
8156 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008157
8158 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008159 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8160 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008161 ASSERT_VK_SUCCESS(err);
8162
8163 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008164 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008165 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008166 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008167 alloc_info.descriptorPool = ds_pool;
8168 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008169 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8170 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008171 ASSERT_VK_SUCCESS(err);
8172
8173 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008174 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8175 pipeline_layout_ci.setLayoutCount = 1;
8176 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008177
8178 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008179 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8180 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008181 ASSERT_VK_SUCCESS(err);
8182
8183 VkViewport vp = {}; // Just need dummy vp to point to
8184
8185 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008186 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8187 vp_state_ci.scissorCount = 0;
8188 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
8189 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008190
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008191 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8192 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8193 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8194 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8195 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8196 rs_state_ci.depthClampEnable = VK_FALSE;
8197 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8198 rs_state_ci.depthBiasEnable = VK_FALSE;
8199
Cody Northropeb3a6c12015-10-05 14:44:45 -06008200 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008201 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008202
Karl Schultz6addd812016-02-02 17:17:23 -07008203 VkShaderObj vs(m_device, bindStateVertShaderText,
8204 VK_SHADER_STAGE_VERTEX_BIT, this);
8205 VkShaderObj fs(m_device, bindStateFragShaderText,
8206 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008207 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008208 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008209 shaderStages[0] = vs.GetStageCreateInfo();
8210 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008211
8212 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008213 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8214 gp_ci.stageCount = 2;
8215 gp_ci.pStages = shaderStages;
8216 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008217 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008218 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8219 gp_ci.layout = pipeline_layout;
8220 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008221
8222 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008223 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008224
8225 VkPipeline pipeline;
8226 VkPipelineCache pipelineCache;
8227
Karl Schultz6addd812016-02-02 17:17:23 -07008228 err =
8229 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008230 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008231 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8232 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008233
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008234 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008235
Chia-I Wuf7458c52015-10-26 21:10:41 +08008236 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8237 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8238 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8239 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008240}
Karl Schultz6addd812016-02-02 17:17:23 -07008241// Don't set viewport state in PSO. This is an error b/c we always need this
8242// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06008243// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008244TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06008245 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008246 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008247
Karl Schultz6addd812016-02-02 17:17:23 -07008248 m_errorMonitor->SetDesiredFailureMsg(
8249 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008250 "Gfx Pipeline pViewportState is null. Even if ");
8251
Tobin Ehlise68360f2015-10-01 11:15:13 -06008252 ASSERT_NO_FATAL_FAILURE(InitState());
8253 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008254
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008255 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008256 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8257 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008258
8259 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008260 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8261 ds_pool_ci.maxSets = 1;
8262 ds_pool_ci.poolSizeCount = 1;
8263 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008264
8265 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008266 err =
8267 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008268 ASSERT_VK_SUCCESS(err);
8269
8270 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008271 dsl_binding.binding = 0;
8272 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8273 dsl_binding.descriptorCount = 1;
8274 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008275
8276 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008277 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8278 ds_layout_ci.bindingCount = 1;
8279 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008280
8281 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008282 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8283 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008284 ASSERT_VK_SUCCESS(err);
8285
8286 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008287 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008288 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008289 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008290 alloc_info.descriptorPool = ds_pool;
8291 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008292 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8293 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008294 ASSERT_VK_SUCCESS(err);
8295
8296 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008297 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8298 pipeline_layout_ci.setLayoutCount = 1;
8299 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008300
8301 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008302 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8303 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008304 ASSERT_VK_SUCCESS(err);
8305
8306 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8307 // Set scissor as dynamic to avoid second error
8308 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008309 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8310 dyn_state_ci.dynamicStateCount = 1;
8311 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008312
Cody Northropeb3a6c12015-10-05 14:44:45 -06008313 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008314 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008315
Karl Schultz6addd812016-02-02 17:17:23 -07008316 VkShaderObj vs(m_device, bindStateVertShaderText,
8317 VK_SHADER_STAGE_VERTEX_BIT, this);
8318 VkShaderObj fs(m_device, bindStateFragShaderText,
8319 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008320 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008321 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008322 shaderStages[0] = vs.GetStageCreateInfo();
8323 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008324
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008325
8326 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8327 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8328 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8329 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8330 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8331 rs_state_ci.depthClampEnable = VK_FALSE;
8332 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8333 rs_state_ci.depthBiasEnable = VK_FALSE;
8334
Tobin Ehlise68360f2015-10-01 11:15:13 -06008335 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008336 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8337 gp_ci.stageCount = 2;
8338 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008339 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008340 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
8341 // should cause validation error
8342 gp_ci.pDynamicState = &dyn_state_ci;
8343 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8344 gp_ci.layout = pipeline_layout;
8345 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008346
8347 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008348 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008349
8350 VkPipeline pipeline;
8351 VkPipelineCache pipelineCache;
8352
Karl Schultz6addd812016-02-02 17:17:23 -07008353 err =
8354 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008355 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008356 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8357 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008358
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008359 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008360
Chia-I Wuf7458c52015-10-26 21:10:41 +08008361 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8362 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8363 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8364 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008365}
8366// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07008367// Then run second test where dynamic scissor count doesn't match PSO scissor
8368// count
8369TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8370 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008371
Karl Schultz6addd812016-02-02 17:17:23 -07008372 m_errorMonitor->SetDesiredFailureMsg(
8373 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008374 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
8375
Tobin Ehlise68360f2015-10-01 11:15:13 -06008376 ASSERT_NO_FATAL_FAILURE(InitState());
8377 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008378
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008379 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008380 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8381 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008382
8383 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008384 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8385 ds_pool_ci.maxSets = 1;
8386 ds_pool_ci.poolSizeCount = 1;
8387 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008388
8389 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008390 err =
8391 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008392 ASSERT_VK_SUCCESS(err);
8393
8394 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008395 dsl_binding.binding = 0;
8396 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8397 dsl_binding.descriptorCount = 1;
8398 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008399
8400 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008401 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8402 ds_layout_ci.bindingCount = 1;
8403 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008404
8405 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008406 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8407 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008408 ASSERT_VK_SUCCESS(err);
8409
8410 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008411 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008412 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008413 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008414 alloc_info.descriptorPool = ds_pool;
8415 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008416 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8417 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008418 ASSERT_VK_SUCCESS(err);
8419
8420 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008421 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8422 pipeline_layout_ci.setLayoutCount = 1;
8423 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008424
8425 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008426 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8427 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008428 ASSERT_VK_SUCCESS(err);
8429
8430 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008431 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8432 vp_state_ci.viewportCount = 1;
8433 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
8434 vp_state_ci.scissorCount = 1;
8435 vp_state_ci.pScissors =
8436 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008437
8438 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8439 // Set scissor as dynamic to avoid that error
8440 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008441 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8442 dyn_state_ci.dynamicStateCount = 1;
8443 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008444
Cody Northropeb3a6c12015-10-05 14:44:45 -06008445 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008446 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008447
Karl Schultz6addd812016-02-02 17:17:23 -07008448 VkShaderObj vs(m_device, bindStateVertShaderText,
8449 VK_SHADER_STAGE_VERTEX_BIT, this);
8450 VkShaderObj fs(m_device, bindStateFragShaderText,
8451 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008452 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008453 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008454 shaderStages[0] = vs.GetStageCreateInfo();
8455 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008456
Cody Northropf6622dc2015-10-06 10:33:21 -06008457 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8458 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8459 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008460 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008461 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008462 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008463 vi_ci.pVertexAttributeDescriptions = nullptr;
8464
8465 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8466 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8467 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8468
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008469 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008470 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06008471 rs_ci.pNext = nullptr;
8472
Mark Youngc89c6312016-03-31 16:03:20 -06008473 VkPipelineColorBlendAttachmentState att = {};
8474 att.blendEnable = VK_FALSE;
8475 att.colorWriteMask = 0xf;
8476
Cody Northropf6622dc2015-10-06 10:33:21 -06008477 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8478 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8479 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008480 cb_ci.attachmentCount = 1;
8481 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008482
Tobin Ehlise68360f2015-10-01 11:15:13 -06008483 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008484 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8485 gp_ci.stageCount = 2;
8486 gp_ci.pStages = shaderStages;
8487 gp_ci.pVertexInputState = &vi_ci;
8488 gp_ci.pInputAssemblyState = &ia_ci;
8489 gp_ci.pViewportState = &vp_state_ci;
8490 gp_ci.pRasterizationState = &rs_ci;
8491 gp_ci.pColorBlendState = &cb_ci;
8492 gp_ci.pDynamicState = &dyn_state_ci;
8493 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8494 gp_ci.layout = pipeline_layout;
8495 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008496
8497 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008498 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008499
8500 VkPipeline pipeline;
8501 VkPipelineCache pipelineCache;
8502
Karl Schultz6addd812016-02-02 17:17:23 -07008503 err =
8504 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008505 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008506 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8507 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008508
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008509 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008510
Tobin Ehlisd332f282015-10-02 11:00:56 -06008511 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008512 // First need to successfully create the PSO from above by setting
8513 // pViewports
8514 m_errorMonitor->SetDesiredFailureMsg(
8515 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8516 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
8517 "scissorCount is 1. These counts must match.");
8518
8519 VkViewport vp = {}; // Just need dummy vp to point to
8520 vp_state_ci.pViewports = &vp;
8521 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8522 &gp_ci, NULL, &pipeline);
8523 ASSERT_VK_SUCCESS(err);
8524 BeginCommandBuffer();
8525 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8526 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
8527 VkRect2D scissors[2] = {}; // don't care about data
8528 // Count of 2 doesn't match PSO count of 1
8529 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
8530 Draw(1, 0, 0, 0);
8531
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008532 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008533
8534 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8535 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8536 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8537 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008538 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008539}
8540// Create PSO w/o non-zero scissorCount but no scissor data
8541// Then run second test where dynamic viewportCount doesn't match PSO
8542// viewportCount
8543TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8544 VkResult err;
8545
8546 m_errorMonitor->SetDesiredFailureMsg(
8547 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8548 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
8549
8550 ASSERT_NO_FATAL_FAILURE(InitState());
8551 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8552
8553 VkDescriptorPoolSize ds_type_count = {};
8554 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8555 ds_type_count.descriptorCount = 1;
8556
8557 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8558 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8559 ds_pool_ci.maxSets = 1;
8560 ds_pool_ci.poolSizeCount = 1;
8561 ds_pool_ci.pPoolSizes = &ds_type_count;
8562
8563 VkDescriptorPool ds_pool;
8564 err =
8565 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
8566 ASSERT_VK_SUCCESS(err);
8567
8568 VkDescriptorSetLayoutBinding dsl_binding = {};
8569 dsl_binding.binding = 0;
8570 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8571 dsl_binding.descriptorCount = 1;
8572 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8573
8574 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8575 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8576 ds_layout_ci.bindingCount = 1;
8577 ds_layout_ci.pBindings = &dsl_binding;
8578
8579 VkDescriptorSetLayout ds_layout;
8580 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8581 &ds_layout);
8582 ASSERT_VK_SUCCESS(err);
8583
8584 VkDescriptorSet descriptorSet;
8585 VkDescriptorSetAllocateInfo alloc_info = {};
8586 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8587 alloc_info.descriptorSetCount = 1;
8588 alloc_info.descriptorPool = ds_pool;
8589 alloc_info.pSetLayouts = &ds_layout;
8590 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8591 &descriptorSet);
8592 ASSERT_VK_SUCCESS(err);
8593
8594 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8595 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8596 pipeline_layout_ci.setLayoutCount = 1;
8597 pipeline_layout_ci.pSetLayouts = &ds_layout;
8598
8599 VkPipelineLayout pipeline_layout;
8600 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8601 &pipeline_layout);
8602 ASSERT_VK_SUCCESS(err);
8603
8604 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8605 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8606 vp_state_ci.scissorCount = 1;
8607 vp_state_ci.pScissors =
8608 NULL; // Null scissor w/ count of 1 should cause error
8609 vp_state_ci.viewportCount = 1;
8610 vp_state_ci.pViewports =
8611 NULL; // vp is dynamic (below) so this won't cause error
8612
8613 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8614 // Set scissor as dynamic to avoid that error
8615 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8616 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8617 dyn_state_ci.dynamicStateCount = 1;
8618 dyn_state_ci.pDynamicStates = &vp_state;
8619
8620 VkPipelineShaderStageCreateInfo shaderStages[2];
8621 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8622
8623 VkShaderObj vs(m_device, bindStateVertShaderText,
8624 VK_SHADER_STAGE_VERTEX_BIT, this);
8625 VkShaderObj fs(m_device, bindStateFragShaderText,
8626 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008627 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008628 // but add it to be able to run on more devices
8629 shaderStages[0] = vs.GetStageCreateInfo();
8630 shaderStages[1] = fs.GetStageCreateInfo();
8631
8632 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8633 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8634 vi_ci.pNext = nullptr;
8635 vi_ci.vertexBindingDescriptionCount = 0;
8636 vi_ci.pVertexBindingDescriptions = nullptr;
8637 vi_ci.vertexAttributeDescriptionCount = 0;
8638 vi_ci.pVertexAttributeDescriptions = nullptr;
8639
8640 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8641 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8642 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8643
8644 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8645 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8646 rs_ci.pNext = nullptr;
8647
Mark Youngc89c6312016-03-31 16:03:20 -06008648 VkPipelineColorBlendAttachmentState att = {};
8649 att.blendEnable = VK_FALSE;
8650 att.colorWriteMask = 0xf;
8651
Karl Schultz6addd812016-02-02 17:17:23 -07008652 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8653 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8654 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008655 cb_ci.attachmentCount = 1;
8656 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008657
8658 VkGraphicsPipelineCreateInfo gp_ci = {};
8659 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8660 gp_ci.stageCount = 2;
8661 gp_ci.pStages = shaderStages;
8662 gp_ci.pVertexInputState = &vi_ci;
8663 gp_ci.pInputAssemblyState = &ia_ci;
8664 gp_ci.pViewportState = &vp_state_ci;
8665 gp_ci.pRasterizationState = &rs_ci;
8666 gp_ci.pColorBlendState = &cb_ci;
8667 gp_ci.pDynamicState = &dyn_state_ci;
8668 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8669 gp_ci.layout = pipeline_layout;
8670 gp_ci.renderPass = renderPass();
8671
8672 VkPipelineCacheCreateInfo pc_ci = {};
8673 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8674
8675 VkPipeline pipeline;
8676 VkPipelineCache pipelineCache;
8677
8678 err =
8679 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
8680 ASSERT_VK_SUCCESS(err);
8681 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8682 &gp_ci, NULL, &pipeline);
8683
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008684 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008685
8686 // Now hit second fail case where we set scissor w/ different count than PSO
8687 // First need to successfully create the PSO from above by setting
8688 // pViewports
8689 m_errorMonitor->SetDesiredFailureMsg(
8690 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8691 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
8692 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008693
Tobin Ehlisd332f282015-10-02 11:00:56 -06008694 VkRect2D sc = {}; // Just need dummy vp to point to
8695 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07008696 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8697 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008698 ASSERT_VK_SUCCESS(err);
8699 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008700 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8701 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008702 VkViewport viewports[2] = {}; // don't care about data
8703 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07008704 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008705 Draw(1, 0, 0, 0);
8706
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008707 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008708
Chia-I Wuf7458c52015-10-26 21:10:41 +08008709 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8710 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8711 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8712 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008713 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008714}
8715
Mark Young7394fdd2016-03-31 14:56:43 -06008716TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8717 VkResult err;
8718
8719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06008720 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008721
8722 ASSERT_NO_FATAL_FAILURE(InitState());
8723 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8724
8725 VkDescriptorPoolSize ds_type_count = {};
8726 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8727 ds_type_count.descriptorCount = 1;
8728
8729 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8730 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8731 ds_pool_ci.maxSets = 1;
8732 ds_pool_ci.poolSizeCount = 1;
8733 ds_pool_ci.pPoolSizes = &ds_type_count;
8734
8735 VkDescriptorPool ds_pool;
8736 err =
8737 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
8738 ASSERT_VK_SUCCESS(err);
8739
8740 VkDescriptorSetLayoutBinding dsl_binding = {};
8741 dsl_binding.binding = 0;
8742 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8743 dsl_binding.descriptorCount = 1;
8744 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8745
8746 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8747 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8748 ds_layout_ci.bindingCount = 1;
8749 ds_layout_ci.pBindings = &dsl_binding;
8750
8751 VkDescriptorSetLayout ds_layout;
8752 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8753 &ds_layout);
8754 ASSERT_VK_SUCCESS(err);
8755
8756 VkDescriptorSet descriptorSet;
8757 VkDescriptorSetAllocateInfo alloc_info = {};
8758 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8759 alloc_info.descriptorSetCount = 1;
8760 alloc_info.descriptorPool = ds_pool;
8761 alloc_info.pSetLayouts = &ds_layout;
8762 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8763 &descriptorSet);
8764 ASSERT_VK_SUCCESS(err);
8765
8766 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8767 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8768 pipeline_layout_ci.setLayoutCount = 1;
8769 pipeline_layout_ci.pSetLayouts = &ds_layout;
8770
8771 VkPipelineLayout pipeline_layout;
8772 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8773 &pipeline_layout);
8774 ASSERT_VK_SUCCESS(err);
8775
8776 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8777 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8778 vp_state_ci.scissorCount = 1;
8779 vp_state_ci.pScissors = NULL;
8780 vp_state_ci.viewportCount = 1;
8781 vp_state_ci.pViewports = NULL;
8782
8783 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
8784 VK_DYNAMIC_STATE_SCISSOR,
8785 VK_DYNAMIC_STATE_LINE_WIDTH};
8786 // Set scissor as dynamic to avoid that error
8787 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8788 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8789 dyn_state_ci.dynamicStateCount = 2;
8790 dyn_state_ci.pDynamicStates = dynamic_states;
8791
8792 VkPipelineShaderStageCreateInfo shaderStages[2];
8793 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8794
8795 VkShaderObj vs(m_device, bindStateVertShaderText,
8796 VK_SHADER_STAGE_VERTEX_BIT, this);
8797 VkShaderObj fs(m_device, bindStateFragShaderText,
8798 VK_SHADER_STAGE_FRAGMENT_BIT,
8799 this); // TODO - We shouldn't need a fragment shader
8800 // but add it to be able to run on more devices
8801 shaderStages[0] = vs.GetStageCreateInfo();
8802 shaderStages[1] = fs.GetStageCreateInfo();
8803
8804 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8805 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8806 vi_ci.pNext = nullptr;
8807 vi_ci.vertexBindingDescriptionCount = 0;
8808 vi_ci.pVertexBindingDescriptions = nullptr;
8809 vi_ci.vertexAttributeDescriptionCount = 0;
8810 vi_ci.pVertexAttributeDescriptions = nullptr;
8811
8812 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8813 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8814 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8815
8816 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8817 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8818 rs_ci.pNext = nullptr;
8819
Mark Young47107952016-05-02 15:59:55 -06008820 // Check too low (line width of -1.0f).
8821 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008822
8823 VkPipelineColorBlendAttachmentState att = {};
8824 att.blendEnable = VK_FALSE;
8825 att.colorWriteMask = 0xf;
8826
8827 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8828 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8829 cb_ci.pNext = nullptr;
8830 cb_ci.attachmentCount = 1;
8831 cb_ci.pAttachments = &att;
8832
8833 VkGraphicsPipelineCreateInfo gp_ci = {};
8834 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8835 gp_ci.stageCount = 2;
8836 gp_ci.pStages = shaderStages;
8837 gp_ci.pVertexInputState = &vi_ci;
8838 gp_ci.pInputAssemblyState = &ia_ci;
8839 gp_ci.pViewportState = &vp_state_ci;
8840 gp_ci.pRasterizationState = &rs_ci;
8841 gp_ci.pColorBlendState = &cb_ci;
8842 gp_ci.pDynamicState = &dyn_state_ci;
8843 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8844 gp_ci.layout = pipeline_layout;
8845 gp_ci.renderPass = renderPass();
8846
8847 VkPipelineCacheCreateInfo pc_ci = {};
8848 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8849
8850 VkPipeline pipeline;
8851 VkPipelineCache pipelineCache;
8852
8853 err =
8854 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
8855 ASSERT_VK_SUCCESS(err);
8856 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8857 &gp_ci, NULL, &pipeline);
8858
8859 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008860 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008861
8862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8863 "Attempt to set lineWidth to 65536");
8864
8865 // Check too high (line width of 65536.0f).
8866 rs_ci.lineWidth = 65536.0f;
8867
8868 err =
8869 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
8870 ASSERT_VK_SUCCESS(err);
8871 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8872 &gp_ci, NULL, &pipeline);
8873
8874 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008875 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008876
8877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06008878 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008879
8880 dyn_state_ci.dynamicStateCount = 3;
8881
8882 rs_ci.lineWidth = 1.0f;
8883
8884 err =
8885 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
8886 ASSERT_VK_SUCCESS(err);
8887 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8888 &gp_ci, NULL, &pipeline);
8889 BeginCommandBuffer();
8890 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8891 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
8892
8893 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008894 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008895 m_errorMonitor->VerifyFound();
8896
8897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8898 "Attempt to set lineWidth to 65536");
8899
8900 // Check too high with dynamic setting.
8901 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8902 m_errorMonitor->VerifyFound();
8903 EndCommandBuffer();
8904
8905 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8906 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8907 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8908 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008909 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008910}
8911
Karl Schultz6addd812016-02-02 17:17:23 -07008912TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008913 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008914 m_errorMonitor->SetDesiredFailureMsg(
8915 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008916 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008917
8918 ASSERT_NO_FATAL_FAILURE(InitState());
8919 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008920
Tony Barbourfe3351b2015-07-28 10:17:20 -06008921 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008922 // Don't care about RenderPass handle b/c error should be flagged before
8923 // that
8924 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
8925 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008926
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008927 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008928}
8929
Karl Schultz6addd812016-02-02 17:17:23 -07008930TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008931 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008932 m_errorMonitor->SetDesiredFailureMsg(
8933 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008934 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008935
8936 ASSERT_NO_FATAL_FAILURE(InitState());
8937 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008938
Tony Barbourfe3351b2015-07-28 10:17:20 -06008939 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008940 // Just create a dummy Renderpass that's non-NULL so we can get to the
8941 // proper error
Chris Forbes38ae7c42016-06-21 20:51:44 +12008942 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
Karl Schultz6addd812016-02-02 17:17:23 -07008943 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008944
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008945 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008946}
8947
Chris Forbes2eeabe32016-06-21 20:52:34 +12008948TEST_F(VkLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
8949 m_errorMonitor->ExpectSuccess();
8950
8951 ASSERT_NO_FATAL_FAILURE(InitState());
8952 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8953
8954 BeginCommandBuffer(); // framework implicitly begins the renderpass.
8955 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // end implicit.
8956
8957 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
8958 VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
8959 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8960 m_errorMonitor->VerifyNotFound();
8961 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
8962 VK_SUBPASS_CONTENTS_INLINE);
8963 m_errorMonitor->VerifyNotFound();
8964 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8965 m_errorMonitor->VerifyNotFound();
8966
8967 m_commandBuffer->EndCommandBuffer();
8968 m_errorMonitor->VerifyNotFound();
8969}
8970
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008971TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
8972 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
8973 "the number of renderPass attachments that use loadOp"
8974 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
8975
8976 ASSERT_NO_FATAL_FAILURE(InitState());
8977 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8978
8979 // Create a renderPass with a single attachment that uses loadOp CLEAR
8980 VkAttachmentReference attach = {};
8981 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8982 VkSubpassDescription subpass = {};
8983 subpass.inputAttachmentCount = 1;
8984 subpass.pInputAttachments = &attach;
8985 VkRenderPassCreateInfo rpci = {};
8986 rpci.subpassCount = 1;
8987 rpci.pSubpasses = &subpass;
8988 rpci.attachmentCount = 1;
8989 VkAttachmentDescription attach_desc = {};
8990 attach_desc.format = VK_FORMAT_UNDEFINED;
8991 // Set loadOp to CLEAR
8992 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8993 rpci.pAttachments = &attach_desc;
8994 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8995 VkRenderPass rp;
8996 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8997
8998 VkCommandBufferInheritanceInfo hinfo = {};
8999 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9000 hinfo.renderPass = VK_NULL_HANDLE;
9001 hinfo.subpass = 0;
9002 hinfo.framebuffer = VK_NULL_HANDLE;
9003 hinfo.occlusionQueryEnable = VK_FALSE;
9004 hinfo.queryFlags = 0;
9005 hinfo.pipelineStatistics = 0;
9006 VkCommandBufferBeginInfo info = {};
9007 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9008 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9009 info.pInheritanceInfo = &hinfo;
9010
9011 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9012 VkRenderPassBeginInfo rp_begin = {};
9013 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9014 rp_begin.pNext = NULL;
9015 rp_begin.renderPass = renderPass();
9016 rp_begin.framebuffer = framebuffer();
9017 rp_begin.clearValueCount = 0; // Should be 1
9018
9019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9020 " has a clearValueCount of 0 but the "
9021 "actual number of attachments in "
9022 "renderPass ");
9023
9024 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
9025 VK_SUBPASS_CONTENTS_INLINE);
9026
9027 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06009028
9029 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009030}
9031
Cody Northrop3bb4d962016-05-09 16:15:57 -06009032TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
9033
9034 TEST_DESCRIPTION("End a command buffer with an active render pass");
9035
9036 m_errorMonitor->SetDesiredFailureMsg(
9037 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9038 "It is invalid to issue this call inside an active render pass");
9039
9040 ASSERT_NO_FATAL_FAILURE(InitState());
9041 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9042
9043 // The framework's BeginCommandBuffer calls CreateRenderPass
9044 BeginCommandBuffer();
9045
9046 // Call directly into vkEndCommandBuffer instead of the
9047 // the framework's EndCommandBuffer, which inserts a
9048 // vkEndRenderPass
9049 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
9050
9051 m_errorMonitor->VerifyFound();
9052
9053 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
9054 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
9055}
9056
Karl Schultz6addd812016-02-02 17:17:23 -07009057TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009058 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009059 m_errorMonitor->SetDesiredFailureMsg(
9060 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009061 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009062
9063 ASSERT_NO_FATAL_FAILURE(InitState());
9064 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009065
9066 // Renderpass is started here
9067 BeginCommandBuffer();
9068
9069 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009070 vk_testing::Buffer dstBuffer;
9071 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009072
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009073 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009074
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009075 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009076}
9077
Karl Schultz6addd812016-02-02 17:17:23 -07009078TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009079 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009080 m_errorMonitor->SetDesiredFailureMsg(
9081 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009082 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009083
9084 ASSERT_NO_FATAL_FAILURE(InitState());
9085 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009086
9087 // Renderpass is started here
9088 BeginCommandBuffer();
9089
9090 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009091 vk_testing::Buffer dstBuffer;
9092 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009093
Karl Schultz6addd812016-02-02 17:17:23 -07009094 VkDeviceSize dstOffset = 0;
9095 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -06009096 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009097
Karl Schultz6addd812016-02-02 17:17:23 -07009098 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
9099 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009100
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009101 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009102}
9103
Karl Schultz6addd812016-02-02 17:17:23 -07009104TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009105 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009106 m_errorMonitor->SetDesiredFailureMsg(
9107 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009108 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009109
9110 ASSERT_NO_FATAL_FAILURE(InitState());
9111 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009112
9113 // Renderpass is started here
9114 BeginCommandBuffer();
9115
Michael Lentine0a369f62016-02-03 16:51:46 -06009116 VkClearColorValue clear_color;
9117 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07009118 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9119 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9120 const int32_t tex_width = 32;
9121 const int32_t tex_height = 32;
9122 VkImageCreateInfo image_create_info = {};
9123 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9124 image_create_info.pNext = NULL;
9125 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9126 image_create_info.format = tex_format;
9127 image_create_info.extent.width = tex_width;
9128 image_create_info.extent.height = tex_height;
9129 image_create_info.extent.depth = 1;
9130 image_create_info.mipLevels = 1;
9131 image_create_info.arrayLayers = 1;
9132 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9133 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9134 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009135
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009136 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07009137 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
9138 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009139
Karl Schultz6addd812016-02-02 17:17:23 -07009140 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
9141 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009142
Karl Schultz6addd812016-02-02 17:17:23 -07009143 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
9144 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009145
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009146 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009147}
9148
Karl Schultz6addd812016-02-02 17:17:23 -07009149TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009150 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009151 m_errorMonitor->SetDesiredFailureMsg(
9152 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009153 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009154
9155 ASSERT_NO_FATAL_FAILURE(InitState());
9156 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009157
9158 // Renderpass is started here
9159 BeginCommandBuffer();
9160
9161 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07009162 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009163 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
9164 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9165 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
9166 image_create_info.extent.width = 64;
9167 image_create_info.extent.height = 64;
9168 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9169 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009170
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009171 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07009172 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
9173 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009174
Karl Schultz6addd812016-02-02 17:17:23 -07009175 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
9176 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009177
Karl Schultz6addd812016-02-02 17:17:23 -07009178 vkCmdClearDepthStencilImage(
9179 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
9180 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
9181 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009182
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009183 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009184}
9185
Karl Schultz6addd812016-02-02 17:17:23 -07009186TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009187 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009188 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009189
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009191 "vkCmdClearAttachments: This call "
9192 "must be issued inside an active "
9193 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009194
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009195 ASSERT_NO_FATAL_FAILURE(InitState());
9196 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009197
9198 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009199 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009200 ASSERT_VK_SUCCESS(err);
9201
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009202 VkClearAttachment color_attachment;
9203 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9204 color_attachment.clearValue.color.float32[0] = 0;
9205 color_attachment.clearValue.color.float32[1] = 0;
9206 color_attachment.clearValue.color.float32[2] = 0;
9207 color_attachment.clearValue.color.float32[3] = 0;
9208 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009209 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
9210 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
9211 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009212
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009213 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009214}
9215
Karl Schultz9e66a292016-04-21 15:57:51 -06009216TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9217 // Try to add a buffer memory barrier with no buffer.
9218 m_errorMonitor->SetDesiredFailureMsg(
9219 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9220 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
9221
9222 ASSERT_NO_FATAL_FAILURE(InitState());
9223 BeginCommandBuffer();
9224
9225 VkBufferMemoryBarrier buf_barrier = {};
9226 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9227 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9228 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9229 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9230 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9231 buf_barrier.buffer = VK_NULL_HANDLE;
9232 buf_barrier.offset = 0;
9233 buf_barrier.size = VK_WHOLE_SIZE;
9234 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9235 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
9236 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
9237
9238 m_errorMonitor->VerifyFound();
9239}
9240
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009241TEST_F(VkLayerTest, InvalidBarriers) {
9242 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9243
9244 m_errorMonitor->SetDesiredFailureMsg(
9245 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
9246
9247 ASSERT_NO_FATAL_FAILURE(InitState());
9248 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9249
9250 VkMemoryBarrier mem_barrier = {};
9251 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9252 mem_barrier.pNext = NULL;
9253 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9254 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9255 BeginCommandBuffer();
9256 // BeginCommandBuffer() starts a render pass
9257 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9258 VK_PIPELINE_STAGE_HOST_BIT,
9259 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
9260 &mem_barrier, 0, nullptr, 0, nullptr);
9261 m_errorMonitor->VerifyFound();
9262
9263 m_errorMonitor->SetDesiredFailureMsg(
9264 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9265 "Image Layout cannot be transitioned to UNDEFINED");
9266 VkImageObj image(m_device);
9267 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9268 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9269 ASSERT_TRUE(image.initialized());
9270 VkImageMemoryBarrier img_barrier = {};
9271 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9272 img_barrier.pNext = NULL;
9273 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9274 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9275 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9276 // New layout can't be UNDEFINED
9277 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9278 img_barrier.image = image.handle();
9279 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9280 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9281 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9282 img_barrier.subresourceRange.baseArrayLayer = 0;
9283 img_barrier.subresourceRange.baseMipLevel = 0;
9284 img_barrier.subresourceRange.layerCount = 1;
9285 img_barrier.subresourceRange.levelCount = 1;
9286 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9287 VK_PIPELINE_STAGE_HOST_BIT,
9288 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9289 nullptr, 1, &img_barrier);
9290 m_errorMonitor->VerifyFound();
9291 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9292
9293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9294 "Subresource must have the sum of the "
9295 "baseArrayLayer");
9296 // baseArrayLayer + layerCount must be <= image's arrayLayers
9297 img_barrier.subresourceRange.baseArrayLayer = 1;
9298 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9299 VK_PIPELINE_STAGE_HOST_BIT,
9300 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9301 nullptr, 1, &img_barrier);
9302 m_errorMonitor->VerifyFound();
9303 img_barrier.subresourceRange.baseArrayLayer = 0;
9304
9305 m_errorMonitor->SetDesiredFailureMsg(
9306 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9307 "Subresource must have the sum of the baseMipLevel");
9308 // baseMipLevel + levelCount must be <= image's mipLevels
9309 img_barrier.subresourceRange.baseMipLevel = 1;
9310 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9311 VK_PIPELINE_STAGE_HOST_BIT,
9312 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9313 nullptr, 1, &img_barrier);
9314 m_errorMonitor->VerifyFound();
9315 img_barrier.subresourceRange.baseMipLevel = 0;
9316
9317 m_errorMonitor->SetDesiredFailureMsg(
9318 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9319 "Buffer Barriers cannot be used during a render pass");
9320 vk_testing::Buffer buffer;
9321 buffer.init(*m_device, 256);
9322 VkBufferMemoryBarrier buf_barrier = {};
9323 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9324 buf_barrier.pNext = NULL;
9325 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9326 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9327 buf_barrier.buffer = buffer.handle();
9328 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9329 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9330 buf_barrier.offset = 0;
9331 buf_barrier.size = VK_WHOLE_SIZE;
9332 // Can't send buffer barrier during a render pass
9333 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9334 VK_PIPELINE_STAGE_HOST_BIT,
9335 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9336 &buf_barrier, 0, nullptr);
9337 m_errorMonitor->VerifyFound();
9338 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9339
9340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9341 "which is not less than total size");
9342 buf_barrier.offset = 257;
9343 // Offset greater than total size
9344 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9345 VK_PIPELINE_STAGE_HOST_BIT,
9346 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9347 &buf_barrier, 0, nullptr);
9348 m_errorMonitor->VerifyFound();
9349 buf_barrier.offset = 0;
9350
9351 m_errorMonitor->SetDesiredFailureMsg(
9352 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
9353 buf_barrier.size = 257;
9354 // Size greater than total size
9355 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9356 VK_PIPELINE_STAGE_HOST_BIT,
9357 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9358 &buf_barrier, 0, nullptr);
9359 m_errorMonitor->VerifyFound();
9360 buf_barrier.size = VK_WHOLE_SIZE;
9361
9362 m_errorMonitor->SetDesiredFailureMsg(
9363 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9364 "Image is a depth and stencil format and thus must "
9365 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
9366 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
9367 VkDepthStencilObj ds_image(m_device);
9368 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
9369 ASSERT_TRUE(ds_image.initialized());
9370 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9371 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9372 img_barrier.image = ds_image.handle();
9373 // Leave aspectMask at COLOR on purpose
9374 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9375 VK_PIPELINE_STAGE_HOST_BIT,
9376 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9377 nullptr, 1, &img_barrier);
9378 m_errorMonitor->VerifyFound();
9379}
9380
Karl Schultz6addd812016-02-02 17:17:23 -07009381TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009382 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009383 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009384
Karl Schultz6addd812016-02-02 17:17:23 -07009385 m_errorMonitor->SetDesiredFailureMsg(
9386 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009387 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9388
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009389 ASSERT_NO_FATAL_FAILURE(InitState());
9390 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009391 uint32_t qfi = 0;
9392 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009393 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9394 buffCI.size = 1024;
9395 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9396 buffCI.queueFamilyIndexCount = 1;
9397 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009398
9399 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009400 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009401 ASSERT_VK_SUCCESS(err);
9402
9403 BeginCommandBuffer();
9404 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009405 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9406 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009407 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07009408 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
9409 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009410
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009411 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009412
Chia-I Wuf7458c52015-10-26 21:10:41 +08009413 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009414}
9415
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009416TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9417 // Create an out-of-range queueFamilyIndex
9418 m_errorMonitor->SetDesiredFailureMsg(
9419 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -06009420 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
9421 "of the indices specified when the device was created, via the "
9422 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009423
9424 ASSERT_NO_FATAL_FAILURE(InitState());
9425 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9426 VkBufferCreateInfo buffCI = {};
9427 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9428 buffCI.size = 1024;
9429 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9430 buffCI.queueFamilyIndexCount = 1;
9431 // Introduce failure by specifying invalid queue_family_index
9432 uint32_t qfi = 777;
9433 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06009434 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009435
9436 VkBuffer ib;
9437 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
9438
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009439 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009440 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009441}
9442
Karl Schultz6addd812016-02-02 17:17:23 -07009443TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
9444 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
9445 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009446
Karl Schultz6addd812016-02-02 17:17:23 -07009447 m_errorMonitor->SetDesiredFailureMsg(
9448 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009449 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009450
9451 ASSERT_NO_FATAL_FAILURE(InitState());
9452 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009453
9454 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009455 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009456 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
9457 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009458
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009459 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009460}
9461
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009462TEST_F(VkLayerTest, DSUsageBitsErrors) {
9463 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
9464 "that do not have correct usage bits sets.");
9465 VkResult err;
9466
9467 ASSERT_NO_FATAL_FAILURE(InitState());
9468 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9469 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9470 ds_type_count[i].type = VkDescriptorType(i);
9471 ds_type_count[i].descriptorCount = 1;
9472 }
9473 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9474 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9475 ds_pool_ci.pNext = NULL;
9476 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9477 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9478 ds_pool_ci.pPoolSizes = ds_type_count;
9479
9480 VkDescriptorPool ds_pool;
9481 err =
9482 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9483 ASSERT_VK_SUCCESS(err);
9484
9485 // Create 10 layouts where each has a single descriptor of different type
9486 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] =
9487 {};
9488 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9489 dsl_binding[i].binding = 0;
9490 dsl_binding[i].descriptorType = VkDescriptorType(i);
9491 dsl_binding[i].descriptorCount = 1;
9492 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9493 dsl_binding[i].pImmutableSamplers = NULL;
9494 }
9495
9496 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9497 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9498 ds_layout_ci.pNext = NULL;
9499 ds_layout_ci.bindingCount = 1;
9500 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9501 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9502 ds_layout_ci.pBindings = dsl_binding + i;
9503 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
9504 NULL, ds_layouts + i);
9505 ASSERT_VK_SUCCESS(err);
9506 }
9507 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9508 VkDescriptorSetAllocateInfo alloc_info = {};
9509 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9510 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9511 alloc_info.descriptorPool = ds_pool;
9512 alloc_info.pSetLayouts = ds_layouts;
9513 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9514 descriptor_sets);
9515 ASSERT_VK_SUCCESS(err);
9516
9517 // Create a buffer & bufferView to be used for invalid updates
9518 VkBufferCreateInfo buff_ci = {};
9519 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9520 // This usage is not valid for any descriptor type
9521 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
9522 buff_ci.size = 256;
9523 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9524 VkBuffer buffer;
9525 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9526 ASSERT_VK_SUCCESS(err);
9527
9528 VkBufferViewCreateInfo buff_view_ci = {};
9529 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9530 buff_view_ci.buffer = buffer;
9531 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9532 buff_view_ci.range = VK_WHOLE_SIZE;
9533 VkBufferView buff_view;
9534 err =
9535 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
9536 ASSERT_VK_SUCCESS(err);
9537
9538 // Create an image to be used for invalid updates
9539 VkImageCreateInfo image_ci = {};
9540 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9541 image_ci.imageType = VK_IMAGE_TYPE_2D;
9542 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
9543 image_ci.extent.width = 64;
9544 image_ci.extent.height = 64;
9545 image_ci.extent.depth = 1;
9546 image_ci.mipLevels = 1;
9547 image_ci.arrayLayers = 1;
9548 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
9549 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9550 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9551 // This usage is not valid for any descriptor type
9552 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9553 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9554 VkImage image;
9555 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9556 ASSERT_VK_SUCCESS(err);
9557 // Bind memory to image
9558 VkMemoryRequirements mem_reqs;
9559 VkDeviceMemory image_mem;
9560 bool pass;
9561 VkMemoryAllocateInfo mem_alloc = {};
9562 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9563 mem_alloc.pNext = NULL;
9564 mem_alloc.allocationSize = 0;
9565 mem_alloc.memoryTypeIndex = 0;
9566 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9567 mem_alloc.allocationSize = mem_reqs.size;
9568 pass =
9569 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9570 ASSERT_TRUE(pass);
9571 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9572 ASSERT_VK_SUCCESS(err);
9573 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9574 ASSERT_VK_SUCCESS(err);
9575 // Now create view for image
9576 VkImageViewCreateInfo image_view_ci = {};
9577 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9578 image_view_ci.image = image;
9579 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
9580 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9581 image_view_ci.subresourceRange.layerCount = 1;
9582 image_view_ci.subresourceRange.baseArrayLayer = 0;
9583 image_view_ci.subresourceRange.levelCount = 1;
9584 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9585 VkImageView image_view;
9586 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
9587 &image_view);
9588 ASSERT_VK_SUCCESS(err);
9589
9590 VkDescriptorBufferInfo buff_info = {};
9591 buff_info.buffer = buffer;
9592 VkDescriptorImageInfo img_info = {};
9593 img_info.imageView = image_view;
9594 VkWriteDescriptorSet descriptor_write = {};
9595 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9596 descriptor_write.dstBinding = 0;
9597 descriptor_write.descriptorCount = 1;
9598 descriptor_write.pTexelBufferView = &buff_view;
9599 descriptor_write.pBufferInfo = &buff_info;
9600 descriptor_write.pImageInfo = &img_info;
9601
9602 // These error messages align with VkDescriptorType struct
9603 const char *error_msgs[] = {
9604 "", // placeholder, no error for SAMPLER descriptor
9605 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
9606 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
9607 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
9608 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
9609 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
9610 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
9611 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
9612 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
9613 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
9614 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
9615 // Start loop at 1 as SAMPLER desc type has no usage bit error
9616 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9617 descriptor_write.descriptorType = VkDescriptorType(i);
9618 descriptor_write.dstSet = descriptor_sets[i];
9619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9620 error_msgs[i]);
9621
9622 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
9623 NULL);
9624
9625 m_errorMonitor->VerifyFound();
9626 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
9627 }
9628 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9629 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009630 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009631 vkDestroyImageView(m_device->device(), image_view, NULL);
9632 vkDestroyBuffer(m_device->device(), buffer, NULL);
9633 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9634 vkFreeDescriptorSets(m_device->device(), ds_pool,
9635 VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
9636 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9637}
9638
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009639TEST_F(VkLayerTest, DSBufferInfoErrors) {
9640 TEST_DESCRIPTION(
9641 "Attempt to update buffer descriptor set that has incorrect "
9642 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
9643 "1. offset value greater than buffer size\n"
9644 "2. range value of 0\n"
9645 "3. range value greater than buffer (size - offset)");
9646 VkResult err;
9647
9648 ASSERT_NO_FATAL_FAILURE(InitState());
9649 VkDescriptorPoolSize ds_type_count = {};
9650 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9651 ds_type_count.descriptorCount = 1;
9652
9653 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9654 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9655 ds_pool_ci.pNext = NULL;
9656 ds_pool_ci.maxSets = 1;
9657 ds_pool_ci.poolSizeCount = 1;
9658 ds_pool_ci.pPoolSizes = &ds_type_count;
9659
9660 VkDescriptorPool ds_pool;
9661 err =
9662 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9663 ASSERT_VK_SUCCESS(err);
9664
9665 // Create layout with single uniform buffer descriptor
9666 VkDescriptorSetLayoutBinding dsl_binding = {};
9667 dsl_binding.binding = 0;
9668 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9669 dsl_binding.descriptorCount = 1;
9670 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9671 dsl_binding.pImmutableSamplers = NULL;
9672
9673 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9674 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9675 ds_layout_ci.pNext = NULL;
9676 ds_layout_ci.bindingCount = 1;
9677 ds_layout_ci.pBindings = &dsl_binding;
9678 VkDescriptorSetLayout ds_layout;
9679 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9680 &ds_layout);
9681 ASSERT_VK_SUCCESS(err);
9682
9683 VkDescriptorSet descriptor_set = {};
9684 VkDescriptorSetAllocateInfo alloc_info = {};
9685 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9686 alloc_info.descriptorSetCount = 1;
9687 alloc_info.descriptorPool = ds_pool;
9688 alloc_info.pSetLayouts = &ds_layout;
9689 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9690 &descriptor_set);
9691 ASSERT_VK_SUCCESS(err);
9692
9693 // Create a buffer to be used for invalid updates
9694 VkBufferCreateInfo buff_ci = {};
9695 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9696 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9697 buff_ci.size = 256;
9698 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9699 VkBuffer buffer;
9700 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9701 ASSERT_VK_SUCCESS(err);
9702 // Have to bind memory to buffer before descriptor update
9703 VkMemoryAllocateInfo mem_alloc = {};
9704 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9705 mem_alloc.pNext = NULL;
9706 mem_alloc.allocationSize = 256;
9707 mem_alloc.memoryTypeIndex = 0;
9708
9709 VkMemoryRequirements mem_reqs;
9710 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9711 bool pass =
9712 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9713 if (!pass) {
9714 vkDestroyBuffer(m_device->device(), buffer, NULL);
9715 return;
9716 }
9717
9718 VkDeviceMemory mem;
9719 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9720 ASSERT_VK_SUCCESS(err);
9721 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9722 ASSERT_VK_SUCCESS(err);
9723
9724 VkDescriptorBufferInfo buff_info = {};
9725 buff_info.buffer = buffer;
9726 // First make offset 1 larger than buffer size
9727 buff_info.offset = 257;
9728 buff_info.range = VK_WHOLE_SIZE;
9729 VkWriteDescriptorSet descriptor_write = {};
9730 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9731 descriptor_write.dstBinding = 0;
9732 descriptor_write.descriptorCount = 1;
9733 descriptor_write.pTexelBufferView = nullptr;
9734 descriptor_write.pBufferInfo = &buff_info;
9735 descriptor_write.pImageInfo = nullptr;
9736
9737 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9738 descriptor_write.dstSet = descriptor_set;
9739 m_errorMonitor->SetDesiredFailureMsg(
9740 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9741 " offset of 257 is greater than buffer ");
9742
9743 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9744
9745 m_errorMonitor->VerifyFound();
9746 // Now cause error due to range of 0
9747 buff_info.offset = 0;
9748 buff_info.range = 0;
9749 m_errorMonitor->SetDesiredFailureMsg(
9750 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9751 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
9752
9753 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9754
9755 m_errorMonitor->VerifyFound();
9756 // Now cause error due to range exceeding buffer size - offset
9757 buff_info.offset = 128;
9758 buff_info.range = 200;
9759 m_errorMonitor->SetDesiredFailureMsg(
9760 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9761 " range is 200 which is greater than buffer size ");
9762
9763 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9764
9765 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009766 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009767 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9768 vkDestroyBuffer(m_device->device(), buffer, NULL);
9769 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9770 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9771}
9772
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009773TEST_F(VkLayerTest, DSAspectBitsErrors) {
9774 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9775 // are set, but could expand this test to hit more cases.
9776 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
9777 "that do not have correct aspect bits sets.");
9778 VkResult err;
9779
9780 ASSERT_NO_FATAL_FAILURE(InitState());
9781 VkDescriptorPoolSize ds_type_count = {};
9782 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9783 ds_type_count.descriptorCount = 1;
9784
9785 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9786 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9787 ds_pool_ci.pNext = NULL;
9788 ds_pool_ci.maxSets = 5;
9789 ds_pool_ci.poolSizeCount = 1;
9790 ds_pool_ci.pPoolSizes = &ds_type_count;
9791
9792 VkDescriptorPool ds_pool;
9793 err =
9794 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9795 ASSERT_VK_SUCCESS(err);
9796
9797 VkDescriptorSetLayoutBinding dsl_binding = {};
9798 dsl_binding.binding = 0;
9799 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9800 dsl_binding.descriptorCount = 1;
9801 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9802 dsl_binding.pImmutableSamplers = NULL;
9803
9804 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9805 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9806 ds_layout_ci.pNext = NULL;
9807 ds_layout_ci.bindingCount = 1;
9808 ds_layout_ci.pBindings = &dsl_binding;
9809 VkDescriptorSetLayout ds_layout;
9810 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9811 &ds_layout);
9812 ASSERT_VK_SUCCESS(err);
9813
9814 VkDescriptorSet descriptor_set = {};
9815 VkDescriptorSetAllocateInfo alloc_info = {};
9816 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9817 alloc_info.descriptorSetCount = 1;
9818 alloc_info.descriptorPool = ds_pool;
9819 alloc_info.pSetLayouts = &ds_layout;
9820 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9821 &descriptor_set);
9822 ASSERT_VK_SUCCESS(err);
9823
9824 // Create an image to be used for invalid updates
9825 VkImageCreateInfo image_ci = {};
9826 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9827 image_ci.imageType = VK_IMAGE_TYPE_2D;
9828 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9829 image_ci.extent.width = 64;
9830 image_ci.extent.height = 64;
9831 image_ci.extent.depth = 1;
9832 image_ci.mipLevels = 1;
9833 image_ci.arrayLayers = 1;
9834 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
9835 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9836 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9837 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9838 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9839 VkImage image;
9840 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9841 ASSERT_VK_SUCCESS(err);
9842 // Bind memory to image
9843 VkMemoryRequirements mem_reqs;
9844 VkDeviceMemory image_mem;
9845 bool pass;
9846 VkMemoryAllocateInfo mem_alloc = {};
9847 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9848 mem_alloc.pNext = NULL;
9849 mem_alloc.allocationSize = 0;
9850 mem_alloc.memoryTypeIndex = 0;
9851 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9852 mem_alloc.allocationSize = mem_reqs.size;
9853 pass =
9854 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9855 ASSERT_TRUE(pass);
9856 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9857 ASSERT_VK_SUCCESS(err);
9858 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9859 ASSERT_VK_SUCCESS(err);
9860 // Now create view for image
9861 VkImageViewCreateInfo image_view_ci = {};
9862 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9863 image_view_ci.image = image;
9864 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9865 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9866 image_view_ci.subresourceRange.layerCount = 1;
9867 image_view_ci.subresourceRange.baseArrayLayer = 0;
9868 image_view_ci.subresourceRange.levelCount = 1;
9869 // Setting both depth & stencil aspect bits is illegal for descriptor
9870 image_view_ci.subresourceRange.aspectMask =
9871 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
9872
9873 VkImageView image_view;
9874 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
9875 &image_view);
9876 ASSERT_VK_SUCCESS(err);
9877
9878 VkDescriptorImageInfo img_info = {};
9879 img_info.imageView = image_view;
9880 VkWriteDescriptorSet descriptor_write = {};
9881 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9882 descriptor_write.dstBinding = 0;
9883 descriptor_write.descriptorCount = 1;
9884 descriptor_write.pTexelBufferView = NULL;
9885 descriptor_write.pBufferInfo = NULL;
9886 descriptor_write.pImageInfo = &img_info;
9887 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9888 descriptor_write.dstSet = descriptor_set;
9889 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
9890 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
9891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9892 error_msg);
9893
9894 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9895
9896 m_errorMonitor->VerifyFound();
9897 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9898 vkDestroyImage(m_device->device(), image, NULL);
9899 vkFreeMemory(m_device->device(), image_mem, NULL);
9900 vkDestroyImageView(m_device->device(), image_view, NULL);
9901 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9902 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9903}
9904
Karl Schultz6addd812016-02-02 17:17:23 -07009905TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009906 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07009907 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009908
Karl Schultz6addd812016-02-02 17:17:23 -07009909 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06009910 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9911 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
9912 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009913
Tobin Ehlis3b780662015-05-28 12:11:26 -06009914 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009915 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009916 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009917 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9918 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009919
9920 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009921 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9922 ds_pool_ci.pNext = NULL;
9923 ds_pool_ci.maxSets = 1;
9924 ds_pool_ci.poolSizeCount = 1;
9925 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009926
Tobin Ehlis3b780662015-05-28 12:11:26 -06009927 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009928 err =
9929 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009930 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009931 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009932 dsl_binding.binding = 0;
9933 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9934 dsl_binding.descriptorCount = 1;
9935 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9936 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009937
Tony Barboureb254902015-07-15 12:50:33 -06009938 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009939 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9940 ds_layout_ci.pNext = NULL;
9941 ds_layout_ci.bindingCount = 1;
9942 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009943
Tobin Ehlis3b780662015-05-28 12:11:26 -06009944 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009945 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9946 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009947 ASSERT_VK_SUCCESS(err);
9948
9949 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009950 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009951 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009952 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009953 alloc_info.descriptorPool = ds_pool;
9954 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009955 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9956 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009957 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009958
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009959 VkSamplerCreateInfo sampler_ci = {};
9960 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9961 sampler_ci.pNext = NULL;
9962 sampler_ci.magFilter = VK_FILTER_NEAREST;
9963 sampler_ci.minFilter = VK_FILTER_NEAREST;
9964 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9965 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9966 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9967 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9968 sampler_ci.mipLodBias = 1.0;
9969 sampler_ci.anisotropyEnable = VK_FALSE;
9970 sampler_ci.maxAnisotropy = 1;
9971 sampler_ci.compareEnable = VK_FALSE;
9972 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9973 sampler_ci.minLod = 1.0;
9974 sampler_ci.maxLod = 1.0;
9975 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9976 sampler_ci.unnormalizedCoordinates = VK_FALSE;
9977 VkSampler sampler;
9978 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
9979 ASSERT_VK_SUCCESS(err);
9980
9981 VkDescriptorImageInfo info = {};
9982 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009983
9984 VkWriteDescriptorSet descriptor_write;
9985 memset(&descriptor_write, 0, sizeof(descriptor_write));
9986 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009987 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009988 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009989 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009990 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009991 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009992
9993 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9994
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009995 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009996
Chia-I Wuf7458c52015-10-26 21:10:41 +08009997 vkDestroySampler(m_device->device(), sampler, NULL);
9998 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9999 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010000}
10001
Karl Schultz6addd812016-02-02 17:17:23 -070010002TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010003 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010004 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010005
Karl Schultz6addd812016-02-02 17:17:23 -070010006 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010007 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10008 " binding #0 with 1 total descriptors but update of 1 descriptors "
10009 "starting at binding offset of 0 combined with update array element "
10010 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010011
Tobin Ehlis3b780662015-05-28 12:11:26 -060010012 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010013 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010014 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010015 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10016 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010017
10018 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010019 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10020 ds_pool_ci.pNext = NULL;
10021 ds_pool_ci.maxSets = 1;
10022 ds_pool_ci.poolSizeCount = 1;
10023 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010024
Tobin Ehlis3b780662015-05-28 12:11:26 -060010025 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010026 err =
10027 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010028 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010029
Tony Barboureb254902015-07-15 12:50:33 -060010030 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010031 dsl_binding.binding = 0;
10032 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10033 dsl_binding.descriptorCount = 1;
10034 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10035 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010036
10037 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010038 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10039 ds_layout_ci.pNext = NULL;
10040 ds_layout_ci.bindingCount = 1;
10041 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010042
Tobin Ehlis3b780662015-05-28 12:11:26 -060010043 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010044 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10045 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010046 ASSERT_VK_SUCCESS(err);
10047
10048 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010049 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010050 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010051 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010052 alloc_info.descriptorPool = ds_pool;
10053 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010054 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10055 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010056 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010057
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010058 // Correctly update descriptor to avoid "NOT_UPDATED" error
10059 VkDescriptorBufferInfo buff_info = {};
10060 buff_info.buffer =
10061 VkBuffer(0); // Don't care about buffer handle for this test
10062 buff_info.offset = 0;
10063 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010064
10065 VkWriteDescriptorSet descriptor_write;
10066 memset(&descriptor_write, 0, sizeof(descriptor_write));
10067 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010068 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010069 descriptor_write.dstArrayElement =
10070 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010071 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010072 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10073 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010074
10075 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10076
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010077 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010078
Chia-I Wuf7458c52015-10-26 21:10:41 +080010079 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10080 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010081}
10082
Karl Schultz6addd812016-02-02 17:17:23 -070010083TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
10084 // Create layout w/ count of 1 and attempt update to that layout w/ binding
10085 // index 2
10086 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010087
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10089 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010090
Tobin Ehlis3b780662015-05-28 12:11:26 -060010091 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010092 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010093 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010094 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10095 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010096
10097 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010098 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10099 ds_pool_ci.pNext = NULL;
10100 ds_pool_ci.maxSets = 1;
10101 ds_pool_ci.poolSizeCount = 1;
10102 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010103
Tobin Ehlis3b780662015-05-28 12:11:26 -060010104 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010105 err =
10106 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010107 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010108
Tony Barboureb254902015-07-15 12:50:33 -060010109 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010110 dsl_binding.binding = 0;
10111 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10112 dsl_binding.descriptorCount = 1;
10113 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10114 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010115
10116 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010117 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10118 ds_layout_ci.pNext = NULL;
10119 ds_layout_ci.bindingCount = 1;
10120 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010121 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010122 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10123 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010124 ASSERT_VK_SUCCESS(err);
10125
10126 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010127 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010128 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010129 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010130 alloc_info.descriptorPool = ds_pool;
10131 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010132 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10133 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010134 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010135
Tony Barboureb254902015-07-15 12:50:33 -060010136 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010137 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10138 sampler_ci.pNext = NULL;
10139 sampler_ci.magFilter = VK_FILTER_NEAREST;
10140 sampler_ci.minFilter = VK_FILTER_NEAREST;
10141 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10142 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10143 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10144 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10145 sampler_ci.mipLodBias = 1.0;
10146 sampler_ci.anisotropyEnable = VK_FALSE;
10147 sampler_ci.maxAnisotropy = 1;
10148 sampler_ci.compareEnable = VK_FALSE;
10149 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10150 sampler_ci.minLod = 1.0;
10151 sampler_ci.maxLod = 1.0;
10152 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10153 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010154
Tobin Ehlis3b780662015-05-28 12:11:26 -060010155 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010156 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010157 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010158
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010159 VkDescriptorImageInfo info = {};
10160 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010161
10162 VkWriteDescriptorSet descriptor_write;
10163 memset(&descriptor_write, 0, sizeof(descriptor_write));
10164 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010165 descriptor_write.dstSet = descriptorSet;
10166 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010167 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010168 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010169 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010170 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010171
10172 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10173
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010174 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010175
Chia-I Wuf7458c52015-10-26 21:10:41 +080010176 vkDestroySampler(m_device->device(), sampler, NULL);
10177 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10178 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010179}
10180
Karl Schultz6addd812016-02-02 17:17:23 -070010181TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10182 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10183 // types
10184 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010185
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010186 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis660bcdc2016-05-17 10:39:46 -060010187 ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010188
Tobin Ehlis3b780662015-05-28 12:11:26 -060010189 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010190
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010191 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010192 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10193 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010194
10195 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010196 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10197 ds_pool_ci.pNext = NULL;
10198 ds_pool_ci.maxSets = 1;
10199 ds_pool_ci.poolSizeCount = 1;
10200 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010201
Tobin Ehlis3b780662015-05-28 12:11:26 -060010202 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010203 err =
10204 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010205 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010206 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010207 dsl_binding.binding = 0;
10208 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10209 dsl_binding.descriptorCount = 1;
10210 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10211 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010212
Tony Barboureb254902015-07-15 12:50:33 -060010213 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010214 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10215 ds_layout_ci.pNext = NULL;
10216 ds_layout_ci.bindingCount = 1;
10217 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010218
Tobin Ehlis3b780662015-05-28 12:11:26 -060010219 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010220 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10221 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010222 ASSERT_VK_SUCCESS(err);
10223
10224 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010225 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010226 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010227 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010228 alloc_info.descriptorPool = ds_pool;
10229 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010230 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10231 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010232 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010233
Tony Barboureb254902015-07-15 12:50:33 -060010234 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010235 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10236 sampler_ci.pNext = NULL;
10237 sampler_ci.magFilter = VK_FILTER_NEAREST;
10238 sampler_ci.minFilter = VK_FILTER_NEAREST;
10239 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10240 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10241 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10242 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10243 sampler_ci.mipLodBias = 1.0;
10244 sampler_ci.anisotropyEnable = VK_FALSE;
10245 sampler_ci.maxAnisotropy = 1;
10246 sampler_ci.compareEnable = VK_FALSE;
10247 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10248 sampler_ci.minLod = 1.0;
10249 sampler_ci.maxLod = 1.0;
10250 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10251 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010252 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010253 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010254 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010255
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010256 VkDescriptorImageInfo info = {};
10257 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010258
10259 VkWriteDescriptorSet descriptor_write;
10260 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -070010261 descriptor_write.sType =
10262 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010263 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010264 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010265 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010266 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010267 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010268
10269 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10270
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010271 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010272
Chia-I Wuf7458c52015-10-26 21:10:41 +080010273 vkDestroySampler(m_device->device(), sampler, NULL);
10274 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10275 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010276}
10277
Karl Schultz6addd812016-02-02 17:17:23 -070010278TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010279 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010280 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010281
Karl Schultz6addd812016-02-02 17:17:23 -070010282 m_errorMonitor->SetDesiredFailureMsg(
10283 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010284 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010285
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010286 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010287 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10288 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010289 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010290 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10291 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010292
10293 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010294 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10295 ds_pool_ci.pNext = NULL;
10296 ds_pool_ci.maxSets = 1;
10297 ds_pool_ci.poolSizeCount = 1;
10298 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010299
10300 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010301 err =
10302 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010303 ASSERT_VK_SUCCESS(err);
10304
10305 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010306 dsl_binding.binding = 0;
10307 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10308 dsl_binding.descriptorCount = 1;
10309 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10310 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010311
10312 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010313 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10314 ds_layout_ci.pNext = NULL;
10315 ds_layout_ci.bindingCount = 1;
10316 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010317 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010318 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10319 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010320 ASSERT_VK_SUCCESS(err);
10321
10322 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010323 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010324 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010325 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010326 alloc_info.descriptorPool = ds_pool;
10327 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010328 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10329 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010330 ASSERT_VK_SUCCESS(err);
10331
Karl Schultz6addd812016-02-02 17:17:23 -070010332 VkSampler sampler =
10333 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010334
10335 VkDescriptorImageInfo descriptor_info;
10336 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10337 descriptor_info.sampler = sampler;
10338
10339 VkWriteDescriptorSet descriptor_write;
10340 memset(&descriptor_write, 0, sizeof(descriptor_write));
10341 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010342 descriptor_write.dstSet = descriptorSet;
10343 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010344 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010345 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10346 descriptor_write.pImageInfo = &descriptor_info;
10347
10348 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10349
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010350 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010351
Chia-I Wuf7458c52015-10-26 21:10:41 +080010352 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10353 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010354}
10355
Karl Schultz6addd812016-02-02 17:17:23 -070010356TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10357 // Create a single combined Image/Sampler descriptor and send it an invalid
10358 // imageView
10359 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010360
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10362 "Attempted write update to combined "
10363 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -060010364 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010365
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010366 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010367 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010368 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10369 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010370
10371 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010372 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10373 ds_pool_ci.pNext = NULL;
10374 ds_pool_ci.maxSets = 1;
10375 ds_pool_ci.poolSizeCount = 1;
10376 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010377
10378 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010379 err =
10380 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010381 ASSERT_VK_SUCCESS(err);
10382
10383 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010384 dsl_binding.binding = 0;
10385 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10386 dsl_binding.descriptorCount = 1;
10387 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10388 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010389
10390 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010391 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10392 ds_layout_ci.pNext = NULL;
10393 ds_layout_ci.bindingCount = 1;
10394 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010395 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010396 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10397 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010398 ASSERT_VK_SUCCESS(err);
10399
10400 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010401 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010402 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010403 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010404 alloc_info.descriptorPool = ds_pool;
10405 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010406 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10407 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010408 ASSERT_VK_SUCCESS(err);
10409
10410 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010411 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10412 sampler_ci.pNext = NULL;
10413 sampler_ci.magFilter = VK_FILTER_NEAREST;
10414 sampler_ci.minFilter = VK_FILTER_NEAREST;
10415 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10416 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10417 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10418 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10419 sampler_ci.mipLodBias = 1.0;
10420 sampler_ci.anisotropyEnable = VK_FALSE;
10421 sampler_ci.maxAnisotropy = 1;
10422 sampler_ci.compareEnable = VK_FALSE;
10423 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10424 sampler_ci.minLod = 1.0;
10425 sampler_ci.maxLod = 1.0;
10426 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10427 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010428
10429 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010430 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010431 ASSERT_VK_SUCCESS(err);
10432
Karl Schultz6addd812016-02-02 17:17:23 -070010433 VkImageView view =
10434 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010435
10436 VkDescriptorImageInfo descriptor_info;
10437 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10438 descriptor_info.sampler = sampler;
10439 descriptor_info.imageView = view;
10440
10441 VkWriteDescriptorSet descriptor_write;
10442 memset(&descriptor_write, 0, sizeof(descriptor_write));
10443 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010444 descriptor_write.dstSet = descriptorSet;
10445 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010446 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010447 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10448 descriptor_write.pImageInfo = &descriptor_info;
10449
10450 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10451
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010452 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010453
Chia-I Wuf7458c52015-10-26 21:10:41 +080010454 vkDestroySampler(m_device->device(), sampler, NULL);
10455 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10456 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010457}
10458
Karl Schultz6addd812016-02-02 17:17:23 -070010459TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10460 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10461 // into the other
10462 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010463
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10465 " binding #1 with type "
10466 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10467 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010468
Tobin Ehlis04356f92015-10-27 16:35:27 -060010469 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010470 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010471 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010472 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10473 ds_type_count[0].descriptorCount = 1;
10474 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10475 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010476
10477 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010478 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10479 ds_pool_ci.pNext = NULL;
10480 ds_pool_ci.maxSets = 1;
10481 ds_pool_ci.poolSizeCount = 2;
10482 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010483
10484 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010485 err =
10486 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010487 ASSERT_VK_SUCCESS(err);
10488 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010489 dsl_binding[0].binding = 0;
10490 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10491 dsl_binding[0].descriptorCount = 1;
10492 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10493 dsl_binding[0].pImmutableSamplers = NULL;
10494 dsl_binding[1].binding = 1;
10495 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10496 dsl_binding[1].descriptorCount = 1;
10497 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10498 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010499
10500 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010501 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10502 ds_layout_ci.pNext = NULL;
10503 ds_layout_ci.bindingCount = 2;
10504 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010505
10506 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010507 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10508 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010509 ASSERT_VK_SUCCESS(err);
10510
10511 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010512 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010513 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010514 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010515 alloc_info.descriptorPool = ds_pool;
10516 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010517 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10518 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010519 ASSERT_VK_SUCCESS(err);
10520
10521 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010522 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10523 sampler_ci.pNext = NULL;
10524 sampler_ci.magFilter = VK_FILTER_NEAREST;
10525 sampler_ci.minFilter = VK_FILTER_NEAREST;
10526 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10527 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10528 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10529 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10530 sampler_ci.mipLodBias = 1.0;
10531 sampler_ci.anisotropyEnable = VK_FALSE;
10532 sampler_ci.maxAnisotropy = 1;
10533 sampler_ci.compareEnable = VK_FALSE;
10534 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10535 sampler_ci.minLod = 1.0;
10536 sampler_ci.maxLod = 1.0;
10537 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10538 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010539
10540 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010541 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010542 ASSERT_VK_SUCCESS(err);
10543
10544 VkDescriptorImageInfo info = {};
10545 info.sampler = sampler;
10546
10547 VkWriteDescriptorSet descriptor_write;
10548 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10549 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010550 descriptor_write.dstSet = descriptorSet;
10551 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010552 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010553 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10554 descriptor_write.pImageInfo = &info;
10555 // This write update should succeed
10556 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10557 // Now perform a copy update that fails due to type mismatch
10558 VkCopyDescriptorSet copy_ds_update;
10559 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10560 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10561 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -060010562 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010563 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010564 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +080010565 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010566 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10567
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010568 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010569 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070010570 m_errorMonitor->SetDesiredFailureMsg(
10571 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010572 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060010573 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10574 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10575 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010576 copy_ds_update.srcBinding =
10577 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010578 copy_ds_update.dstSet = descriptorSet;
10579 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -060010580 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010581 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10582
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010583 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010584
Tobin Ehlis04356f92015-10-27 16:35:27 -060010585 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070010586 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010587 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
10588 "update array offset of 0 and update of "
10589 "5 descriptors oversteps total number "
10590 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010591
Tobin Ehlis04356f92015-10-27 16:35:27 -060010592 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10593 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10594 copy_ds_update.srcSet = descriptorSet;
10595 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010596 copy_ds_update.dstSet = descriptorSet;
10597 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010598 copy_ds_update.descriptorCount =
10599 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010600 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10601
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010602 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010603
Chia-I Wuf7458c52015-10-26 21:10:41 +080010604 vkDestroySampler(m_device->device(), sampler, NULL);
10605 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10606 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010607}
10608
Karl Schultz6addd812016-02-02 17:17:23 -070010609TEST_F(VkLayerTest, NumSamplesMismatch) {
10610 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10611 // sampleCount
10612 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010613
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010614 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070010615 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010616
Tobin Ehlis3b780662015-05-28 12:11:26 -060010617 ASSERT_NO_FATAL_FAILURE(InitState());
10618 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010619 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010620 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010621 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010622
10623 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010624 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10625 ds_pool_ci.pNext = NULL;
10626 ds_pool_ci.maxSets = 1;
10627 ds_pool_ci.poolSizeCount = 1;
10628 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010629
Tobin Ehlis3b780662015-05-28 12:11:26 -060010630 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010631 err =
10632 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010633 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010634
Tony Barboureb254902015-07-15 12:50:33 -060010635 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010636 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010637 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010638 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010639 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10640 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010641
Tony Barboureb254902015-07-15 12:50:33 -060010642 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10643 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10644 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010645 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010646 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010647
Tobin Ehlis3b780662015-05-28 12:11:26 -060010648 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010649 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10650 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010651 ASSERT_VK_SUCCESS(err);
10652
10653 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010654 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010655 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010656 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010657 alloc_info.descriptorPool = ds_pool;
10658 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010659 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10660 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010661 ASSERT_VK_SUCCESS(err);
10662
Tony Barboureb254902015-07-15 12:50:33 -060010663 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010664 pipe_ms_state_ci.sType =
10665 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
10666 pipe_ms_state_ci.pNext = NULL;
10667 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10668 pipe_ms_state_ci.sampleShadingEnable = 0;
10669 pipe_ms_state_ci.minSampleShading = 1.0;
10670 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010671
Tony Barboureb254902015-07-15 12:50:33 -060010672 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010673 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10674 pipeline_layout_ci.pNext = NULL;
10675 pipeline_layout_ci.setLayoutCount = 1;
10676 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010677
10678 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010679 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
10680 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010681 ASSERT_VK_SUCCESS(err);
10682
Karl Schultz6addd812016-02-02 17:17:23 -070010683 VkShaderObj vs(m_device, bindStateVertShaderText,
10684 VK_SHADER_STAGE_VERTEX_BIT, this);
10685 VkShaderObj fs(m_device, bindStateFragShaderText,
10686 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060010687 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070010688 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010689 VkPipelineObj pipe(m_device);
10690 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010691 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010692 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010693 pipe.SetMSAA(&pipe_ms_state_ci);
10694 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010695
Tony Barbourfe3351b2015-07-28 10:17:20 -060010696 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070010697 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10698 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010699
Mark Young29927482016-05-04 14:38:51 -060010700 // Render triangle (the error should trigger on the attempt to draw).
10701 Draw(3, 1, 0, 0);
10702
10703 // Finalize recording of the command buffer
10704 EndCommandBuffer();
10705
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010706 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010707
Chia-I Wuf7458c52015-10-26 21:10:41 +080010708 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10709 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10710 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010711}
Mark Young29927482016-05-04 14:38:51 -060010712
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010713TEST_F(VkLayerTest, RenderPassIncompatible) {
10714 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
10715 "Initial case is drawing with an active renderpass that's "
10716 "not compatible with the bound PSO's creation renderpass");
10717 VkResult err;
10718
10719 ASSERT_NO_FATAL_FAILURE(InitState());
10720 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10721
10722 VkDescriptorSetLayoutBinding dsl_binding = {};
10723 dsl_binding.binding = 0;
10724 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10725 dsl_binding.descriptorCount = 1;
10726 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10727 dsl_binding.pImmutableSamplers = NULL;
10728
10729 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10730 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10731 ds_layout_ci.pNext = NULL;
10732 ds_layout_ci.bindingCount = 1;
10733 ds_layout_ci.pBindings = &dsl_binding;
10734
10735 VkDescriptorSetLayout ds_layout;
10736 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10737 &ds_layout);
10738 ASSERT_VK_SUCCESS(err);
10739
10740 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10741 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10742 pipeline_layout_ci.pNext = NULL;
10743 pipeline_layout_ci.setLayoutCount = 1;
10744 pipeline_layout_ci.pSetLayouts = &ds_layout;
10745
10746 VkPipelineLayout pipeline_layout;
10747 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
10748 &pipeline_layout);
10749 ASSERT_VK_SUCCESS(err);
10750
10751 VkShaderObj vs(m_device, bindStateVertShaderText,
10752 VK_SHADER_STAGE_VERTEX_BIT, this);
10753 VkShaderObj fs(m_device, bindStateFragShaderText,
10754 VK_SHADER_STAGE_FRAGMENT_BIT,
10755 this); // We shouldn't need a fragment shader
10756 // but add it to be able to run on more devices
10757 // Create a renderpass that will be incompatible with default renderpass
10758 VkAttachmentReference attach = {};
10759 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
10760 VkAttachmentReference color_att = {};
10761 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10762 VkSubpassDescription subpass = {};
10763 subpass.inputAttachmentCount = 1;
10764 subpass.pInputAttachments = &attach;
10765 subpass.colorAttachmentCount = 1;
10766 subpass.pColorAttachments = &color_att;
10767 VkRenderPassCreateInfo rpci = {};
10768 rpci.subpassCount = 1;
10769 rpci.pSubpasses = &subpass;
10770 rpci.attachmentCount = 1;
10771 VkAttachmentDescription attach_desc = {};
10772 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060010773 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
10774 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010775 rpci.pAttachments = &attach_desc;
10776 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
10777 VkRenderPass rp;
10778 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10779 VkPipelineObj pipe(m_device);
10780 pipe.AddShader(&vs);
10781 pipe.AddShader(&fs);
10782 pipe.AddColorAttachment();
10783 VkViewport view_port = {};
10784 m_viewports.push_back(view_port);
10785 pipe.SetViewport(m_viewports);
10786 VkRect2D rect = {};
10787 m_scissors.push_back(rect);
10788 pipe.SetScissor(m_scissors);
10789 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10790
10791 VkCommandBufferInheritanceInfo cbii = {};
10792 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
10793 cbii.renderPass = rp;
10794 cbii.subpass = 0;
10795 VkCommandBufferBeginInfo cbbi = {};
10796 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
10797 cbbi.pInheritanceInfo = &cbii;
10798 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
10799 VkRenderPassBeginInfo rpbi = {};
10800 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
10801 rpbi.framebuffer = m_framebuffer;
10802 rpbi.renderPass = rp;
10803 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi,
10804 VK_SUBPASS_CONTENTS_INLINE);
10805 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10806 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
10807
10808 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10809 " is incompatible w/ gfx pipeline ");
10810 // Render triangle (the error should trigger on the attempt to draw).
10811 Draw(3, 1, 0, 0);
10812
10813 // Finalize recording of the command buffer
10814 EndCommandBuffer();
10815
10816 m_errorMonitor->VerifyFound();
10817
10818 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10819 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10820 vkDestroyRenderPass(m_device->device(), rp, NULL);
10821}
10822
Mark Youngc89c6312016-03-31 16:03:20 -060010823TEST_F(VkLayerTest, NumBlendAttachMismatch) {
10824 // Create Pipeline where the number of blend attachments doesn't match the
10825 // number of color attachments. In this case, we don't add any color
10826 // blend attachments even though we have a color attachment.
10827 VkResult err;
10828
10829 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -060010830 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060010831
10832 ASSERT_NO_FATAL_FAILURE(InitState());
10833 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10834 VkDescriptorPoolSize ds_type_count = {};
10835 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10836 ds_type_count.descriptorCount = 1;
10837
10838 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10839 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10840 ds_pool_ci.pNext = NULL;
10841 ds_pool_ci.maxSets = 1;
10842 ds_pool_ci.poolSizeCount = 1;
10843 ds_pool_ci.pPoolSizes = &ds_type_count;
10844
10845 VkDescriptorPool ds_pool;
10846 err =
10847 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10848 ASSERT_VK_SUCCESS(err);
10849
10850 VkDescriptorSetLayoutBinding dsl_binding = {};
10851 dsl_binding.binding = 0;
10852 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10853 dsl_binding.descriptorCount = 1;
10854 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10855 dsl_binding.pImmutableSamplers = NULL;
10856
10857 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10858 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10859 ds_layout_ci.pNext = NULL;
10860 ds_layout_ci.bindingCount = 1;
10861 ds_layout_ci.pBindings = &dsl_binding;
10862
10863 VkDescriptorSetLayout ds_layout;
10864 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10865 &ds_layout);
10866 ASSERT_VK_SUCCESS(err);
10867
10868 VkDescriptorSet descriptorSet;
10869 VkDescriptorSetAllocateInfo alloc_info = {};
10870 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10871 alloc_info.descriptorSetCount = 1;
10872 alloc_info.descriptorPool = ds_pool;
10873 alloc_info.pSetLayouts = &ds_layout;
10874 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10875 &descriptorSet);
10876 ASSERT_VK_SUCCESS(err);
10877
10878 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
10879 pipe_ms_state_ci.sType =
10880 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
10881 pipe_ms_state_ci.pNext = NULL;
10882 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10883 pipe_ms_state_ci.sampleShadingEnable = 0;
10884 pipe_ms_state_ci.minSampleShading = 1.0;
10885 pipe_ms_state_ci.pSampleMask = NULL;
10886
10887 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10888 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10889 pipeline_layout_ci.pNext = NULL;
10890 pipeline_layout_ci.setLayoutCount = 1;
10891 pipeline_layout_ci.pSetLayouts = &ds_layout;
10892
10893 VkPipelineLayout pipeline_layout;
10894 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
10895 &pipeline_layout);
10896 ASSERT_VK_SUCCESS(err);
10897
10898 VkShaderObj vs(m_device, bindStateVertShaderText,
10899 VK_SHADER_STAGE_VERTEX_BIT, this);
10900 VkShaderObj fs(m_device, bindStateFragShaderText,
10901 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060010902 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -060010903 // but add it to be able to run on more devices
10904 VkPipelineObj pipe(m_device);
10905 pipe.AddShader(&vs);
10906 pipe.AddShader(&fs);
10907 pipe.SetMSAA(&pipe_ms_state_ci);
10908 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10909
10910 BeginCommandBuffer();
10911 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10912 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
10913
Mark Young29927482016-05-04 14:38:51 -060010914 // Render triangle (the error should trigger on the attempt to draw).
10915 Draw(3, 1, 0, 0);
10916
10917 // Finalize recording of the command buffer
10918 EndCommandBuffer();
10919
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010920 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060010921
10922 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10923 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10924 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10925}
Mark Young29927482016-05-04 14:38:51 -060010926
Mark Muellerd4914412016-06-13 17:52:06 -060010927TEST_F(VkLayerTest, MissingClearAttachment) {
10928 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
10929 "structure passed to vkCmdClearAttachments");
10930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10931 "vkCmdClearAttachments() attachment index 1 not found in attachment "
10932 "reference array of active subpass 0");
10933
10934 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
10935 m_errorMonitor->VerifyFound();
10936}
10937
Karl Schultz6addd812016-02-02 17:17:23 -070010938TEST_F(VkLayerTest, ClearCmdNoDraw) {
10939 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
10940 // to issuing a Draw
10941 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010942
Karl Schultz6addd812016-02-02 17:17:23 -070010943 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -070010944 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010945 "vkCmdClearAttachments() issued on CB object ");
10946
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010947 ASSERT_NO_FATAL_FAILURE(InitState());
10948 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010949
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010950 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010951 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10952 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010953
10954 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010955 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10956 ds_pool_ci.pNext = NULL;
10957 ds_pool_ci.maxSets = 1;
10958 ds_pool_ci.poolSizeCount = 1;
10959 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010960
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010961 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010962 err =
10963 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010964 ASSERT_VK_SUCCESS(err);
10965
Tony Barboureb254902015-07-15 12:50:33 -060010966 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010967 dsl_binding.binding = 0;
10968 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10969 dsl_binding.descriptorCount = 1;
10970 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10971 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010972
Tony Barboureb254902015-07-15 12:50:33 -060010973 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010974 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10975 ds_layout_ci.pNext = NULL;
10976 ds_layout_ci.bindingCount = 1;
10977 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010978
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010979 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010980 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10981 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010982 ASSERT_VK_SUCCESS(err);
10983
10984 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010985 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010986 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010987 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010988 alloc_info.descriptorPool = ds_pool;
10989 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010990 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10991 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010992 ASSERT_VK_SUCCESS(err);
10993
Tony Barboureb254902015-07-15 12:50:33 -060010994 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010995 pipe_ms_state_ci.sType =
10996 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
10997 pipe_ms_state_ci.pNext = NULL;
10998 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10999 pipe_ms_state_ci.sampleShadingEnable = 0;
11000 pipe_ms_state_ci.minSampleShading = 1.0;
11001 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011002
Tony Barboureb254902015-07-15 12:50:33 -060011003 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011004 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11005 pipeline_layout_ci.pNext = NULL;
11006 pipeline_layout_ci.setLayoutCount = 1;
11007 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011008
11009 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011010 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11011 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011012 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011013
Karl Schultz6addd812016-02-02 17:17:23 -070011014 VkShaderObj vs(m_device, bindStateVertShaderText,
11015 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011016 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011017 // on more devices
11018 VkShaderObj fs(m_device, bindStateFragShaderText,
11019 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011020
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011021 VkPipelineObj pipe(m_device);
11022 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011023 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011024 pipe.SetMSAA(&pipe_ms_state_ci);
11025 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011026
11027 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011028
Karl Schultz6addd812016-02-02 17:17:23 -070011029 // Main thing we care about for this test is that the VkImage obj we're
11030 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011031 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011032 VkClearAttachment color_attachment;
11033 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11034 color_attachment.clearValue.color.float32[0] = 1.0;
11035 color_attachment.clearValue.color.float32[1] = 1.0;
11036 color_attachment.clearValue.color.float32[2] = 1.0;
11037 color_attachment.clearValue.color.float32[3] = 1.0;
11038 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011039 VkClearRect clear_rect = {
11040 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011041
Karl Schultz6addd812016-02-02 17:17:23 -070011042 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
11043 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011044
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011045 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011046
Chia-I Wuf7458c52015-10-26 21:10:41 +080011047 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11048 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11049 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011050}
11051
Karl Schultz6addd812016-02-02 17:17:23 -070011052TEST_F(VkLayerTest, VtxBufferBadIndex) {
11053 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011054
Karl Schultz6addd812016-02-02 17:17:23 -070011055 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070011056 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -070011057 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011058
Tobin Ehlis502480b2015-06-24 15:53:07 -060011059 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011060 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011061 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011062
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011063 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011064 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11065 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011066
11067 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011068 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11069 ds_pool_ci.pNext = NULL;
11070 ds_pool_ci.maxSets = 1;
11071 ds_pool_ci.poolSizeCount = 1;
11072 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011073
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011074 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011075 err =
11076 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011077 ASSERT_VK_SUCCESS(err);
11078
Tony Barboureb254902015-07-15 12:50:33 -060011079 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011080 dsl_binding.binding = 0;
11081 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11082 dsl_binding.descriptorCount = 1;
11083 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11084 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011085
Tony Barboureb254902015-07-15 12:50:33 -060011086 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011087 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11088 ds_layout_ci.pNext = NULL;
11089 ds_layout_ci.bindingCount = 1;
11090 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011091
Tobin Ehlis502480b2015-06-24 15:53:07 -060011092 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011093 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11094 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011095 ASSERT_VK_SUCCESS(err);
11096
11097 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011098 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011099 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011100 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011101 alloc_info.descriptorPool = ds_pool;
11102 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011103 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11104 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011105 ASSERT_VK_SUCCESS(err);
11106
Tony Barboureb254902015-07-15 12:50:33 -060011107 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011108 pipe_ms_state_ci.sType =
11109 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11110 pipe_ms_state_ci.pNext = NULL;
11111 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11112 pipe_ms_state_ci.sampleShadingEnable = 0;
11113 pipe_ms_state_ci.minSampleShading = 1.0;
11114 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011115
Tony Barboureb254902015-07-15 12:50:33 -060011116 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011117 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11118 pipeline_layout_ci.pNext = NULL;
11119 pipeline_layout_ci.setLayoutCount = 1;
11120 pipeline_layout_ci.pSetLayouts = &ds_layout;
11121 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011122
Karl Schultz6addd812016-02-02 17:17:23 -070011123 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11124 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011125 ASSERT_VK_SUCCESS(err);
11126
Karl Schultz6addd812016-02-02 17:17:23 -070011127 VkShaderObj vs(m_device, bindStateVertShaderText,
11128 VK_SHADER_STAGE_VERTEX_BIT, this);
11129 VkShaderObj fs(m_device, bindStateFragShaderText,
11130 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011131 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011132 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011133 VkPipelineObj pipe(m_device);
11134 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011135 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011136 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011137 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011138 pipe.SetViewport(m_viewports);
11139 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011140 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011141
11142 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011143 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11144 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011145 // Don't care about actual data, just need to get to draw to flag error
11146 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -070011147 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
11148 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011149 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011150 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011151
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011152 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011153
Chia-I Wuf7458c52015-10-26 21:10:41 +080011154 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11155 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11156 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011157}
Mark Muellerdfe37552016-07-07 14:47:42 -060011158
11159TEST_F(VkLayerTest, VertexBufferInvalid) {
11160 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
11161 "delete a buffer twice, use an invalid offset for each "
11162 "buffer type, and attempt to bind a null buffer");
11163
11164 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
11165 "using deleted buffer ";
11166 const char *double_destroy_message = "Cannot free buffer 0x";
11167 const char *invalid_offset_message = "vkBindBufferMemory(): "
11168 "memoryOffset is 0x";
11169 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
11170 "storage memoryOffset "
11171 "is 0x";
11172 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
11173 "texel memoryOffset "
11174 "is 0x";
11175 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
11176 "uniform memoryOffset "
11177 "is 0x";
11178 const char *bind_null_buffer_message = "In vkBindBufferMemory, attempting"
11179 " to Bind Obj(0x";
11180 const char *free_invalid_buffer_message = "Request to delete memory "
11181 "object 0x";
11182
11183 ASSERT_NO_FATAL_FAILURE(InitState());
11184 ASSERT_NO_FATAL_FAILURE(InitViewport());
11185 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11186
11187 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11188 pipe_ms_state_ci.sType =
11189 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11190 pipe_ms_state_ci.pNext = NULL;
11191 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11192 pipe_ms_state_ci.sampleShadingEnable = 0;
11193 pipe_ms_state_ci.minSampleShading = 1.0;
11194 pipe_ms_state_ci.pSampleMask = nullptr;
11195
11196 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11197 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11198 VkPipelineLayout pipeline_layout;
11199
11200 VkResult err = vkCreatePipelineLayout(m_device->device(),
11201 &pipeline_layout_ci, nullptr,
11202 &pipeline_layout);
11203 ASSERT_VK_SUCCESS(err);
11204
11205 VkShaderObj vs(m_device, bindStateVertShaderText,
11206 VK_SHADER_STAGE_VERTEX_BIT, this);
11207 VkShaderObj fs(m_device, bindStateFragShaderText,
11208 VK_SHADER_STAGE_FRAGMENT_BIT,
11209 this);
11210 VkPipelineObj pipe(m_device);
11211 pipe.AddShader(&vs);
11212 pipe.AddShader(&fs);
11213 pipe.AddColorAttachment();
11214 pipe.SetMSAA(&pipe_ms_state_ci);
11215 pipe.SetViewport(m_viewports);
11216 pipe.SetScissor(m_scissors);
11217 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11218
11219 BeginCommandBuffer();
11220 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11221 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11222
11223 {
11224 // Create and bind a vertex buffer in a reduced scope, which will cause
11225 // it to be deleted upon leaving this scope
11226 const float vbo_data[3] = {1.f, 0.f, 1.f};
11227 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data),
11228 3, vbo_data);
11229 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11230 draw_verticies.AddVertexInputToPipe(pipe);
11231 }
11232
11233 Draw(1, 0, 0, 0);
11234
11235 EndCommandBuffer();
11236
11237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11238 deleted_buffer_in_command_buffer);
11239 QueueCommandBuffer(false);
11240 m_errorMonitor->VerifyFound();
11241
11242 {
11243 // Create and bind a vertex buffer in a reduced scope, and delete it
11244 // twice, the second through the destructor
11245 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11246 VkBufferTest::eDoubleDelete);
11247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11248 double_destroy_message);
11249 buffer_test.TestDoubleDestroy();
11250 }
11251 m_errorMonitor->VerifyFound();
11252
11253 if (VkBufferTest::
11254 GetTestConditionValid(m_device,
11255 VkBufferTest::eInvalidMemoryOffset)) {
11256 // Create and bind a memory buffer with an invalid offset.
11257 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11258 invalid_offset_message);
11259 VkBufferTest buffer_test(m_device,
11260 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
11261 VkBufferTest::eInvalidMemoryOffset);
11262 (void) buffer_test;
11263 m_errorMonitor->VerifyFound();
11264 }
11265
11266 if (VkBufferTest::
11267 GetTestConditionValid(m_device,
11268 VkBufferTest::eInvalidDeviceOffset,
11269 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
11270 // Create and bind a memory buffer with an invalid offset again,
11271 // but look for a texel buffer message.
11272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11273 invalid_texel_buffer_offset_message);
11274 VkBufferTest buffer_test(m_device,
11275 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
11276 VkBufferTest::eInvalidDeviceOffset);
11277 (void) buffer_test;
11278 m_errorMonitor->VerifyFound();
11279 }
11280
11281 if (VkBufferTest::
11282 GetTestConditionValid(m_device,
11283 VkBufferTest::eInvalidDeviceOffset,
11284 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
11285 // Create and bind a memory buffer with an invalid offset again, but
11286 // look for a uniform buffer message.
11287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11288 invalid_uniform_buffer_offset_message);
11289 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
11290 VkBufferTest::eInvalidDeviceOffset);
11291 (void) buffer_test;
11292 m_errorMonitor->VerifyFound();
11293 }
11294
11295 if (VkBufferTest::
11296 GetTestConditionValid(m_device,
11297 VkBufferTest::eInvalidDeviceOffset,
11298 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
11299 // Create and bind a memory buffer with an invalid offset again, but
11300 // look for a storage buffer message.
11301 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11302 invalid_storage_buffer_offset_message);
11303 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11304 VkBufferTest::eInvalidDeviceOffset);
11305 (void) buffer_test;
11306 m_errorMonitor->VerifyFound();
11307 }
11308
11309 {
11310 // Attempt to bind a null buffer.
11311 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11312 bind_null_buffer_message);
11313 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11314 VkBufferTest::eBindNullBuffer);
11315 (void) buffer_test;
11316 m_errorMonitor->VerifyFound();
11317 }
11318
11319 {
11320 // Attempt to use an invalid handle to delete a buffer.
11321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11322 free_invalid_buffer_message);
11323 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11324 VkBufferTest::eFreeInvalidHandle);
11325 (void) buffer_test;
11326 }
11327 m_errorMonitor->VerifyFound();
11328
11329 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11330}
11331
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011332// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11333TEST_F(VkLayerTest, InvalidImageLayout) {
11334 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
11335 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11336 "images in the wrong layout when they're copied or transitioned.");
11337 // 3 in ValidateCmdBufImageLayouts
11338 // * -1 Attempt to submit cmd buf w/ deleted image
11339 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11340 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
11341 m_errorMonitor->SetDesiredFailureMsg(
11342 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11343 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11344
11345 ASSERT_NO_FATAL_FAILURE(InitState());
11346 // Create src & dst images to use for copy operations
11347 VkImage src_image;
11348 VkImage dst_image;
11349
11350 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11351 const int32_t tex_width = 32;
11352 const int32_t tex_height = 32;
11353
11354 VkImageCreateInfo image_create_info = {};
11355 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11356 image_create_info.pNext = NULL;
11357 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11358 image_create_info.format = tex_format;
11359 image_create_info.extent.width = tex_width;
11360 image_create_info.extent.height = tex_height;
11361 image_create_info.extent.depth = 1;
11362 image_create_info.mipLevels = 1;
11363 image_create_info.arrayLayers = 4;
11364 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11365 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11366 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11367 image_create_info.flags = 0;
11368
11369 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11370 ASSERT_VK_SUCCESS(err);
11371 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11372 ASSERT_VK_SUCCESS(err);
11373
11374 BeginCommandBuffer();
11375 VkImageCopy copyRegion;
11376 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11377 copyRegion.srcSubresource.mipLevel = 0;
11378 copyRegion.srcSubresource.baseArrayLayer = 0;
11379 copyRegion.srcSubresource.layerCount = 1;
11380 copyRegion.srcOffset.x = 0;
11381 copyRegion.srcOffset.y = 0;
11382 copyRegion.srcOffset.z = 0;
11383 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11384 copyRegion.dstSubresource.mipLevel = 0;
11385 copyRegion.dstSubresource.baseArrayLayer = 0;
11386 copyRegion.dstSubresource.layerCount = 1;
11387 copyRegion.dstOffset.x = 0;
11388 copyRegion.dstOffset.y = 0;
11389 copyRegion.dstOffset.z = 0;
11390 copyRegion.extent.width = 1;
11391 copyRegion.extent.height = 1;
11392 copyRegion.extent.depth = 1;
11393 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11394 m_errorMonitor->VerifyFound();
11395 // Now cause error due to src image layout changing
11396 m_errorMonitor->SetDesiredFailureMsg(
11397 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11398 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
11399 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11400 m_errorMonitor->VerifyFound();
11401 // Final src error is due to bad layout type
11402 m_errorMonitor->SetDesiredFailureMsg(
11403 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11404 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
11405 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11406 m_errorMonitor->VerifyFound();
11407 // Now verify same checks for dst
11408 m_errorMonitor->SetDesiredFailureMsg(
11409 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11410 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
11411 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11412 m_errorMonitor->VerifyFound();
11413 // Now cause error due to src image layout changing
11414 m_errorMonitor->SetDesiredFailureMsg(
11415 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11416 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
11417 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
11418 m_errorMonitor->VerifyFound();
11419 m_errorMonitor->SetDesiredFailureMsg(
11420 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11421 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
11422 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
11423 m_errorMonitor->VerifyFound();
11424 // Now cause error due to bad image layout transition in PipelineBarrier
11425 VkImageMemoryBarrier image_barrier[1] = {};
11426 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11427 image_barrier[0].image = src_image;
11428 image_barrier[0].subresourceRange.layerCount = 2;
11429 image_barrier[0].subresourceRange.levelCount = 2;
11430 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11431 m_errorMonitor->SetDesiredFailureMsg(
11432 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11433 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
11434 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
11435 m_errorMonitor->VerifyFound();
11436
11437 // Finally some layout errors at RenderPass create time
11438 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11439 VkAttachmentReference attach = {};
11440 // perf warning for GENERAL layout w/ non-DS input attachment
11441 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11442 VkSubpassDescription subpass = {};
11443 subpass.inputAttachmentCount = 1;
11444 subpass.pInputAttachments = &attach;
11445 VkRenderPassCreateInfo rpci = {};
11446 rpci.subpassCount = 1;
11447 rpci.pSubpasses = &subpass;
11448 rpci.attachmentCount = 1;
11449 VkAttachmentDescription attach_desc = {};
11450 attach_desc.format = VK_FORMAT_UNDEFINED;
11451 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011452 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011453 VkRenderPass rp;
11454 m_errorMonitor->SetDesiredFailureMsg(
11455 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11456 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
11457 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11458 m_errorMonitor->VerifyFound();
11459 // error w/ non-general layout
11460 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11461
11462 m_errorMonitor->SetDesiredFailureMsg(
11463 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11464 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11465 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11466 m_errorMonitor->VerifyFound();
11467 subpass.inputAttachmentCount = 0;
11468 subpass.colorAttachmentCount = 1;
11469 subpass.pColorAttachments = &attach;
11470 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11471 // perf warning for GENERAL layout on color attachment
11472 m_errorMonitor->SetDesiredFailureMsg(
11473 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11474 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
11475 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11476 m_errorMonitor->VerifyFound();
11477 // error w/ non-color opt or GENERAL layout for color attachment
11478 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11479 m_errorMonitor->SetDesiredFailureMsg(
11480 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11481 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11482 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11483 m_errorMonitor->VerifyFound();
11484 subpass.colorAttachmentCount = 0;
11485 subpass.pDepthStencilAttachment = &attach;
11486 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11487 // perf warning for GENERAL layout on DS attachment
11488 m_errorMonitor->SetDesiredFailureMsg(
11489 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11490 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
11491 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11492 m_errorMonitor->VerifyFound();
11493 // error w/ non-ds opt or GENERAL layout for color attachment
11494 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11495 m_errorMonitor->SetDesiredFailureMsg(
11496 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11497 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
11498 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11499 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060011500 // For this error we need a valid renderpass so create default one
11501 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11502 attach.attachment = 0;
11503 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
11504 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
11505 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
11506 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
11507 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
11508 // Can't do a CLEAR load on READ_ONLY initialLayout
11509 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
11510 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11511 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11512 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11513 " with invalid first layout "
11514 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
11515 "ONLY_OPTIMAL");
11516 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11517 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011518
11519 vkDestroyImage(m_device->device(), src_image, NULL);
11520 vkDestroyImage(m_device->device(), dst_image, NULL);
11521}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011522#endif // DRAW_STATE_TESTS
11523
Tobin Ehlis0788f522015-05-26 16:11:58 -060011524#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060011525#if GTEST_IS_THREADSAFE
11526struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011527 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011528 VkEvent event;
11529 bool bailout;
11530};
11531
Karl Schultz6addd812016-02-02 17:17:23 -070011532extern "C" void *AddToCommandBuffer(void *arg) {
11533 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011534
Karl Schultz6addd812016-02-02 17:17:23 -070011535 for (int i = 0; i < 10000; i++) {
11536 vkCmdSetEvent(data->commandBuffer, data->event,
11537 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011538 if (data->bailout) {
11539 break;
11540 }
11541 }
11542 return NULL;
11543}
11544
Karl Schultz6addd812016-02-02 17:17:23 -070011545TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011546 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011547
Karl Schultz6addd812016-02-02 17:17:23 -070011548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11549 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011550
Mike Stroyanaccf7692015-05-12 16:00:45 -060011551 ASSERT_NO_FATAL_FAILURE(InitState());
11552 ASSERT_NO_FATAL_FAILURE(InitViewport());
11553 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11554
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011555 // Calls AllocateCommandBuffers
11556 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060011557
11558 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011559 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011560
11561 VkEventCreateInfo event_info;
11562 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011563 VkResult err;
11564
11565 memset(&event_info, 0, sizeof(event_info));
11566 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11567
Chia-I Wuf7458c52015-10-26 21:10:41 +080011568 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011569 ASSERT_VK_SUCCESS(err);
11570
Mike Stroyanaccf7692015-05-12 16:00:45 -060011571 err = vkResetEvent(device(), event);
11572 ASSERT_VK_SUCCESS(err);
11573
11574 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011575 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011576 data.event = event;
11577 data.bailout = false;
11578 m_errorMonitor->SetBailout(&data.bailout);
11579 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011580 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011581 // Add many entries to command buffer from this thread at the same time.
11582 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060011583
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011584 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011585 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011586
Mike Stroyan10b8cb72016-01-22 15:22:03 -070011587 m_errorMonitor->SetBailout(NULL);
11588
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011589 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011590
Chia-I Wuf7458c52015-10-26 21:10:41 +080011591 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011592}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011593#endif // GTEST_IS_THREADSAFE
11594#endif // THREADING_TESTS
11595
Chris Forbes9f7ff632015-05-25 11:13:08 +120011596#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070011597TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011598 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011599 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011600
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011601 ASSERT_NO_FATAL_FAILURE(InitState());
11602 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11603
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011604 VkShaderModule module;
11605 VkShaderModuleCreateInfo moduleCreateInfo;
11606 struct icd_spv_header spv;
11607
11608 spv.magic = ICD_SPV_MAGIC;
11609 spv.version = ICD_SPV_VERSION;
11610 spv.gen_magic = 0;
11611
11612 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
11613 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070011614 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011615 moduleCreateInfo.codeSize = 4;
11616 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011617 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011618
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011619 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011620}
11621
Karl Schultz6addd812016-02-02 17:17:23 -070011622TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011623 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011624 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011625
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011626 ASSERT_NO_FATAL_FAILURE(InitState());
11627 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11628
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011629 VkShaderModule module;
11630 VkShaderModuleCreateInfo moduleCreateInfo;
11631 struct icd_spv_header spv;
11632
11633 spv.magic = ~ICD_SPV_MAGIC;
11634 spv.version = ICD_SPV_VERSION;
11635 spv.gen_magic = 0;
11636
11637 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
11638 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070011639 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011640 moduleCreateInfo.codeSize = sizeof(spv) + 10;
11641 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011642 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011643
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011644 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011645}
11646
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011647#if 0
11648// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070011649TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011651 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011652
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011653 ASSERT_NO_FATAL_FAILURE(InitState());
11654 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11655
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011656 VkShaderModule module;
11657 VkShaderModuleCreateInfo moduleCreateInfo;
11658 struct icd_spv_header spv;
11659
11660 spv.magic = ICD_SPV_MAGIC;
11661 spv.version = ~ICD_SPV_VERSION;
11662 spv.gen_magic = 0;
11663
11664 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
11665 moduleCreateInfo.pNext = NULL;
11666
Karl Schultz6addd812016-02-02 17:17:23 -070011667 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011668 moduleCreateInfo.codeSize = sizeof(spv) + 10;
11669 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011670 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011671
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011672 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011673}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011674#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011675
Karl Schultz6addd812016-02-02 17:17:23 -070011676TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070011677 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011678 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011679
Chris Forbes9f7ff632015-05-25 11:13:08 +120011680 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060011681 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120011682
11683 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011684 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120011685 "\n"
11686 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070011687 "out gl_PerVertex {\n"
11688 " vec4 gl_Position;\n"
11689 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120011690 "void main(){\n"
11691 " gl_Position = vec4(1);\n"
11692 " x = 0;\n"
11693 "}\n";
11694 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011695 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120011696 "\n"
11697 "layout(location=0) out vec4 color;\n"
11698 "void main(){\n"
11699 " color = vec4(1);\n"
11700 "}\n";
11701
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060011702 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11703 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120011704
11705 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080011706 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120011707 pipe.AddShader(&vs);
11708 pipe.AddShader(&fs);
11709
Chris Forbes9f7ff632015-05-25 11:13:08 +120011710 VkDescriptorSetObj descriptorSet(m_device);
11711 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011712 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120011713
Tony Barbour5781e8f2015-08-04 16:23:11 -060011714 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120011715
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011716 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120011717}
Chris Forbes9f7ff632015-05-25 11:13:08 +120011718
Karl Schultz6addd812016-02-02 17:17:23 -070011719TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011721 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011722
Chris Forbes59cb88d2015-05-25 11:13:13 +120011723 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060011724 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120011725
11726 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011727 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120011728 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070011729 "out gl_PerVertex {\n"
11730 " vec4 gl_Position;\n"
11731 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120011732 "void main(){\n"
11733 " gl_Position = vec4(1);\n"
11734 "}\n";
11735 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011736 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120011737 "\n"
11738 "layout(location=0) in float x;\n"
11739 "layout(location=0) out vec4 color;\n"
11740 "void main(){\n"
11741 " color = vec4(x);\n"
11742 "}\n";
11743
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060011744 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11745 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120011746
11747 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080011748 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120011749 pipe.AddShader(&vs);
11750 pipe.AddShader(&fs);
11751
Chris Forbes59cb88d2015-05-25 11:13:13 +120011752 VkDescriptorSetObj descriptorSet(m_device);
11753 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011754 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120011755
Tony Barbour5781e8f2015-08-04 16:23:11 -060011756 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120011757
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011758 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120011759}
11760
Karl Schultz6addd812016-02-02 17:17:23 -070011761TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +130011762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011763 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130011764
11765 ASSERT_NO_FATAL_FAILURE(InitState());
11766 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11767
11768 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011769 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130011770 "\n"
11771 "out gl_PerVertex {\n"
11772 " vec4 gl_Position;\n"
11773 "};\n"
11774 "void main(){\n"
11775 " gl_Position = vec4(1);\n"
11776 "}\n";
11777 char const *fsSource =
11778 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130011779 "\n"
11780 "in block { layout(location=0) float x; } ins;\n"
11781 "layout(location=0) out vec4 color;\n"
11782 "void main(){\n"
11783 " color = vec4(ins.x);\n"
11784 "}\n";
11785
11786 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11787 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11788
11789 VkPipelineObj pipe(m_device);
11790 pipe.AddColorAttachment();
11791 pipe.AddShader(&vs);
11792 pipe.AddShader(&fs);
11793
11794 VkDescriptorSetObj descriptorSet(m_device);
11795 descriptorSet.AppendDummy();
11796 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11797
11798 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11799
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011800 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130011801}
11802
Karl Schultz6addd812016-02-02 17:17:23 -070011803TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +130011804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +130011805 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -070011806 "output arr[2] of float32' vs 'ptr to "
11807 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130011808
11809 ASSERT_NO_FATAL_FAILURE(InitState());
11810 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11811
11812 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011813 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130011814 "\n"
11815 "layout(location=0) out float x[2];\n"
11816 "out gl_PerVertex {\n"
11817 " vec4 gl_Position;\n"
11818 "};\n"
11819 "void main(){\n"
11820 " x[0] = 0; x[1] = 0;\n"
11821 " gl_Position = vec4(1);\n"
11822 "}\n";
11823 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011824 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130011825 "\n"
11826 "layout(location=0) in float x[3];\n"
11827 "layout(location=0) out vec4 color;\n"
11828 "void main(){\n"
11829 " color = vec4(x[0] + x[1] + x[2]);\n"
11830 "}\n";
11831
11832 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11833 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11834
11835 VkPipelineObj pipe(m_device);
11836 pipe.AddColorAttachment();
11837 pipe.AddShader(&vs);
11838 pipe.AddShader(&fs);
11839
11840 VkDescriptorSetObj descriptorSet(m_device);
11841 descriptorSet.AppendDummy();
11842 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11843
11844 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11845
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011846 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130011847}
11848
Karl Schultz6addd812016-02-02 17:17:23 -070011849TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011851 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011852
Chris Forbesb56af562015-05-25 11:13:17 +120011853 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060011854 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120011855
11856 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011857 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120011858 "\n"
11859 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070011860 "out gl_PerVertex {\n"
11861 " vec4 gl_Position;\n"
11862 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +120011863 "void main(){\n"
11864 " x = 0;\n"
11865 " gl_Position = vec4(1);\n"
11866 "}\n";
11867 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011868 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120011869 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070011870 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +120011871 "layout(location=0) out vec4 color;\n"
11872 "void main(){\n"
11873 " color = vec4(x);\n"
11874 "}\n";
11875
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060011876 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11877 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120011878
11879 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080011880 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120011881 pipe.AddShader(&vs);
11882 pipe.AddShader(&fs);
11883
Chris Forbesb56af562015-05-25 11:13:17 +120011884 VkDescriptorSetObj descriptorSet(m_device);
11885 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011886 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120011887
Tony Barbour5781e8f2015-08-04 16:23:11 -060011888 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120011889
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011890 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120011891}
11892
Karl Schultz6addd812016-02-02 17:17:23 -070011893TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +130011894 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011895 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130011896
11897 ASSERT_NO_FATAL_FAILURE(InitState());
11898 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11899
11900 char const *vsSource =
11901 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130011902 "\n"
11903 "out block { layout(location=0) int x; } outs;\n"
11904 "out gl_PerVertex {\n"
11905 " vec4 gl_Position;\n"
11906 "};\n"
11907 "void main(){\n"
11908 " outs.x = 0;\n"
11909 " gl_Position = vec4(1);\n"
11910 "}\n";
11911 char const *fsSource =
11912 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130011913 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070011914 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +130011915 "layout(location=0) out vec4 color;\n"
11916 "void main(){\n"
11917 " color = vec4(ins.x);\n"
11918 "}\n";
11919
11920 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11921 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11922
11923 VkPipelineObj pipe(m_device);
11924 pipe.AddColorAttachment();
11925 pipe.AddShader(&vs);
11926 pipe.AddShader(&fs);
11927
11928 VkDescriptorSetObj descriptorSet(m_device);
11929 descriptorSet.AppendDummy();
11930 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11931
11932 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11933
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011934 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130011935}
11936
11937TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
11938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11939 "location 0.0 which is not written by vertex shader");
11940
11941 ASSERT_NO_FATAL_FAILURE(InitState());
11942 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11943
11944 char const *vsSource =
11945 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130011946 "\n"
11947 "out block { layout(location=1) float x; } outs;\n"
11948 "out gl_PerVertex {\n"
11949 " vec4 gl_Position;\n"
11950 "};\n"
11951 "void main(){\n"
11952 " outs.x = 0;\n"
11953 " gl_Position = vec4(1);\n"
11954 "}\n";
11955 char const *fsSource =
11956 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130011957 "\n"
11958 "in block { layout(location=0) float x; } ins;\n"
11959 "layout(location=0) out vec4 color;\n"
11960 "void main(){\n"
11961 " color = vec4(ins.x);\n"
11962 "}\n";
11963
11964 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11965 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11966
11967 VkPipelineObj pipe(m_device);
11968 pipe.AddColorAttachment();
11969 pipe.AddShader(&vs);
11970 pipe.AddShader(&fs);
11971
11972 VkDescriptorSetObj descriptorSet(m_device);
11973 descriptorSet.AppendDummy();
11974 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11975
11976 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11977
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011978 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130011979}
11980
11981TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
11982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11983 "location 0.1 which is not written by vertex shader");
11984
11985 ASSERT_NO_FATAL_FAILURE(InitState());
11986 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11987
11988 char const *vsSource =
11989 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130011990 "\n"
11991 "out block { layout(location=0, component=0) float x; } outs;\n"
11992 "out gl_PerVertex {\n"
11993 " vec4 gl_Position;\n"
11994 "};\n"
11995 "void main(){\n"
11996 " outs.x = 0;\n"
11997 " gl_Position = vec4(1);\n"
11998 "}\n";
11999 char const *fsSource =
12000 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012001 "\n"
12002 "in block { layout(location=0, component=1) float x; } ins;\n"
12003 "layout(location=0) out vec4 color;\n"
12004 "void main(){\n"
12005 " color = vec4(ins.x);\n"
12006 "}\n";
12007
12008 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12009 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12010
12011 VkPipelineObj pipe(m_device);
12012 pipe.AddColorAttachment();
12013 pipe.AddShader(&vs);
12014 pipe.AddShader(&fs);
12015
12016 VkDescriptorSetObj descriptorSet(m_device);
12017 descriptorSet.AppendDummy();
12018 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12019
12020 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12021
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012022 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012023}
12024
Karl Schultz6addd812016-02-02 17:17:23 -070012025TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012027 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012028
Chris Forbesde136e02015-05-25 11:13:28 +120012029 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012030 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120012031
12032 VkVertexInputBindingDescription input_binding;
12033 memset(&input_binding, 0, sizeof(input_binding));
12034
12035 VkVertexInputAttributeDescription input_attrib;
12036 memset(&input_attrib, 0, sizeof(input_attrib));
12037 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12038
12039 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012040 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012041 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012042 "out gl_PerVertex {\n"
12043 " vec4 gl_Position;\n"
12044 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012045 "void main(){\n"
12046 " gl_Position = vec4(1);\n"
12047 "}\n";
12048 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012049 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012050 "\n"
12051 "layout(location=0) out vec4 color;\n"
12052 "void main(){\n"
12053 " color = vec4(1);\n"
12054 "}\n";
12055
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012056 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12057 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120012058
12059 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012060 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120012061 pipe.AddShader(&vs);
12062 pipe.AddShader(&fs);
12063
12064 pipe.AddVertexInputBindings(&input_binding, 1);
12065 pipe.AddVertexInputAttribs(&input_attrib, 1);
12066
Chris Forbesde136e02015-05-25 11:13:28 +120012067 VkDescriptorSetObj descriptorSet(m_device);
12068 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012069 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120012070
Tony Barbour5781e8f2015-08-04 16:23:11 -060012071 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120012072
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012073 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120012074}
12075
Karl Schultz6addd812016-02-02 17:17:23 -070012076TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012078 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +130012079
12080 ASSERT_NO_FATAL_FAILURE(InitState());
12081 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12082
12083 VkVertexInputBindingDescription input_binding;
12084 memset(&input_binding, 0, sizeof(input_binding));
12085
12086 VkVertexInputAttributeDescription input_attrib;
12087 memset(&input_attrib, 0, sizeof(input_attrib));
12088 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12089
12090 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012091 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130012092 "\n"
12093 "layout(location=1) in float x;\n"
12094 "out gl_PerVertex {\n"
12095 " vec4 gl_Position;\n"
12096 "};\n"
12097 "void main(){\n"
12098 " gl_Position = vec4(x);\n"
12099 "}\n";
12100 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012101 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130012102 "\n"
12103 "layout(location=0) out vec4 color;\n"
12104 "void main(){\n"
12105 " color = vec4(1);\n"
12106 "}\n";
12107
12108 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12109 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12110
12111 VkPipelineObj pipe(m_device);
12112 pipe.AddColorAttachment();
12113 pipe.AddShader(&vs);
12114 pipe.AddShader(&fs);
12115
12116 pipe.AddVertexInputBindings(&input_binding, 1);
12117 pipe.AddVertexInputAttribs(&input_attrib, 1);
12118
12119 VkDescriptorSetObj descriptorSet(m_device);
12120 descriptorSet.AppendDummy();
12121 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12122
12123 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12124
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012125 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130012126}
12127
Karl Schultz6addd812016-02-02 17:17:23 -070012128TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
12129 m_errorMonitor->SetDesiredFailureMsg(
12130 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012131 "VS consumes input at location 0 but not provided");
12132
Chris Forbes62e8e502015-05-25 11:13:29 +120012133 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012134 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120012135
12136 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012137 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012138 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012139 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -070012140 "out gl_PerVertex {\n"
12141 " vec4 gl_Position;\n"
12142 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012143 "void main(){\n"
12144 " gl_Position = x;\n"
12145 "}\n";
12146 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012147 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012148 "\n"
12149 "layout(location=0) out vec4 color;\n"
12150 "void main(){\n"
12151 " color = vec4(1);\n"
12152 "}\n";
12153
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012154 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12155 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120012156
12157 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012158 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120012159 pipe.AddShader(&vs);
12160 pipe.AddShader(&fs);
12161
Chris Forbes62e8e502015-05-25 11:13:29 +120012162 VkDescriptorSetObj descriptorSet(m_device);
12163 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012164 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120012165
Tony Barbour5781e8f2015-08-04 16:23:11 -060012166 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120012167
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012168 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120012169}
12170
Karl Schultz6addd812016-02-02 17:17:23 -070012171TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
12172 m_errorMonitor->SetDesiredFailureMsg(
12173 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012174 "location 0 does not match VS input type");
12175
Chris Forbesc97d98e2015-05-25 11:13:31 +120012176 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012177 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120012178
12179 VkVertexInputBindingDescription input_binding;
12180 memset(&input_binding, 0, sizeof(input_binding));
12181
12182 VkVertexInputAttributeDescription input_attrib;
12183 memset(&input_attrib, 0, sizeof(input_attrib));
12184 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12185
12186 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012187 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012188 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012189 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070012190 "out gl_PerVertex {\n"
12191 " vec4 gl_Position;\n"
12192 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012193 "void main(){\n"
12194 " gl_Position = vec4(x);\n"
12195 "}\n";
12196 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012197 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012198 "\n"
12199 "layout(location=0) out vec4 color;\n"
12200 "void main(){\n"
12201 " color = vec4(1);\n"
12202 "}\n";
12203
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012204 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12205 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120012206
12207 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012208 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120012209 pipe.AddShader(&vs);
12210 pipe.AddShader(&fs);
12211
12212 pipe.AddVertexInputBindings(&input_binding, 1);
12213 pipe.AddVertexInputAttribs(&input_attrib, 1);
12214
Chris Forbesc97d98e2015-05-25 11:13:31 +120012215 VkDescriptorSetObj descriptorSet(m_device);
12216 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012217 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120012218
Tony Barbour5781e8f2015-08-04 16:23:11 -060012219 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120012220
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012221 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120012222}
12223
Chris Forbesc68b43c2016-04-06 11:18:47 +120012224TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
12225 m_errorMonitor->SetDesiredFailureMsg(
12226 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12227 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
12228
12229 ASSERT_NO_FATAL_FAILURE(InitState());
12230 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12231
12232 char const *vsSource =
12233 "#version 450\n"
12234 "\n"
12235 "out gl_PerVertex {\n"
12236 " vec4 gl_Position;\n"
12237 "};\n"
12238 "void main(){\n"
12239 " gl_Position = vec4(1);\n"
12240 "}\n";
12241 char const *fsSource =
12242 "#version 450\n"
12243 "\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(&vs);
12256 pipe.AddShader(&fs);
12257
12258 VkDescriptorSetObj descriptorSet(m_device);
12259 descriptorSet.AppendDummy();
12260 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12261
12262 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12263
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012264 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120012265}
12266
Karl Schultz6addd812016-02-02 17:17:23 -070012267TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012268 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130012269
12270 ASSERT_NO_FATAL_FAILURE(InitState());
12271 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12272
12273 VkVertexInputBindingDescription input_binding;
12274 memset(&input_binding, 0, sizeof(input_binding));
12275
12276 VkVertexInputAttributeDescription input_attribs[2];
12277 memset(input_attribs, 0, sizeof(input_attribs));
12278
12279 for (int i = 0; i < 2; i++) {
12280 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12281 input_attribs[i].location = i;
12282 }
12283
12284 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012285 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012286 "\n"
12287 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012288 "out gl_PerVertex {\n"
12289 " vec4 gl_Position;\n"
12290 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012291 "void main(){\n"
12292 " gl_Position = x[0] + x[1];\n"
12293 "}\n";
12294 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012295 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012296 "\n"
12297 "layout(location=0) out vec4 color;\n"
12298 "void main(){\n"
12299 " color = vec4(1);\n"
12300 "}\n";
12301
12302 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12303 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12304
12305 VkPipelineObj pipe(m_device);
12306 pipe.AddColorAttachment();
12307 pipe.AddShader(&vs);
12308 pipe.AddShader(&fs);
12309
12310 pipe.AddVertexInputBindings(&input_binding, 1);
12311 pipe.AddVertexInputAttribs(input_attribs, 2);
12312
12313 VkDescriptorSetObj descriptorSet(m_device);
12314 descriptorSet.AppendDummy();
12315 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12316
12317 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12318
12319 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012320 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130012321}
12322
Chris Forbes2682b242015-11-24 11:13:14 +130012323TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
12324{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012325 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130012326
12327 ASSERT_NO_FATAL_FAILURE(InitState());
12328 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12329
12330 VkVertexInputBindingDescription input_binding;
12331 memset(&input_binding, 0, sizeof(input_binding));
12332
12333 VkVertexInputAttributeDescription input_attribs[2];
12334 memset(input_attribs, 0, sizeof(input_attribs));
12335
12336 for (int i = 0; i < 2; i++) {
12337 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12338 input_attribs[i].location = i;
12339 }
12340
12341 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012342 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012343 "\n"
12344 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -070012345 "out gl_PerVertex {\n"
12346 " vec4 gl_Position;\n"
12347 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012348 "void main(){\n"
12349 " gl_Position = x[0] + x[1];\n"
12350 "}\n";
12351 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012352 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012353 "\n"
12354 "layout(location=0) out vec4 color;\n"
12355 "void main(){\n"
12356 " color = vec4(1);\n"
12357 "}\n";
12358
12359 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12360 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12361
12362 VkPipelineObj pipe(m_device);
12363 pipe.AddColorAttachment();
12364 pipe.AddShader(&vs);
12365 pipe.AddShader(&fs);
12366
12367 pipe.AddVertexInputBindings(&input_binding, 1);
12368 pipe.AddVertexInputAttribs(input_attribs, 2);
12369
12370 VkDescriptorSetObj descriptorSet(m_device);
12371 descriptorSet.AppendDummy();
12372 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12373
12374 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12375
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012376 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130012377}
Chris Forbes2682b242015-11-24 11:13:14 +130012378
Chris Forbesbc290ce2016-07-06 12:01:49 +120012379TEST_F(VkLayerTest, CreatePipelineAttribComponents)
12380{
12381 m_errorMonitor->ExpectSuccess();
12382
12383 ASSERT_NO_FATAL_FAILURE(InitState());
12384 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12385
12386 VkVertexInputBindingDescription input_binding;
12387 memset(&input_binding, 0, sizeof(input_binding));
12388
12389 VkVertexInputAttributeDescription input_attribs[3];
12390 memset(input_attribs, 0, sizeof(input_attribs));
12391
12392 for (int i = 0; i < 3; i++) {
12393 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12394 input_attribs[i].location = i;
12395 }
12396
12397 char const *vsSource =
12398 "#version 450\n"
12399 "\n"
12400 "layout(location=0) in vec4 x;\n"
12401 "layout(location=1) in vec3 y1;\n"
12402 "layout(location=1, component=3) in float y2;\n"
12403 "layout(location=2) in vec4 z;\n"
12404 "out gl_PerVertex {\n"
12405 " vec4 gl_Position;\n"
12406 "};\n"
12407 "void main(){\n"
12408 " gl_Position = x + vec4(y1, y2) + z;\n"
12409 "}\n";
12410 char const *fsSource =
12411 "#version 450\n"
12412 "\n"
12413 "layout(location=0) out vec4 color;\n"
12414 "void main(){\n"
12415 " color = vec4(1);\n"
12416 "}\n";
12417
12418 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12419 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12420
12421 VkPipelineObj pipe(m_device);
12422 pipe.AddColorAttachment();
12423 pipe.AddShader(&vs);
12424 pipe.AddShader(&fs);
12425
12426 pipe.AddVertexInputBindings(&input_binding, 1);
12427 pipe.AddVertexInputAttribs(input_attribs, 3);
12428
12429 VkDescriptorSetObj descriptorSet(m_device);
12430 descriptorSet.AppendDummy();
12431 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12432
12433 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12434
12435 m_errorMonitor->VerifyNotFound();
12436}
12437
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012438TEST_F(VkLayerTest, CreatePipelineSimplePositive)
12439{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012440 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012441
12442 ASSERT_NO_FATAL_FAILURE(InitState());
12443 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12444
12445 char const *vsSource =
12446 "#version 450\n"
12447 "out gl_PerVertex {\n"
12448 " vec4 gl_Position;\n"
12449 "};\n"
12450 "void main(){\n"
12451 " gl_Position = vec4(0);\n"
12452 "}\n";
12453 char const *fsSource =
12454 "#version 450\n"
12455 "\n"
12456 "layout(location=0) out vec4 color;\n"
12457 "void main(){\n"
12458 " color = vec4(1);\n"
12459 "}\n";
12460
12461 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12462 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12463
12464 VkPipelineObj pipe(m_device);
12465 pipe.AddColorAttachment();
12466 pipe.AddShader(&vs);
12467 pipe.AddShader(&fs);
12468
12469 VkDescriptorSetObj descriptorSet(m_device);
12470 descriptorSet.AppendDummy();
12471 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12472
12473 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12474
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012475 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012476}
12477
Chris Forbes912c9192016-04-05 17:50:35 +120012478TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
12479{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012480 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +120012481
12482 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
12483
12484 ASSERT_NO_FATAL_FAILURE(InitState());
12485 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12486
12487 char const *vsSource =
12488 "#version 450\n"
12489 "out gl_PerVertex {\n"
12490 " vec4 gl_Position;\n"
12491 "};\n"
12492 "layout(location=0) out vec3 x;\n"
12493 "layout(location=1) out ivec3 y;\n"
12494 "layout(location=2) out vec3 z;\n"
12495 "void main(){\n"
12496 " gl_Position = vec4(0);\n"
12497 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
12498 "}\n";
12499 char const *fsSource =
12500 "#version 450\n"
12501 "\n"
12502 "layout(location=0) out vec4 color;\n"
12503 "layout(location=0) in float x;\n"
12504 "layout(location=1) flat in int y;\n"
12505 "layout(location=2) in vec2 z;\n"
12506 "void main(){\n"
12507 " color = vec4(1 + x + y + z.x);\n"
12508 "}\n";
12509
12510 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12511 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12512
12513 VkPipelineObj pipe(m_device);
12514 pipe.AddColorAttachment();
12515 pipe.AddShader(&vs);
12516 pipe.AddShader(&fs);
12517
12518 VkDescriptorSetObj descriptorSet(m_device);
12519 descriptorSet.AppendDummy();
12520 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12521
Mike Stroyan255e9582016-06-24 09:49:32 -060012522 VkResult err = VK_SUCCESS;
12523 err =
12524 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12525 ASSERT_VK_SUCCESS(err);
12526
Chris Forbes912c9192016-04-05 17:50:35 +120012527
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012528 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +120012529}
12530
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012531TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
12532{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012533 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012534
12535 ASSERT_NO_FATAL_FAILURE(InitState());
12536 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12537
Chris Forbesc1e852d2016-04-04 19:26:42 +120012538 if (!m_device->phy().features().tessellationShader) {
12539 printf("Device does not support tessellation shaders; skipped.\n");
12540 return;
12541 }
12542
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012543 char const *vsSource =
12544 "#version 450\n"
12545 "void main(){}\n";
12546 char const *tcsSource =
12547 "#version 450\n"
12548 "layout(location=0) out int x[];\n"
12549 "layout(vertices=3) out;\n"
12550 "void main(){\n"
12551 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
12552 " gl_TessLevelInner[0] = 1;\n"
12553 " x[gl_InvocationID] = gl_InvocationID;\n"
12554 "}\n";
12555 char const *tesSource =
12556 "#version 450\n"
12557 "layout(triangles, equal_spacing, cw) in;\n"
12558 "layout(location=0) in int x[];\n"
12559 "out gl_PerVertex { vec4 gl_Position; };\n"
12560 "void main(){\n"
12561 " gl_Position.xyz = gl_TessCoord;\n"
12562 " gl_Position.w = x[0] + x[1] + x[2];\n"
12563 "}\n";
12564 char const *fsSource =
12565 "#version 450\n"
12566 "layout(location=0) out vec4 color;\n"
12567 "void main(){\n"
12568 " color = vec4(1);\n"
12569 "}\n";
12570
12571 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12572 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
12573 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
12574 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12575
12576 VkPipelineInputAssemblyStateCreateInfo iasci{
12577 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
12578 nullptr,
12579 0,
12580 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
12581 VK_FALSE};
12582
Chris Forbesb4cacb62016-04-04 19:15:00 +120012583 VkPipelineTessellationStateCreateInfo tsci{
12584 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
12585 nullptr,
12586 0,
12587 3};
12588
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012589 VkPipelineObj pipe(m_device);
12590 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +120012591 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012592 pipe.AddColorAttachment();
12593 pipe.AddShader(&vs);
12594 pipe.AddShader(&tcs);
12595 pipe.AddShader(&tes);
12596 pipe.AddShader(&fs);
12597
12598 VkDescriptorSetObj descriptorSet(m_device);
12599 descriptorSet.AppendDummy();
12600 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12601
12602 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12603
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012604 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012605}
12606
Chris Forbesa0ab8152016-04-20 13:34:27 +120012607TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
12608{
12609 m_errorMonitor->ExpectSuccess();
12610
12611 ASSERT_NO_FATAL_FAILURE(InitState());
12612 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12613
12614 if (!m_device->phy().features().geometryShader) {
12615 printf("Device does not support geometry shaders; skipped.\n");
12616 return;
12617 }
12618
12619 char const *vsSource =
12620 "#version 450\n"
12621 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
12622 "void main(){\n"
12623 " vs_out.x = vec4(1);\n"
12624 "}\n";
12625 char const *gsSource =
12626 "#version 450\n"
12627 "layout(triangles) in;\n"
12628 "layout(triangle_strip, max_vertices=3) out;\n"
12629 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
12630 "out gl_PerVertex { vec4 gl_Position; };\n"
12631 "void main() {\n"
12632 " gl_Position = gs_in[0].x;\n"
12633 " EmitVertex();\n"
12634 "}\n";
12635 char const *fsSource =
12636 "#version 450\n"
12637 "layout(location=0) out vec4 color;\n"
12638 "void main(){\n"
12639 " color = vec4(1);\n"
12640 "}\n";
12641
12642 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12643 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
12644 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12645
12646 VkPipelineObj pipe(m_device);
12647 pipe.AddColorAttachment();
12648 pipe.AddShader(&vs);
12649 pipe.AddShader(&gs);
12650 pipe.AddShader(&fs);
12651
12652 VkDescriptorSetObj descriptorSet(m_device);
12653 descriptorSet.AppendDummy();
12654 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12655
12656 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12657
12658 m_errorMonitor->VerifyNotFound();
12659}
12660
Chris Forbesa0193bc2016-04-04 19:19:47 +120012661TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
12662{
12663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12664 "is per-vertex in tessellation control shader stage "
12665 "but per-patch in tessellation evaluation shader stage");
12666
12667 ASSERT_NO_FATAL_FAILURE(InitState());
12668 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12669
Chris Forbesc1e852d2016-04-04 19:26:42 +120012670 if (!m_device->phy().features().tessellationShader) {
12671 printf("Device does not support tessellation shaders; skipped.\n");
12672 return;
12673 }
12674
Chris Forbesa0193bc2016-04-04 19:19:47 +120012675 char const *vsSource =
12676 "#version 450\n"
12677 "void main(){}\n";
12678 char const *tcsSource =
12679 "#version 450\n"
12680 "layout(location=0) out int x[];\n"
12681 "layout(vertices=3) out;\n"
12682 "void main(){\n"
12683 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
12684 " gl_TessLevelInner[0] = 1;\n"
12685 " x[gl_InvocationID] = gl_InvocationID;\n"
12686 "}\n";
12687 char const *tesSource =
12688 "#version 450\n"
12689 "layout(triangles, equal_spacing, cw) in;\n"
12690 "layout(location=0) patch in int x;\n"
12691 "out gl_PerVertex { vec4 gl_Position; };\n"
12692 "void main(){\n"
12693 " gl_Position.xyz = gl_TessCoord;\n"
12694 " gl_Position.w = x;\n"
12695 "}\n";
12696 char const *fsSource =
12697 "#version 450\n"
12698 "layout(location=0) out vec4 color;\n"
12699 "void main(){\n"
12700 " color = vec4(1);\n"
12701 "}\n";
12702
12703 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12704 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
12705 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
12706 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12707
12708 VkPipelineInputAssemblyStateCreateInfo iasci{
12709 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
12710 nullptr,
12711 0,
12712 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
12713 VK_FALSE};
12714
12715 VkPipelineTessellationStateCreateInfo tsci{
12716 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
12717 nullptr,
12718 0,
12719 3};
12720
12721 VkPipelineObj pipe(m_device);
12722 pipe.SetInputAssembly(&iasci);
12723 pipe.SetTessellation(&tsci);
12724 pipe.AddColorAttachment();
12725 pipe.AddShader(&vs);
12726 pipe.AddShader(&tcs);
12727 pipe.AddShader(&tes);
12728 pipe.AddShader(&fs);
12729
12730 VkDescriptorSetObj descriptorSet(m_device);
12731 descriptorSet.AppendDummy();
12732 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12733
12734 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12735
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012736 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120012737}
12738
Karl Schultz6addd812016-02-02 17:17:23 -070012739TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
12740 m_errorMonitor->SetDesiredFailureMsg(
12741 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012742 "Duplicate vertex input binding descriptions for binding 0");
12743
Chris Forbes280ba2c2015-06-12 11:16:41 +120012744 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012745 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120012746
12747 /* Two binding descriptions for binding 0 */
12748 VkVertexInputBindingDescription input_bindings[2];
12749 memset(input_bindings, 0, sizeof(input_bindings));
12750
12751 VkVertexInputAttributeDescription input_attrib;
12752 memset(&input_attrib, 0, sizeof(input_attrib));
12753 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12754
12755 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012756 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120012757 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012758 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070012759 "out gl_PerVertex {\n"
12760 " vec4 gl_Position;\n"
12761 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120012762 "void main(){\n"
12763 " gl_Position = vec4(x);\n"
12764 "}\n";
12765 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012766 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120012767 "\n"
12768 "layout(location=0) out vec4 color;\n"
12769 "void main(){\n"
12770 " color = vec4(1);\n"
12771 "}\n";
12772
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012773 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12774 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120012775
12776 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012777 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120012778 pipe.AddShader(&vs);
12779 pipe.AddShader(&fs);
12780
12781 pipe.AddVertexInputBindings(input_bindings, 2);
12782 pipe.AddVertexInputAttribs(&input_attrib, 1);
12783
Chris Forbes280ba2c2015-06-12 11:16:41 +120012784 VkDescriptorSetObj descriptorSet(m_device);
12785 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012786 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120012787
Tony Barbour5781e8f2015-08-04 16:23:11 -060012788 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120012789
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012790 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120012791}
Chris Forbes8f68b562015-05-25 11:13:32 +120012792
Chris Forbes35efec72016-04-21 14:32:08 +120012793TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
12794 m_errorMonitor->ExpectSuccess();
12795
12796 ASSERT_NO_FATAL_FAILURE(InitState());
12797 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12798
Chris Forbes91cf3a82016-06-28 17:51:35 +120012799 if (!m_device->phy().features().shaderFloat64) {
Chris Forbes35efec72016-04-21 14:32:08 +120012800 printf("Device does not support 64bit vertex attributes; skipped.\n");
12801 return;
12802 }
12803
12804 VkVertexInputBindingDescription input_bindings[1];
12805 memset(input_bindings, 0, sizeof(input_bindings));
12806
12807 VkVertexInputAttributeDescription input_attribs[4];
12808 memset(input_attribs, 0, sizeof(input_attribs));
12809 input_attribs[0].location = 0;
12810 input_attribs[0].offset = 0;
12811 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
12812 input_attribs[1].location = 2;
12813 input_attribs[1].offset = 32;
12814 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
12815 input_attribs[2].location = 4;
12816 input_attribs[2].offset = 64;
12817 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
12818 input_attribs[3].location = 6;
12819 input_attribs[3].offset = 96;
12820 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
12821
12822 char const *vsSource =
12823 "#version 450\n"
12824 "\n"
12825 "layout(location=0) in dmat4 x;\n"
12826 "out gl_PerVertex {\n"
12827 " vec4 gl_Position;\n"
12828 "};\n"
12829 "void main(){\n"
12830 " gl_Position = vec4(x[0][0]);\n"
12831 "}\n";
12832 char const *fsSource =
12833 "#version 450\n"
12834 "\n"
12835 "layout(location=0) out vec4 color;\n"
12836 "void main(){\n"
12837 " color = vec4(1);\n"
12838 "}\n";
12839
12840 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12841 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12842
12843 VkPipelineObj pipe(m_device);
12844 pipe.AddColorAttachment();
12845 pipe.AddShader(&vs);
12846 pipe.AddShader(&fs);
12847
12848 pipe.AddVertexInputBindings(input_bindings, 1);
12849 pipe.AddVertexInputAttribs(input_attribs, 4);
12850
12851 VkDescriptorSetObj descriptorSet(m_device);
12852 descriptorSet.AppendDummy();
12853 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12854
12855 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12856
12857 m_errorMonitor->VerifyNotFound();
12858}
12859
Karl Schultz6addd812016-02-02 17:17:23 -070012860TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012862 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012863
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012864 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012865
12866 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012867 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012868 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012869 "out gl_PerVertex {\n"
12870 " vec4 gl_Position;\n"
12871 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012872 "void main(){\n"
12873 " gl_Position = vec4(1);\n"
12874 "}\n";
12875 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012876 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012877 "\n"
12878 "void main(){\n"
12879 "}\n";
12880
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012881 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12882 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012883
12884 VkPipelineObj pipe(m_device);
12885 pipe.AddShader(&vs);
12886 pipe.AddShader(&fs);
12887
Chia-I Wu08accc62015-07-07 11:50:03 +080012888 /* set up CB 0, not written */
12889 pipe.AddColorAttachment();
12890 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012891
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012892 VkDescriptorSetObj descriptorSet(m_device);
12893 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012894 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012895
Tony Barbour5781e8f2015-08-04 16:23:11 -060012896 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012897
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012898 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012899}
12900
Karl Schultz6addd812016-02-02 17:17:23 -070012901TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -070012902 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012903 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012904 "FS writes to output location 1 with no matching attachment");
12905
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012906 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012907
12908 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012909 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012910 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012911 "out gl_PerVertex {\n"
12912 " vec4 gl_Position;\n"
12913 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012914 "void main(){\n"
12915 " gl_Position = vec4(1);\n"
12916 "}\n";
12917 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012918 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012919 "\n"
12920 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012921 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012922 "void main(){\n"
12923 " x = vec4(1);\n"
12924 " y = vec4(1);\n"
12925 "}\n";
12926
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012927 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12928 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012929
12930 VkPipelineObj pipe(m_device);
12931 pipe.AddShader(&vs);
12932 pipe.AddShader(&fs);
12933
Chia-I Wu08accc62015-07-07 11:50:03 +080012934 /* set up CB 0, not written */
12935 pipe.AddColorAttachment();
12936 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012937 /* FS writes CB 1, but we don't configure it */
12938
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012939 VkDescriptorSetObj descriptorSet(m_device);
12940 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012941 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012942
Tony Barbour5781e8f2015-08-04 16:23:11 -060012943 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012944
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012945 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012946}
12947
Karl Schultz6addd812016-02-02 17:17:23 -070012948TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012950 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012951
Chris Forbesa36d69e2015-05-25 11:13:44 +120012952 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120012953
12954 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012955 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120012956 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012957 "out gl_PerVertex {\n"
12958 " vec4 gl_Position;\n"
12959 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120012960 "void main(){\n"
12961 " gl_Position = vec4(1);\n"
12962 "}\n";
12963 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012964 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120012965 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012966 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +120012967 "void main(){\n"
12968 " x = ivec4(1);\n"
12969 "}\n";
12970
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012971 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12972 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120012973
12974 VkPipelineObj pipe(m_device);
12975 pipe.AddShader(&vs);
12976 pipe.AddShader(&fs);
12977
Chia-I Wu08accc62015-07-07 11:50:03 +080012978 /* set up CB 0; type is UNORM by default */
12979 pipe.AddColorAttachment();
12980 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120012981
Chris Forbesa36d69e2015-05-25 11:13:44 +120012982 VkDescriptorSetObj descriptorSet(m_device);
12983 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012984 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120012985
Tony Barbour5781e8f2015-08-04 16:23:11 -060012986 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120012987
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012988 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120012989}
Chris Forbes7b1b8932015-06-05 14:43:36 +120012990
Karl Schultz6addd812016-02-02 17:17:23 -070012991TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012992 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012993 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012994
Chris Forbes556c76c2015-08-14 12:04:59 +120012995 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120012996
12997 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012998 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120012999 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013000 "out gl_PerVertex {\n"
13001 " vec4 gl_Position;\n"
13002 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013003 "void main(){\n"
13004 " gl_Position = vec4(1);\n"
13005 "}\n";
13006 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013007 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013008 "\n"
13009 "layout(location=0) out vec4 x;\n"
13010 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
13011 "void main(){\n"
13012 " x = vec4(bar.y);\n"
13013 "}\n";
13014
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013015 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13016 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120013017
Chris Forbes556c76c2015-08-14 12:04:59 +120013018 VkPipelineObj pipe(m_device);
13019 pipe.AddShader(&vs);
13020 pipe.AddShader(&fs);
13021
13022 /* set up CB 0; type is UNORM by default */
13023 pipe.AddColorAttachment();
13024 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13025
13026 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013027 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120013028
13029 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13030
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013031 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120013032}
13033
Chris Forbes5c59e902016-02-26 16:56:09 +130013034TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
13035 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13036 "not declared in layout");
13037
13038 ASSERT_NO_FATAL_FAILURE(InitState());
13039
13040 char const *vsSource =
13041 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130013042 "\n"
13043 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13044 "out gl_PerVertex {\n"
13045 " vec4 gl_Position;\n"
13046 "};\n"
13047 "void main(){\n"
13048 " gl_Position = vec4(consts.x);\n"
13049 "}\n";
13050 char const *fsSource =
13051 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130013052 "\n"
13053 "layout(location=0) out vec4 x;\n"
13054 "void main(){\n"
13055 " x = vec4(1);\n"
13056 "}\n";
13057
13058 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13059 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13060
13061 VkPipelineObj pipe(m_device);
13062 pipe.AddShader(&vs);
13063 pipe.AddShader(&fs);
13064
13065 /* set up CB 0; type is UNORM by default */
13066 pipe.AddColorAttachment();
13067 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13068
13069 VkDescriptorSetObj descriptorSet(m_device);
13070 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13071
13072 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13073
13074 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013075 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130013076}
13077
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013078TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
13079 m_errorMonitor->SetDesiredFailureMsg(
13080 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13081 "Shader uses descriptor slot 0.0");
13082
13083 ASSERT_NO_FATAL_FAILURE(InitState());
13084
13085 char const *csSource =
13086 "#version 450\n"
13087 "\n"
13088 "layout(local_size_x=1) in;\n"
13089 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13090 "void main(){\n"
13091 " x = vec4(1);\n"
13092 "}\n";
13093
13094 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13095
13096 VkDescriptorSetObj descriptorSet(m_device);
13097 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13098
13099 VkComputePipelineCreateInfo cpci = {
13100 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13101 nullptr, 0, {
13102 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13103 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13104 cs.handle(), "main", nullptr
13105 },
13106 descriptorSet.GetPipelineLayout(),
13107 VK_NULL_HANDLE, -1
13108 };
13109
13110 VkPipeline pipe;
13111 VkResult err = vkCreateComputePipelines(
13112 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13113
13114 m_errorMonitor->VerifyFound();
13115
13116 if (err == VK_SUCCESS) {
13117 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13118 }
13119}
13120
13121TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
13122 m_errorMonitor->ExpectSuccess();
13123
13124 ASSERT_NO_FATAL_FAILURE(InitState());
13125
13126 char const *csSource =
13127 "#version 450\n"
13128 "\n"
13129 "layout(local_size_x=1) in;\n"
13130 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13131 "void main(){\n"
13132 " // x is not used.\n"
13133 "}\n";
13134
13135 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13136
13137 VkDescriptorSetObj descriptorSet(m_device);
13138 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13139
13140 VkComputePipelineCreateInfo cpci = {
13141 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13142 nullptr, 0, {
13143 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13144 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13145 cs.handle(), "main", nullptr
13146 },
13147 descriptorSet.GetPipelineLayout(),
13148 VK_NULL_HANDLE, -1
13149 };
13150
13151 VkPipeline pipe;
13152 VkResult err = vkCreateComputePipelines(
13153 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13154
13155 m_errorMonitor->VerifyNotFound();
13156
13157 if (err == VK_SUCCESS) {
13158 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13159 }
13160}
13161
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013162#endif // SHADER_CHECKER_TESTS
13163
13164#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060013165TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -070013166 m_errorMonitor->SetDesiredFailureMsg(
13167 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013168 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013169
13170 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013171
13172 // Create an image
13173 VkImage image;
13174
Karl Schultz6addd812016-02-02 17:17:23 -070013175 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13176 const int32_t tex_width = 32;
13177 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013178
13179 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013180 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13181 image_create_info.pNext = NULL;
13182 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13183 image_create_info.format = tex_format;
13184 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013185 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070013186 image_create_info.extent.depth = 1;
13187 image_create_info.mipLevels = 1;
13188 image_create_info.arrayLayers = 1;
13189 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13190 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13191 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13192 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013193
13194 // Introduce error by sending down a bogus width extent
13195 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013196 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013197
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013198 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013199}
13200
Mark Youngc48c4c12016-04-11 14:26:49 -060013201TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
13202 m_errorMonitor->SetDesiredFailureMsg(
13203 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13204 "CreateImage extents is 0 for at least one required dimension");
13205
13206 ASSERT_NO_FATAL_FAILURE(InitState());
13207
13208 // Create an image
13209 VkImage image;
13210
13211 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13212 const int32_t tex_width = 32;
13213 const int32_t tex_height = 32;
13214
13215 VkImageCreateInfo image_create_info = {};
13216 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13217 image_create_info.pNext = NULL;
13218 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13219 image_create_info.format = tex_format;
13220 image_create_info.extent.width = tex_width;
13221 image_create_info.extent.height = tex_height;
13222 image_create_info.extent.depth = 1;
13223 image_create_info.mipLevels = 1;
13224 image_create_info.arrayLayers = 1;
13225 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13226 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13227 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13228 image_create_info.flags = 0;
13229
13230 // Introduce error by sending down a bogus width extent
13231 image_create_info.extent.width = 0;
13232 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
13233
13234 m_errorMonitor->VerifyFound();
13235}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013236#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120013237
Tobin Ehliscde08892015-09-22 10:11:37 -060013238#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070013239TEST_F(VkLayerTest, InvalidImageView) {
13240 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060013241
Karl Schultz6addd812016-02-02 17:17:23 -070013242 m_errorMonitor->SetDesiredFailureMsg(
13243 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013244 "vkCreateImageView called with baseMipLevel 10 ");
13245
Tobin Ehliscde08892015-09-22 10:11:37 -060013246 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060013247
Mike Stroyana3082432015-09-25 13:39:21 -060013248 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070013249 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060013250
Karl Schultz6addd812016-02-02 17:17:23 -070013251 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13252 const int32_t tex_width = 32;
13253 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060013254
13255 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013256 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13257 image_create_info.pNext = NULL;
13258 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13259 image_create_info.format = tex_format;
13260 image_create_info.extent.width = tex_width;
13261 image_create_info.extent.height = tex_height;
13262 image_create_info.extent.depth = 1;
13263 image_create_info.mipLevels = 1;
13264 image_create_info.arrayLayers = 1;
13265 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13266 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13267 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13268 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060013269
Chia-I Wuf7458c52015-10-26 21:10:41 +080013270 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060013271 ASSERT_VK_SUCCESS(err);
13272
13273 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013274 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13275 image_view_create_info.image = image;
13276 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13277 image_view_create_info.format = tex_format;
13278 image_view_create_info.subresourceRange.layerCount = 1;
13279 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
13280 image_view_create_info.subresourceRange.levelCount = 1;
13281 image_view_create_info.subresourceRange.aspectMask =
13282 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060013283
13284 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070013285 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
13286 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060013287
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013288 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060013289 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060013290}
Mike Stroyana3082432015-09-25 13:39:21 -060013291
Mark Youngd339ba32016-05-30 13:28:35 -060013292TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
13293 VkResult err;
13294
13295 m_errorMonitor->SetDesiredFailureMsg(
13296 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13297 "vkCreateImageView called with invalid memory ");
13298
13299 ASSERT_NO_FATAL_FAILURE(InitState());
13300
13301 // Create an image and try to create a view with no memory backing the image
13302 VkImage image;
13303
13304 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13305 const int32_t tex_width = 32;
13306 const int32_t tex_height = 32;
13307
13308 VkImageCreateInfo image_create_info = {};
13309 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13310 image_create_info.pNext = NULL;
13311 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13312 image_create_info.format = tex_format;
13313 image_create_info.extent.width = tex_width;
13314 image_create_info.extent.height = tex_height;
13315 image_create_info.extent.depth = 1;
13316 image_create_info.mipLevels = 1;
13317 image_create_info.arrayLayers = 1;
13318 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13319 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13320 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13321 image_create_info.flags = 0;
13322
13323 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
13324 ASSERT_VK_SUCCESS(err);
13325
13326 VkImageViewCreateInfo image_view_create_info = {};
13327 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13328 image_view_create_info.image = image;
13329 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13330 image_view_create_info.format = tex_format;
13331 image_view_create_info.subresourceRange.layerCount = 1;
13332 image_view_create_info.subresourceRange.baseMipLevel = 0;
13333 image_view_create_info.subresourceRange.levelCount = 1;
13334 image_view_create_info.subresourceRange.aspectMask =
13335 VK_IMAGE_ASPECT_COLOR_BIT;
13336
13337 VkImageView view;
13338 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
13339 &view);
13340
13341 m_errorMonitor->VerifyFound();
13342 vkDestroyImage(m_device->device(), image, NULL);
13343 // If last error is success, it still created the view, so delete it.
13344 if (err == VK_SUCCESS) {
13345 vkDestroyImageView(m_device->device(), view, NULL);
13346 }
13347
13348}
13349
Karl Schultz6addd812016-02-02 17:17:23 -070013350TEST_F(VkLayerTest, InvalidImageViewAspect) {
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013351 TEST_DESCRIPTION(
13352 "Create an image and try to create a view with an invalid aspectMask");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013354 "vkCreateImageView: Color image "
13355 "formats must have ONLY the "
13356 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013357
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013358 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013359
Karl Schultz6addd812016-02-02 17:17:23 -070013360 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013361 VkImageObj image(m_device);
13362 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT,
13363 VK_IMAGE_TILING_LINEAR, 0);
13364 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013365
13366 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013367 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013368 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070013369 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13370 image_view_create_info.format = tex_format;
13371 image_view_create_info.subresourceRange.baseMipLevel = 0;
13372 image_view_create_info.subresourceRange.levelCount = 1;
13373 // Cause an error by setting an invalid image aspect
13374 image_view_create_info.subresourceRange.aspectMask =
13375 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013376
13377 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013378 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013379
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013380 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013381}
13382
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013383TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070013384 VkResult err;
13385 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060013386
Karl Schultz6addd812016-02-02 17:17:23 -070013387 m_errorMonitor->SetDesiredFailureMsg(
13388 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013389 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013390
Mike Stroyana3082432015-09-25 13:39:21 -060013391 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060013392
13393 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070013394 VkImage srcImage;
13395 VkImage dstImage;
13396 VkDeviceMemory srcMem;
13397 VkDeviceMemory destMem;
13398 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060013399
13400 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013401 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13402 image_create_info.pNext = NULL;
13403 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13404 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
13405 image_create_info.extent.width = 32;
13406 image_create_info.extent.height = 32;
13407 image_create_info.extent.depth = 1;
13408 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013409 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070013410 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13411 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
13412 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13413 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013414
Karl Schultz6addd812016-02-02 17:17:23 -070013415 err =
13416 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013417 ASSERT_VK_SUCCESS(err);
13418
Karl Schultz6addd812016-02-02 17:17:23 -070013419 err =
13420 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013421 ASSERT_VK_SUCCESS(err);
13422
13423 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013424 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013425 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13426 memAlloc.pNext = NULL;
13427 memAlloc.allocationSize = 0;
13428 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013429
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060013430 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060013431 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070013432 pass =
13433 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060013434 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013435 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060013436 ASSERT_VK_SUCCESS(err);
13437
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013438 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060013439 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070013440 pass =
13441 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060013442 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013443 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060013444 ASSERT_VK_SUCCESS(err);
13445
13446 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
13447 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013448 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060013449 ASSERT_VK_SUCCESS(err);
13450
13451 BeginCommandBuffer();
13452 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080013453 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060013454 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060013455 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013456 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060013457 copyRegion.srcOffset.x = 0;
13458 copyRegion.srcOffset.y = 0;
13459 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080013460 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013461 copyRegion.dstSubresource.mipLevel = 0;
13462 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013463 // Introduce failure by forcing the dst layerCount to differ from src
13464 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013465 copyRegion.dstOffset.x = 0;
13466 copyRegion.dstOffset.y = 0;
13467 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013468 copyRegion.extent.width = 1;
13469 copyRegion.extent.height = 1;
13470 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070013471 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
13472 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060013473 EndCommandBuffer();
13474
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013475 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060013476
Chia-I Wuf7458c52015-10-26 21:10:41 +080013477 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013478 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080013479 vkFreeMemory(m_device->device(), srcMem, NULL);
13480 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060013481}
13482
Tony Barbourd6673642016-05-05 14:46:39 -060013483TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
13484
13485 TEST_DESCRIPTION("Creating images with unsuported formats ");
13486
13487 ASSERT_NO_FATAL_FAILURE(InitState());
13488 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13489 VkImageObj image(m_device);
13490 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
13491 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
13492 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
13493 VK_IMAGE_TILING_OPTIMAL, 0);
13494 ASSERT_TRUE(image.initialized());
13495
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013496 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
13497 VkImageCreateInfo image_create_info;
13498 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13499 image_create_info.pNext = NULL;
13500 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13501 image_create_info.format = VK_FORMAT_UNDEFINED;
13502 image_create_info.extent.width = 32;
13503 image_create_info.extent.height = 32;
13504 image_create_info.extent.depth = 1;
13505 image_create_info.mipLevels = 1;
13506 image_create_info.arrayLayers = 1;
13507 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13508 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
13509 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13510 image_create_info.flags = 0;
13511
13512 m_errorMonitor->SetDesiredFailureMsg(
13513 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13514 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
13515
13516 VkImage localImage;
13517 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
13518 m_errorMonitor->VerifyFound();
13519
Tony Barbourd6673642016-05-05 14:46:39 -060013520 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013521 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060013522 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
13523 VkFormat format = static_cast<VkFormat>(f);
13524 VkFormatProperties fProps = m_device->format_properties(format);
13525 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
13526 fProps.optimalTilingFeatures == 0) {
13527 unsupported = format;
13528 break;
13529 }
13530 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013531
Tony Barbourd6673642016-05-05 14:46:39 -060013532 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060013533 image_create_info.format = unsupported;
Tony Barbourd6673642016-05-05 14:46:39 -060013534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013535 "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060013536
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013537 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060013538 m_errorMonitor->VerifyFound();
13539 }
13540}
13541
13542TEST_F(VkLayerTest, ImageLayerViewTests) {
13543 VkResult ret;
13544 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
13545
13546 ASSERT_NO_FATAL_FAILURE(InitState());
13547
13548 VkImageObj image(m_device);
13549 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
13550 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
13551 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
13552 VK_IMAGE_TILING_OPTIMAL, 0);
13553 ASSERT_TRUE(image.initialized());
13554
13555 VkImageView imgView;
13556 VkImageViewCreateInfo imgViewInfo = {};
13557 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13558 imgViewInfo.image = image.handle();
13559 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
13560 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
13561 imgViewInfo.subresourceRange.layerCount = 1;
13562 imgViewInfo.subresourceRange.baseMipLevel = 0;
13563 imgViewInfo.subresourceRange.levelCount = 1;
13564 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13565
13566 m_errorMonitor->SetDesiredFailureMsg(
13567 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13568 "vkCreateImageView called with baseMipLevel");
13569 // View can't have baseMipLevel >= image's mipLevels - Expect
13570 // VIEW_CREATE_ERROR
13571 imgViewInfo.subresourceRange.baseMipLevel = 1;
13572 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13573 m_errorMonitor->VerifyFound();
13574 imgViewInfo.subresourceRange.baseMipLevel = 0;
13575
13576 m_errorMonitor->SetDesiredFailureMsg(
13577 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13578 "vkCreateImageView called with baseArrayLayer");
13579 // View can't have baseArrayLayer >= image's arraySize - Expect
13580 // VIEW_CREATE_ERROR
13581 imgViewInfo.subresourceRange.baseArrayLayer = 1;
13582 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13583 m_errorMonitor->VerifyFound();
13584 imgViewInfo.subresourceRange.baseArrayLayer = 0;
13585
13586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13587 "vkCreateImageView called with 0 in "
13588 "pCreateInfo->subresourceRange."
13589 "levelCount");
13590 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
13591 imgViewInfo.subresourceRange.levelCount = 0;
13592 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13593 m_errorMonitor->VerifyFound();
13594 imgViewInfo.subresourceRange.levelCount = 1;
13595
13596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13597 "vkCreateImageView called with 0 in "
13598 "pCreateInfo->subresourceRange."
13599 "layerCount");
13600 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
13601 imgViewInfo.subresourceRange.layerCount = 0;
13602 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13603 m_errorMonitor->VerifyFound();
13604 imgViewInfo.subresourceRange.layerCount = 1;
13605
13606 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13607 "but both must be color formats");
13608 // Can't use depth format for view into color image - Expect INVALID_FORMAT
13609 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
13610 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13611 m_errorMonitor->VerifyFound();
13612 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
13613
13614 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13615 "Formats MUST be IDENTICAL unless "
13616 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
13617 "was set on image creation.");
13618 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
13619 // VIEW_CREATE_ERROR
13620 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
13621 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13622 m_errorMonitor->VerifyFound();
13623 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
13624
13625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13626 "can support ImageViews with "
13627 "differing formats but they must be "
13628 "in the same compatibility class.");
13629 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
13630 // VIEW_CREATE_ERROR
13631 VkImageCreateInfo mutImgInfo = image.create_info();
13632 VkImage mutImage;
13633 mutImgInfo.format = VK_FORMAT_R8_UINT;
13634 assert(
13635 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
13636 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
13637 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
13638 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
13639 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
13640 ASSERT_VK_SUCCESS(ret);
13641 imgViewInfo.image = mutImage;
13642 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13643 m_errorMonitor->VerifyFound();
13644 imgViewInfo.image = image.handle();
13645 vkDestroyImage(m_device->handle(), mutImage, NULL);
13646}
13647
13648TEST_F(VkLayerTest, MiscImageLayerTests) {
13649
13650 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
13651
13652 ASSERT_NO_FATAL_FAILURE(InitState());
13653
13654 VkImageObj image(m_device);
13655 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
13656 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
13657 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
13658 VK_IMAGE_TILING_OPTIMAL, 0);
13659 ASSERT_TRUE(image.initialized());
13660
13661 m_errorMonitor->SetDesiredFailureMsg(
13662 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13663 "number of layers in image subresource is zero");
13664 vk_testing::Buffer buffer;
13665 VkMemoryPropertyFlags reqs = 0;
13666 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
13667 VkBufferImageCopy region = {};
13668 region.bufferRowLength = 128;
13669 region.bufferImageHeight = 128;
13670 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13671 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
13672 region.imageSubresource.layerCount = 0;
13673 region.imageExtent.height = 4;
13674 region.imageExtent.width = 4;
13675 region.imageExtent.depth = 1;
13676 m_commandBuffer->BeginCommandBuffer();
13677 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
13678 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
13679 1, &region);
13680 m_errorMonitor->VerifyFound();
13681 region.imageSubresource.layerCount = 1;
13682
13683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13684 "aspectMasks for each region must "
13685 "specify only COLOR or DEPTH or "
13686 "STENCIL");
13687 // Expect MISMATCHED_IMAGE_ASPECT
13688 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
13689 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
13690 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
13691 1, &region);
13692 m_errorMonitor->VerifyFound();
13693 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13694
13695 m_errorMonitor->SetDesiredFailureMsg(
13696 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13697 "If the format of srcImage is a depth, stencil, depth stencil or "
13698 "integer-based format then filter must be VK_FILTER_NEAREST");
13699 // Expect INVALID_FILTER
13700 VkImageObj intImage1(m_device);
13701 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
13702 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
13703 0);
13704 VkImageObj intImage2(m_device);
13705 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
13706 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
13707 0);
13708 VkImageBlit blitRegion = {};
13709 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13710 blitRegion.srcSubresource.baseArrayLayer = 0;
13711 blitRegion.srcSubresource.layerCount = 1;
13712 blitRegion.srcSubresource.mipLevel = 0;
13713 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13714 blitRegion.dstSubresource.baseArrayLayer = 0;
13715 blitRegion.dstSubresource.layerCount = 1;
13716 blitRegion.dstSubresource.mipLevel = 0;
13717
13718 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
13719 intImage1.layout(), intImage2.handle(), intImage2.layout(),
13720 16, &blitRegion, VK_FILTER_LINEAR);
13721 m_errorMonitor->VerifyFound();
13722
13723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13724 "called with 0 in ppMemoryBarriers");
13725 VkImageMemoryBarrier img_barrier;
13726 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
13727 img_barrier.pNext = NULL;
13728 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
13729 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
13730 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
13731 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
13732 img_barrier.image = image.handle();
13733 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
13734 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
13735 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13736 img_barrier.subresourceRange.baseArrayLayer = 0;
13737 img_barrier.subresourceRange.baseMipLevel = 0;
13738 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
13739 img_barrier.subresourceRange.layerCount = 0;
13740 img_barrier.subresourceRange.levelCount = 1;
13741 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
13742 VK_PIPELINE_STAGE_HOST_BIT,
13743 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
13744 nullptr, 1, &img_barrier);
13745 m_errorMonitor->VerifyFound();
13746 img_barrier.subresourceRange.layerCount = 1;
13747}
13748
13749TEST_F(VkLayerTest, ImageFormatLimits) {
13750
13751 TEST_DESCRIPTION("Exceed the limits of image format ");
13752
13753 m_errorMonitor->SetDesiredFailureMsg(
13754 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13755 "CreateImage extents exceed allowable limits for format");
13756 VkImageCreateInfo image_create_info = {};
13757 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13758 image_create_info.pNext = NULL;
13759 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13760 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
13761 image_create_info.extent.width = 32;
13762 image_create_info.extent.height = 32;
13763 image_create_info.extent.depth = 1;
13764 image_create_info.mipLevels = 1;
13765 image_create_info.arrayLayers = 1;
13766 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13767 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13768 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13769 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
13770 image_create_info.flags = 0;
13771
13772 VkImage nullImg;
13773 VkImageFormatProperties imgFmtProps;
13774 vkGetPhysicalDeviceImageFormatProperties(
13775 gpu(), image_create_info.format, image_create_info.imageType,
13776 image_create_info.tiling, image_create_info.usage,
13777 image_create_info.flags, &imgFmtProps);
13778 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
13779 // Expect INVALID_FORMAT_LIMITS_VIOLATION
13780 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13781 m_errorMonitor->VerifyFound();
13782 image_create_info.extent.depth = 1;
13783
13784 m_errorMonitor->SetDesiredFailureMsg(
13785 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13786 "exceeds allowable maximum supported by format of");
13787 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
13788 // Expect INVALID_FORMAT_LIMITS_VIOLATION
13789 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13790 m_errorMonitor->VerifyFound();
13791 image_create_info.mipLevels = 1;
13792
13793 m_errorMonitor->SetDesiredFailureMsg(
13794 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13795 "exceeds allowable maximum supported by format of");
13796 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
13797 // Expect INVALID_FORMAT_LIMITS_VIOLATION
13798 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13799 m_errorMonitor->VerifyFound();
13800 image_create_info.arrayLayers = 1;
13801
13802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13803 "is not supported by format");
13804 int samples = imgFmtProps.sampleCounts >> 1;
13805 image_create_info.samples = (VkSampleCountFlagBits)samples;
13806 // Expect INVALID_FORMAT_LIMITS_VIOLATION
13807 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13808 m_errorMonitor->VerifyFound();
13809 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13810
13811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13812 "pCreateInfo->initialLayout, must be "
13813 "VK_IMAGE_LAYOUT_UNDEFINED or "
13814 "VK_IMAGE_LAYOUT_PREINITIALIZED");
13815 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
13816 // Expect INVALID_LAYOUT
13817 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13818 m_errorMonitor->VerifyFound();
13819 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
13820}
13821
Karl Schultz6addd812016-02-02 17:17:23 -070013822TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060013823 VkResult err;
13824 bool pass;
13825
13826 // Create color images with different format sizes and try to copy between them
13827 m_errorMonitor->SetDesiredFailureMsg(
13828 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13829 "vkCmdCopyImage called with unmatched source and dest image format sizes");
13830
13831 ASSERT_NO_FATAL_FAILURE(InitState());
13832
13833 // Create two images of different types and try to copy between them
13834 VkImage srcImage;
13835 VkImage dstImage;
13836 VkDeviceMemory srcMem;
13837 VkDeviceMemory destMem;
13838 VkMemoryRequirements memReqs;
13839
13840 VkImageCreateInfo image_create_info = {};
13841 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13842 image_create_info.pNext = NULL;
13843 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13844 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
13845 image_create_info.extent.width = 32;
13846 image_create_info.extent.height = 32;
13847 image_create_info.extent.depth = 1;
13848 image_create_info.mipLevels = 1;
13849 image_create_info.arrayLayers = 1;
13850 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13851 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13852 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13853 image_create_info.flags = 0;
13854
13855 err =
13856 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
13857 ASSERT_VK_SUCCESS(err);
13858
13859 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
13860 // Introduce failure by creating second image with a different-sized format.
13861 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
13862
13863 err =
13864 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
13865 ASSERT_VK_SUCCESS(err);
13866
13867 // Allocate memory
13868 VkMemoryAllocateInfo memAlloc = {};
13869 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13870 memAlloc.pNext = NULL;
13871 memAlloc.allocationSize = 0;
13872 memAlloc.memoryTypeIndex = 0;
13873
13874 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
13875 memAlloc.allocationSize = memReqs.size;
13876 pass =
13877 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
13878 ASSERT_TRUE(pass);
13879 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
13880 ASSERT_VK_SUCCESS(err);
13881
13882 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
13883 memAlloc.allocationSize = memReqs.size;
13884 pass =
13885 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
13886 ASSERT_TRUE(pass);
13887 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
13888 ASSERT_VK_SUCCESS(err);
13889
13890 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
13891 ASSERT_VK_SUCCESS(err);
13892 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
13893 ASSERT_VK_SUCCESS(err);
13894
13895 BeginCommandBuffer();
13896 VkImageCopy copyRegion;
13897 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13898 copyRegion.srcSubresource.mipLevel = 0;
13899 copyRegion.srcSubresource.baseArrayLayer = 0;
13900 copyRegion.srcSubresource.layerCount = 0;
13901 copyRegion.srcOffset.x = 0;
13902 copyRegion.srcOffset.y = 0;
13903 copyRegion.srcOffset.z = 0;
13904 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13905 copyRegion.dstSubresource.mipLevel = 0;
13906 copyRegion.dstSubresource.baseArrayLayer = 0;
13907 copyRegion.dstSubresource.layerCount = 0;
13908 copyRegion.dstOffset.x = 0;
13909 copyRegion.dstOffset.y = 0;
13910 copyRegion.dstOffset.z = 0;
13911 copyRegion.extent.width = 1;
13912 copyRegion.extent.height = 1;
13913 copyRegion.extent.depth = 1;
13914 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
13915 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
13916 EndCommandBuffer();
13917
13918 m_errorMonitor->VerifyFound();
13919
13920 vkDestroyImage(m_device->device(), srcImage, NULL);
13921 vkDestroyImage(m_device->device(), dstImage, NULL);
13922 vkFreeMemory(m_device->device(), srcMem, NULL);
13923 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060013924}
13925
Karl Schultz6addd812016-02-02 17:17:23 -070013926TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
13927 VkResult err;
13928 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060013929
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013930 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070013931 m_errorMonitor->SetDesiredFailureMsg(
13932 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013933 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013934
Mike Stroyana3082432015-09-25 13:39:21 -060013935 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060013936
13937 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070013938 VkImage srcImage;
13939 VkImage dstImage;
13940 VkDeviceMemory srcMem;
13941 VkDeviceMemory destMem;
13942 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060013943
13944 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013945 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13946 image_create_info.pNext = NULL;
13947 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13948 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
13949 image_create_info.extent.width = 32;
13950 image_create_info.extent.height = 32;
13951 image_create_info.extent.depth = 1;
13952 image_create_info.mipLevels = 1;
13953 image_create_info.arrayLayers = 1;
13954 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13955 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13956 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13957 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013958
Karl Schultz6addd812016-02-02 17:17:23 -070013959 err =
13960 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013961 ASSERT_VK_SUCCESS(err);
13962
Karl Schultzbdb75952016-04-19 11:36:49 -060013963 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
13964
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013965 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070013966 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013967 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
13968 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060013969
Karl Schultz6addd812016-02-02 17:17:23 -070013970 err =
13971 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013972 ASSERT_VK_SUCCESS(err);
13973
13974 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013975 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013976 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13977 memAlloc.pNext = NULL;
13978 memAlloc.allocationSize = 0;
13979 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013980
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060013981 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060013982 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070013983 pass =
13984 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060013985 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013986 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060013987 ASSERT_VK_SUCCESS(err);
13988
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013989 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060013990 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070013991 pass =
13992 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060013993 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013994 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060013995 ASSERT_VK_SUCCESS(err);
13996
13997 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
13998 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013999 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014000 ASSERT_VK_SUCCESS(err);
14001
14002 BeginCommandBuffer();
14003 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014004 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014005 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014006 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014007 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014008 copyRegion.srcOffset.x = 0;
14009 copyRegion.srcOffset.y = 0;
14010 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014011 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014012 copyRegion.dstSubresource.mipLevel = 0;
14013 copyRegion.dstSubresource.baseArrayLayer = 0;
14014 copyRegion.dstSubresource.layerCount = 0;
14015 copyRegion.dstOffset.x = 0;
14016 copyRegion.dstOffset.y = 0;
14017 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014018 copyRegion.extent.width = 1;
14019 copyRegion.extent.height = 1;
14020 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014021 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14022 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014023 EndCommandBuffer();
14024
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014025 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014026
Chia-I Wuf7458c52015-10-26 21:10:41 +080014027 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014028 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014029 vkFreeMemory(m_device->device(), srcMem, NULL);
14030 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014031}
14032
Karl Schultz6addd812016-02-02 17:17:23 -070014033TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
14034 VkResult err;
14035 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014036
Karl Schultz6addd812016-02-02 17:17:23 -070014037 m_errorMonitor->SetDesiredFailureMsg(
14038 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014039 "vkCmdResolveImage called with source sample count less than 2.");
14040
Mike Stroyana3082432015-09-25 13:39:21 -060014041 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014042
14043 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070014044 VkImage srcImage;
14045 VkImage dstImage;
14046 VkDeviceMemory srcMem;
14047 VkDeviceMemory destMem;
14048 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014049
14050 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014051 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14052 image_create_info.pNext = NULL;
14053 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14054 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14055 image_create_info.extent.width = 32;
14056 image_create_info.extent.height = 1;
14057 image_create_info.extent.depth = 1;
14058 image_create_info.mipLevels = 1;
14059 image_create_info.arrayLayers = 1;
14060 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14061 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14062 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14063 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014064
Karl Schultz6addd812016-02-02 17:17:23 -070014065 err =
14066 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014067 ASSERT_VK_SUCCESS(err);
14068
Karl Schultz6addd812016-02-02 17:17:23 -070014069 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014070
Karl Schultz6addd812016-02-02 17:17:23 -070014071 err =
14072 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014073 ASSERT_VK_SUCCESS(err);
14074
14075 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014076 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014077 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14078 memAlloc.pNext = NULL;
14079 memAlloc.allocationSize = 0;
14080 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014081
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014082 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014083 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014084 pass =
14085 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014086 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014087 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014088 ASSERT_VK_SUCCESS(err);
14089
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014090 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014091 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014092 pass =
14093 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014094 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014095 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014096 ASSERT_VK_SUCCESS(err);
14097
14098 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14099 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014100 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014101 ASSERT_VK_SUCCESS(err);
14102
14103 BeginCommandBuffer();
14104 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014105 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14106 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014107 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014108 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014109 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014110 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014111 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014112 resolveRegion.srcOffset.x = 0;
14113 resolveRegion.srcOffset.y = 0;
14114 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014115 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014116 resolveRegion.dstSubresource.mipLevel = 0;
14117 resolveRegion.dstSubresource.baseArrayLayer = 0;
14118 resolveRegion.dstSubresource.layerCount = 0;
14119 resolveRegion.dstOffset.x = 0;
14120 resolveRegion.dstOffset.y = 0;
14121 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014122 resolveRegion.extent.width = 1;
14123 resolveRegion.extent.height = 1;
14124 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014125 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14126 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014127 EndCommandBuffer();
14128
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014129 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014130
Chia-I Wuf7458c52015-10-26 21:10:41 +080014131 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014132 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014133 vkFreeMemory(m_device->device(), srcMem, NULL);
14134 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014135}
14136
Karl Schultz6addd812016-02-02 17:17:23 -070014137TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
14138 VkResult err;
14139 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014140
Karl Schultz6addd812016-02-02 17:17:23 -070014141 m_errorMonitor->SetDesiredFailureMsg(
14142 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014143 "vkCmdResolveImage called with dest sample count greater than 1.");
14144
Mike Stroyana3082432015-09-25 13:39:21 -060014145 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014146
Chris Forbesa7530692016-05-08 12:35:39 +120014147 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070014148 VkImage srcImage;
14149 VkImage dstImage;
14150 VkDeviceMemory srcMem;
14151 VkDeviceMemory destMem;
14152 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014153
14154 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014155 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14156 image_create_info.pNext = NULL;
14157 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14158 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14159 image_create_info.extent.width = 32;
14160 image_create_info.extent.height = 1;
14161 image_create_info.extent.depth = 1;
14162 image_create_info.mipLevels = 1;
14163 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120014164 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070014165 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14166 // Note: Some implementations expect color attachment usage for any
14167 // multisample surface
14168 image_create_info.usage =
14169 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14170 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014171
Karl Schultz6addd812016-02-02 17:17:23 -070014172 err =
14173 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014174 ASSERT_VK_SUCCESS(err);
14175
Karl Schultz6addd812016-02-02 17:17:23 -070014176 // Note: Some implementations expect color attachment usage for any
14177 // multisample surface
14178 image_create_info.usage =
14179 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014180
Karl Schultz6addd812016-02-02 17:17:23 -070014181 err =
14182 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014183 ASSERT_VK_SUCCESS(err);
14184
14185 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014186 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014187 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14188 memAlloc.pNext = NULL;
14189 memAlloc.allocationSize = 0;
14190 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014191
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014192 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014193 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014194 pass =
14195 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014196 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014197 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014198 ASSERT_VK_SUCCESS(err);
14199
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014200 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014201 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014202 pass =
14203 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014204 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014205 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014206 ASSERT_VK_SUCCESS(err);
14207
14208 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14209 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014210 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014211 ASSERT_VK_SUCCESS(err);
14212
14213 BeginCommandBuffer();
14214 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014215 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14216 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014217 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014218 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014219 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014220 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014221 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014222 resolveRegion.srcOffset.x = 0;
14223 resolveRegion.srcOffset.y = 0;
14224 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014225 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014226 resolveRegion.dstSubresource.mipLevel = 0;
14227 resolveRegion.dstSubresource.baseArrayLayer = 0;
14228 resolveRegion.dstSubresource.layerCount = 0;
14229 resolveRegion.dstOffset.x = 0;
14230 resolveRegion.dstOffset.y = 0;
14231 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014232 resolveRegion.extent.width = 1;
14233 resolveRegion.extent.height = 1;
14234 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014235 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14236 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014237 EndCommandBuffer();
14238
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014239 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014240
Chia-I Wuf7458c52015-10-26 21:10:41 +080014241 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014242 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014243 vkFreeMemory(m_device->device(), srcMem, NULL);
14244 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014245}
14246
Karl Schultz6addd812016-02-02 17:17:23 -070014247TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
14248 VkResult err;
14249 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014250
Karl Schultz6addd812016-02-02 17:17:23 -070014251 m_errorMonitor->SetDesiredFailureMsg(
14252 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014253 "vkCmdResolveImage called with unmatched source and dest formats.");
14254
Mike Stroyana3082432015-09-25 13:39:21 -060014255 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014256
14257 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014258 VkImage srcImage;
14259 VkImage dstImage;
14260 VkDeviceMemory srcMem;
14261 VkDeviceMemory destMem;
14262 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014263
14264 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014265 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14266 image_create_info.pNext = NULL;
14267 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14268 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14269 image_create_info.extent.width = 32;
14270 image_create_info.extent.height = 1;
14271 image_create_info.extent.depth = 1;
14272 image_create_info.mipLevels = 1;
14273 image_create_info.arrayLayers = 1;
14274 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
14275 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14276 // Note: Some implementations expect color attachment usage for any
14277 // multisample surface
14278 image_create_info.usage =
14279 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14280 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014281
Karl Schultz6addd812016-02-02 17:17:23 -070014282 err =
14283 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014284 ASSERT_VK_SUCCESS(err);
14285
Karl Schultz6addd812016-02-02 17:17:23 -070014286 // Set format to something other than source image
14287 image_create_info.format = VK_FORMAT_R32_SFLOAT;
14288 // Note: Some implementations expect color attachment usage for any
14289 // multisample surface
14290 image_create_info.usage =
14291 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14292 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014293
Karl Schultz6addd812016-02-02 17:17:23 -070014294 err =
14295 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014296 ASSERT_VK_SUCCESS(err);
14297
14298 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014299 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014300 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14301 memAlloc.pNext = NULL;
14302 memAlloc.allocationSize = 0;
14303 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014304
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014305 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014306 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014307 pass =
14308 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014309 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014310 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014311 ASSERT_VK_SUCCESS(err);
14312
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014313 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014314 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014315 pass =
14316 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014317 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014318 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014319 ASSERT_VK_SUCCESS(err);
14320
14321 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14322 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014323 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014324 ASSERT_VK_SUCCESS(err);
14325
14326 BeginCommandBuffer();
14327 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014328 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14329 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014330 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014331 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014332 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014333 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014334 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014335 resolveRegion.srcOffset.x = 0;
14336 resolveRegion.srcOffset.y = 0;
14337 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014338 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014339 resolveRegion.dstSubresource.mipLevel = 0;
14340 resolveRegion.dstSubresource.baseArrayLayer = 0;
14341 resolveRegion.dstSubresource.layerCount = 0;
14342 resolveRegion.dstOffset.x = 0;
14343 resolveRegion.dstOffset.y = 0;
14344 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014345 resolveRegion.extent.width = 1;
14346 resolveRegion.extent.height = 1;
14347 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014348 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14349 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014350 EndCommandBuffer();
14351
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014352 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014353
Chia-I Wuf7458c52015-10-26 21:10:41 +080014354 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014355 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014356 vkFreeMemory(m_device->device(), srcMem, NULL);
14357 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014358}
14359
Karl Schultz6addd812016-02-02 17:17:23 -070014360TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
14361 VkResult err;
14362 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014363
Karl Schultz6addd812016-02-02 17:17:23 -070014364 m_errorMonitor->SetDesiredFailureMsg(
14365 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014366 "vkCmdResolveImage called with unmatched source and dest image types.");
14367
Mike Stroyana3082432015-09-25 13:39:21 -060014368 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014369
14370 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014371 VkImage srcImage;
14372 VkImage dstImage;
14373 VkDeviceMemory srcMem;
14374 VkDeviceMemory destMem;
14375 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014376
14377 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014378 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14379 image_create_info.pNext = NULL;
14380 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14381 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14382 image_create_info.extent.width = 32;
14383 image_create_info.extent.height = 1;
14384 image_create_info.extent.depth = 1;
14385 image_create_info.mipLevels = 1;
14386 image_create_info.arrayLayers = 1;
14387 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
14388 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14389 // Note: Some implementations expect color attachment usage for any
14390 // multisample surface
14391 image_create_info.usage =
14392 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14393 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014394
Karl Schultz6addd812016-02-02 17:17:23 -070014395 err =
14396 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014397 ASSERT_VK_SUCCESS(err);
14398
Karl Schultz6addd812016-02-02 17:17:23 -070014399 image_create_info.imageType = VK_IMAGE_TYPE_1D;
14400 // Note: Some implementations expect color attachment usage for any
14401 // multisample surface
14402 image_create_info.usage =
14403 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14404 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014405
Karl Schultz6addd812016-02-02 17:17:23 -070014406 err =
14407 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014408 ASSERT_VK_SUCCESS(err);
14409
14410 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014411 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014412 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14413 memAlloc.pNext = NULL;
14414 memAlloc.allocationSize = 0;
14415 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014416
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014417 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014418 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014419 pass =
14420 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014421 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014422 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014423 ASSERT_VK_SUCCESS(err);
14424
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014425 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014426 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014427 pass =
14428 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014429 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014430 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014431 ASSERT_VK_SUCCESS(err);
14432
14433 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14434 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014435 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014436 ASSERT_VK_SUCCESS(err);
14437
14438 BeginCommandBuffer();
14439 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014440 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14441 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014442 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014443 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014444 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014445 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014446 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014447 resolveRegion.srcOffset.x = 0;
14448 resolveRegion.srcOffset.y = 0;
14449 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014450 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014451 resolveRegion.dstSubresource.mipLevel = 0;
14452 resolveRegion.dstSubresource.baseArrayLayer = 0;
14453 resolveRegion.dstSubresource.layerCount = 0;
14454 resolveRegion.dstOffset.x = 0;
14455 resolveRegion.dstOffset.y = 0;
14456 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014457 resolveRegion.extent.width = 1;
14458 resolveRegion.extent.height = 1;
14459 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014460 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14461 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014462 EndCommandBuffer();
14463
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014464 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014465
Chia-I Wuf7458c52015-10-26 21:10:41 +080014466 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014467 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014468 vkFreeMemory(m_device->device(), srcMem, NULL);
14469 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014470}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014471
Karl Schultz6addd812016-02-02 17:17:23 -070014472TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014473 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070014474 // to using a DS format, then cause it to hit error due to COLOR_BIT not
14475 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014476 // The image format check comes 2nd in validation so we trigger it first,
14477 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070014478 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014479
Karl Schultz6addd812016-02-02 17:17:23 -070014480 m_errorMonitor->SetDesiredFailureMsg(
14481 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014482 "Combination depth/stencil image formats can have only the ");
14483
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014484 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014485
Chia-I Wu1b99bb22015-10-27 19:25:11 +080014486 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014487 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
14488 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014489
14490 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014491 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14492 ds_pool_ci.pNext = NULL;
14493 ds_pool_ci.maxSets = 1;
14494 ds_pool_ci.poolSizeCount = 1;
14495 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014496
14497 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070014498 err =
14499 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014500 ASSERT_VK_SUCCESS(err);
14501
14502 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014503 dsl_binding.binding = 0;
14504 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
14505 dsl_binding.descriptorCount = 1;
14506 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
14507 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014508
14509 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014510 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14511 ds_layout_ci.pNext = NULL;
14512 ds_layout_ci.bindingCount = 1;
14513 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014514 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070014515 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
14516 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014517 ASSERT_VK_SUCCESS(err);
14518
14519 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014520 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080014521 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070014522 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014523 alloc_info.descriptorPool = ds_pool;
14524 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070014525 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
14526 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014527 ASSERT_VK_SUCCESS(err);
14528
Karl Schultz6addd812016-02-02 17:17:23 -070014529 VkImage image_bad;
14530 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014531 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060014532 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014533 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070014534 const int32_t tex_width = 32;
14535 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014536
14537 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014538 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14539 image_create_info.pNext = NULL;
14540 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14541 image_create_info.format = tex_format_bad;
14542 image_create_info.extent.width = tex_width;
14543 image_create_info.extent.height = tex_height;
14544 image_create_info.extent.depth = 1;
14545 image_create_info.mipLevels = 1;
14546 image_create_info.arrayLayers = 1;
14547 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14548 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14549 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
14550 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
14551 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014552
Karl Schultz6addd812016-02-02 17:17:23 -070014553 err =
14554 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014555 ASSERT_VK_SUCCESS(err);
14556 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070014557 image_create_info.usage =
14558 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14559 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
14560 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014561 ASSERT_VK_SUCCESS(err);
14562
14563 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014564 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14565 image_view_create_info.image = image_bad;
14566 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14567 image_view_create_info.format = tex_format_bad;
14568 image_view_create_info.subresourceRange.baseArrayLayer = 0;
14569 image_view_create_info.subresourceRange.baseMipLevel = 0;
14570 image_view_create_info.subresourceRange.layerCount = 1;
14571 image_view_create_info.subresourceRange.levelCount = 1;
14572 image_view_create_info.subresourceRange.aspectMask =
14573 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014574
14575 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070014576 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
14577 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014578
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014579 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014580
Chia-I Wuf7458c52015-10-26 21:10:41 +080014581 vkDestroyImage(m_device->device(), image_bad, NULL);
14582 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014583 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
14584 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014585}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060014586
14587TEST_F(VkLayerTest, ClearImageErrors) {
14588 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
14589 "ClearDepthStencilImage with a color image.");
14590
14591 ASSERT_NO_FATAL_FAILURE(InitState());
14592 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14593
14594 // Renderpass is started here so end it as Clear cmds can't be in renderpass
14595 BeginCommandBuffer();
14596 m_commandBuffer->EndRenderPass();
14597
14598 // Color image
14599 VkClearColorValue clear_color;
14600 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
14601 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
14602 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
14603 const int32_t img_width = 32;
14604 const int32_t img_height = 32;
14605 VkImageCreateInfo image_create_info = {};
14606 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14607 image_create_info.pNext = NULL;
14608 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14609 image_create_info.format = color_format;
14610 image_create_info.extent.width = img_width;
14611 image_create_info.extent.height = img_height;
14612 image_create_info.extent.depth = 1;
14613 image_create_info.mipLevels = 1;
14614 image_create_info.arrayLayers = 1;
14615 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14616 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14617 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14618
14619 vk_testing::Image color_image;
14620 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info,
14621 reqs);
14622
14623 const VkImageSubresourceRange color_range =
14624 vk_testing::Image::subresource_range(image_create_info,
14625 VK_IMAGE_ASPECT_COLOR_BIT);
14626
14627 // Depth/Stencil image
14628 VkClearDepthStencilValue clear_value = {0};
14629 reqs = 0; // don't need HOST_VISIBLE DS image
14630 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
14631 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
14632 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
14633 ds_image_create_info.extent.width = 64;
14634 ds_image_create_info.extent.height = 64;
14635 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14636 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
14637
14638 vk_testing::Image ds_image;
14639 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info,
14640 reqs);
14641
14642 const VkImageSubresourceRange ds_range =
14643 vk_testing::Image::subresource_range(ds_image_create_info,
14644 VK_IMAGE_ASPECT_DEPTH_BIT);
14645
14646 m_errorMonitor->SetDesiredFailureMsg(
14647 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14648 "vkCmdClearColorImage called with depth/stencil image.");
14649
14650 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
14651 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
14652 &color_range);
14653
14654 m_errorMonitor->VerifyFound();
14655
Tony Barbour26434b92016-06-02 09:43:50 -060014656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14657 "vkCmdClearColorImage called with "
14658 "image created without "
14659 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
14660
14661 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
14662 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
14663 &color_range);
14664
14665 m_errorMonitor->VerifyFound();
14666
Tobin Ehlis6e23d772016-05-19 11:08:34 -060014667 // Call CmdClearDepthStencilImage with color image
14668 m_errorMonitor->SetDesiredFailureMsg(
14669 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14670 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
14671
14672 vkCmdClearDepthStencilImage(
14673 m_commandBuffer->GetBufferHandle(), color_image.handle(),
14674 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
14675 &ds_range);
14676
14677 m_errorMonitor->VerifyFound();
14678}
Tobin Ehliscde08892015-09-22 10:11:37 -060014679#endif // IMAGE_TESTS
14680
Tony Barbour300a6082015-04-07 13:44:53 -060014681int main(int argc, char **argv) {
14682 int result;
14683
Cody Northrop8e54a402016-03-08 22:25:52 -070014684#ifdef ANDROID
14685 int vulkanSupport = InitVulkan();
14686 if (vulkanSupport == 0)
14687 return 1;
14688#endif
14689
Tony Barbour300a6082015-04-07 13:44:53 -060014690 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060014691 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060014692
14693 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
14694
14695 result = RUN_ALL_TESTS();
14696
Tony Barbour6918cd52015-04-09 12:58:51 -060014697 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060014698 return result;
14699}