blob: 340de769537276aebb9ade1ecaa55173d27cf505 [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
Karl Schultz6addd812016-02-02 17:17:23 -07006546TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006547 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6548 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006549 // Create a valid cmd buffer
6550 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006551 uint64_t fake_pipeline_handle = 0xbaad6001;
6552 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006553 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6554 "Invalid VkPipeline Object 0xbaad6001");
6555 ASSERT_NO_FATAL_FAILURE(InitState());
6556 BeginCommandBuffer();
6557 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6558 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
6559 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006560 // Now issue a draw call with no pipeline bound
6561 m_errorMonitor->SetDesiredFailureMsg(
6562 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6563 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tony Barbourdf4c0042016-06-01 15:55:43 -06006564
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006565 BeginCommandBuffer();
6566 Draw(1, 0, 0, 0);
6567 m_errorMonitor->VerifyFound();
6568 // Finally same check once more but with Dispatch/Compute
6569 m_errorMonitor->SetDesiredFailureMsg(
6570 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6571 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006572 BeginCommandBuffer();
6573 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6574 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006575}
6576
Karl Schultz6addd812016-02-02 17:17:23 -07006577TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
6578 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
6579 // CommandBuffer
6580 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006581
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006582 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006583 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006584
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006585 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006586 ASSERT_NO_FATAL_FAILURE(InitViewport());
6587 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006588 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006589 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6590 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006591
6592 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006593 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6594 ds_pool_ci.pNext = NULL;
6595 ds_pool_ci.maxSets = 1;
6596 ds_pool_ci.poolSizeCount = 1;
6597 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006598
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006599 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006600 err =
6601 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006602 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006603
Tony Barboureb254902015-07-15 12:50:33 -06006604 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006605 dsl_binding.binding = 0;
6606 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6607 dsl_binding.descriptorCount = 1;
6608 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6609 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006610
Tony Barboureb254902015-07-15 12:50:33 -06006611 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006612 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6613 ds_layout_ci.pNext = NULL;
6614 ds_layout_ci.bindingCount = 1;
6615 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006616 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006617 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6618 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006619 ASSERT_VK_SUCCESS(err);
6620
6621 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006622 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006623 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006624 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006625 alloc_info.descriptorPool = ds_pool;
6626 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006627 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6628 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006629 ASSERT_VK_SUCCESS(err);
6630
Tony Barboureb254902015-07-15 12:50:33 -06006631 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006632 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6633 pipeline_layout_ci.pNext = NULL;
6634 pipeline_layout_ci.setLayoutCount = 1;
6635 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006636
6637 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006638 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6639 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006640 ASSERT_VK_SUCCESS(err);
6641
Karl Schultz6addd812016-02-02 17:17:23 -07006642 VkShaderObj vs(m_device, bindStateVertShaderText,
6643 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006644 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006645 // on more devices
6646 VkShaderObj fs(m_device, bindStateFragShaderText,
6647 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006648
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006649 VkPipelineObj pipe(m_device);
6650 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006651 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006652 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006653 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006654
6655 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006656 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6657 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6658 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6659 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
6660 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006661
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006662 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006663
Chia-I Wuf7458c52015-10-26 21:10:41 +08006664 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6665 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6666 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006667}
6668
Karl Schultz6addd812016-02-02 17:17:23 -07006669TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006670 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006671 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006672
Karl Schultz6addd812016-02-02 17:17:23 -07006673 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006674 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
6675 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006676
6677 ASSERT_NO_FATAL_FAILURE(InitState());
6678 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006679 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6680 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006681
6682 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006683 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6684 ds_pool_ci.pNext = NULL;
6685 ds_pool_ci.maxSets = 1;
6686 ds_pool_ci.poolSizeCount = 1;
6687 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006688
6689 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006690 err =
6691 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006692 ASSERT_VK_SUCCESS(err);
6693
6694 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006695 dsl_binding.binding = 0;
6696 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6697 dsl_binding.descriptorCount = 1;
6698 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6699 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006700
6701 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006702 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6703 ds_layout_ci.pNext = NULL;
6704 ds_layout_ci.bindingCount = 1;
6705 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006706 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006707 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6708 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006709 ASSERT_VK_SUCCESS(err);
6710
6711 VkDescriptorSet descriptorSet;
6712 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006713 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006714 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006715 alloc_info.descriptorPool = ds_pool;
6716 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006717 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6718 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006719 ASSERT_VK_SUCCESS(err);
6720
Karl Schultz6addd812016-02-02 17:17:23 -07006721 VkBufferView view =
6722 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006723 VkWriteDescriptorSet descriptor_write;
6724 memset(&descriptor_write, 0, sizeof(descriptor_write));
6725 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6726 descriptor_write.dstSet = descriptorSet;
6727 descriptor_write.dstBinding = 0;
6728 descriptor_write.descriptorCount = 1;
6729 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6730 descriptor_write.pTexelBufferView = &view;
6731
6732 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6733
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006734 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006735
6736 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6737 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6738}
6739
Mark Youngd339ba32016-05-30 13:28:35 -06006740TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
6741 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has"
6742 " no memory bound to it.");
6743
6744 VkResult err;
6745 m_errorMonitor->SetDesiredFailureMsg(
6746 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6747 "vkCreateBufferView called with invalid memory ");
6748
6749 ASSERT_NO_FATAL_FAILURE(InitState());
6750
6751 // Create a buffer with no bound memory and then attempt to create
6752 // a buffer view.
6753 VkBufferCreateInfo buff_ci = {};
6754 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6755 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6756 buff_ci.size = 256;
6757 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6758 VkBuffer buffer;
6759 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6760 ASSERT_VK_SUCCESS(err);
6761
6762 VkBufferViewCreateInfo buff_view_ci = {};
6763 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6764 buff_view_ci.buffer = buffer;
6765 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6766 buff_view_ci.range = VK_WHOLE_SIZE;
6767 VkBufferView buff_view;
6768 err =
6769 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
6770
6771 m_errorMonitor->VerifyFound();
6772 vkDestroyBuffer(m_device->device(), buffer, NULL);
6773 // If last error is success, it still created the view, so delete it.
6774 if (err == VK_SUCCESS) {
6775 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6776 }
6777}
6778
Karl Schultz6addd812016-02-02 17:17:23 -07006779TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6780 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6781 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006782 // 1. No dynamicOffset supplied
6783 // 2. Too many dynamicOffsets supplied
6784 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006785 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006787 " requires 1 dynamicOffsets, but only "
6788 "0 dynamicOffsets are left in "
6789 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006790
6791 ASSERT_NO_FATAL_FAILURE(InitState());
6792 ASSERT_NO_FATAL_FAILURE(InitViewport());
6793 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6794
6795 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006796 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6797 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006798
6799 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006800 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6801 ds_pool_ci.pNext = NULL;
6802 ds_pool_ci.maxSets = 1;
6803 ds_pool_ci.poolSizeCount = 1;
6804 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006805
6806 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006807 err =
6808 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006809 ASSERT_VK_SUCCESS(err);
6810
6811 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006812 dsl_binding.binding = 0;
6813 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6814 dsl_binding.descriptorCount = 1;
6815 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6816 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006817
6818 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006819 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6820 ds_layout_ci.pNext = NULL;
6821 ds_layout_ci.bindingCount = 1;
6822 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006823 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006824 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6825 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006826 ASSERT_VK_SUCCESS(err);
6827
6828 VkDescriptorSet descriptorSet;
6829 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006830 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006831 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006832 alloc_info.descriptorPool = ds_pool;
6833 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006834 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6835 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006836 ASSERT_VK_SUCCESS(err);
6837
6838 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006839 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6840 pipeline_layout_ci.pNext = NULL;
6841 pipeline_layout_ci.setLayoutCount = 1;
6842 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006843
6844 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006845 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6846 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006847 ASSERT_VK_SUCCESS(err);
6848
6849 // Create a buffer to update the descriptor with
6850 uint32_t qfi = 0;
6851 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006852 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6853 buffCI.size = 1024;
6854 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6855 buffCI.queueFamilyIndexCount = 1;
6856 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006857
6858 VkBuffer dyub;
6859 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6860 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006861 // Allocate memory and bind to buffer so we can make it to the appropriate
6862 // error
6863 VkMemoryAllocateInfo mem_alloc = {};
6864 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6865 mem_alloc.pNext = NULL;
6866 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006867 mem_alloc.memoryTypeIndex = 0;
6868
6869 VkMemoryRequirements memReqs;
6870 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
6871 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
6872 0);
6873 if (!pass) {
6874 vkDestroyBuffer(m_device->device(), dyub, NULL);
6875 return;
6876 }
6877
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006878 VkDeviceMemory mem;
6879 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6880 ASSERT_VK_SUCCESS(err);
6881 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6882 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006883 // Correctly update descriptor to avoid "NOT_UPDATED" error
6884 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006885 buffInfo.buffer = dyub;
6886 buffInfo.offset = 0;
6887 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006888
6889 VkWriteDescriptorSet descriptor_write;
6890 memset(&descriptor_write, 0, sizeof(descriptor_write));
6891 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6892 descriptor_write.dstSet = descriptorSet;
6893 descriptor_write.dstBinding = 0;
6894 descriptor_write.descriptorCount = 1;
6895 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6896 descriptor_write.pBufferInfo = &buffInfo;
6897
6898 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6899
6900 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006901 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6902 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
6903 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006904 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006905 uint32_t pDynOff[2] = {512, 756};
6906 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07006907 m_errorMonitor->SetDesiredFailureMsg(
6908 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07006909 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07006910 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6911 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
6912 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006913 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006914 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006915 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6916 " dynamic offset 512 combined with "
6917 "offset 0 and range 1024 that "
6918 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006919 // Create PSO to be used for draw-time errors below
6920 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12006921 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07006922 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006923 "out gl_PerVertex { \n"
6924 " vec4 gl_Position;\n"
6925 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07006926 "void main(){\n"
6927 " gl_Position = vec4(1);\n"
6928 "}\n";
6929 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12006930 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07006931 "\n"
6932 "layout(location=0) out vec4 x;\n"
6933 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6934 "void main(){\n"
6935 " x = vec4(bar.y);\n"
6936 "}\n";
6937 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6938 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6939 VkPipelineObj pipe(m_device);
6940 pipe.AddShader(&vs);
6941 pipe.AddShader(&fs);
6942 pipe.AddColorAttachment();
6943 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6944
Karl Schultz6addd812016-02-02 17:17:23 -07006945 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6946 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6947 // This update should succeed, but offset size of 512 will overstep buffer
6948 // /w range 1024 & size 1024
6949 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6950 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
6951 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006952 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006953 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006954
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006955 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006956 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006957
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006958 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006959 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006960 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6961}
6962
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006963TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006964 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006965 ASSERT_NO_FATAL_FAILURE(InitState());
6966 ASSERT_NO_FATAL_FAILURE(InitViewport());
6967 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6968
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006969 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006970 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006971 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6972 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6973 pipeline_layout_ci.pushConstantRangeCount = 1;
6974 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6975
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006976 //
6977 // Check for invalid push constant ranges in pipeline layouts.
6978 //
6979 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006980 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006981 char const *msg;
6982 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006983
Karl Schultzc81037d2016-05-12 08:11:23 -06006984 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6985 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6986 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6987 "vkCreatePipelineLayout() call has push constants index 0 with "
6988 "size 0."},
6989 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6990 "vkCreatePipelineLayout() call has push constants index 0 with "
6991 "size 1."},
6992 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
6993 "vkCreatePipelineLayout() call has push constants index 0 with "
6994 "size 1."},
6995 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
6996 "vkCreatePipelineLayout() call has push constants index 0 with "
6997 "size 0."},
6998 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6999 "vkCreatePipelineLayout() call has push constants index 0 with "
7000 "offset 1. Offset must"},
7001 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7002 "vkCreatePipelineLayout() call has push constants index 0 "
7003 "with offset "},
7004 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7005 "vkCreatePipelineLayout() call has push constants "
7006 "index 0 with offset "},
7007 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
7008 "vkCreatePipelineLayout() call has push constants index 0 "
7009 "with offset "},
7010 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7011 "vkCreatePipelineLayout() call has push "
7012 "constants index 0 with offset "},
7013 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7014 "vkCreatePipelineLayout() call has push "
7015 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007016 }};
7017
7018 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007019 for (const auto &iter : range_tests) {
7020 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007021 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7022 iter.msg);
7023 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7024 NULL, &pipeline_layout);
7025 m_errorMonitor->VerifyFound();
7026 if (VK_SUCCESS == err) {
7027 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7028 }
7029 }
7030
7031 // Check for invalid stage flag
7032 pc_range.offset = 0;
7033 pc_range.size = 16;
7034 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007035 m_errorMonitor->SetDesiredFailureMsg(
7036 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007037 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007038 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7039 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007040 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007041 if (VK_SUCCESS == err) {
7042 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7043 }
7044
7045 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06007046 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007047 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007048 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007049 char const *msg;
7050 };
7051
Karl Schultzc81037d2016-05-12 08:11:23 -06007052 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007053 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7054 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7055 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7056 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7057 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7058 "vkCreatePipelineLayout() call has push constants with overlapping "
7059 "ranges: 0:[0, 4), 1:[0, 4)"},
7060 {
7061 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7062 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7063 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7064 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7065 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7066 "vkCreatePipelineLayout() call has push constants with "
7067 "overlapping "
7068 "ranges: 3:[12, 20), 4:[16, 20)",
7069 },
7070 {
7071 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7072 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7073 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7074 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7075 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7076 "vkCreatePipelineLayout() call has push constants with "
7077 "overlapping "
7078 "ranges: 0:[16, 20), 1:[12, 20)",
7079 },
7080 {
7081 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7082 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7083 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7084 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7085 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7086 "vkCreatePipelineLayout() call has push constants with "
7087 "overlapping "
7088 "ranges: 0:[16, 20), 3:[12, 20)",
7089 },
7090 {
7091 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7092 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
7093 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
7094 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
7095 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
7096 "vkCreatePipelineLayout() call has push constants with "
7097 "overlapping "
7098 "ranges: 0:[16, 20), 2:[4, 100)",
7099 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007100
Karl Schultzc81037d2016-05-12 08:11:23 -06007101 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007102 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007103 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
7104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007105 iter.msg);
7106 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7107 NULL, &pipeline_layout);
7108 m_errorMonitor->VerifyFound();
7109 if (VK_SUCCESS == err) {
7110 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7111 }
7112 }
7113
7114 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06007115 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
7116 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7117 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7118 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7119 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
7120 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7121 ""},
7122 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
7123 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
7124 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
7125 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
7126 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7127 ""}}};
7128 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007129 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
7130 m_errorMonitor->ExpectSuccess();
7131 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7132 NULL, &pipeline_layout);
7133 m_errorMonitor->VerifyNotFound();
7134 if (VK_SUCCESS == err) {
7135 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7136 }
7137 }
7138
7139 //
7140 // CmdPushConstants tests
7141 //
Karl Schultzc81037d2016-05-12 08:11:23 -06007142 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007143
7144 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06007145 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
7146 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7147 "vkCmdPushConstants() call has push constants with size 0. Size "
7148 "must be greater than zero and a multiple of 4."},
7149 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7150 "vkCmdPushConstants() call has push constants with size 1. Size "
7151 "must be greater than zero and a multiple of 4."},
7152 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7153 "vkCmdPushConstants() call has push constants with size 1. Size "
7154 "must be greater than zero and a multiple of 4."},
7155 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7156 "vkCmdPushConstants() call has push constants with offset 1. "
7157 "Offset must be a multiple of 4."},
7158 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7159 "vkCmdPushConstants() call has push constants with offset 1. "
7160 "Offset must be a multiple of 4."},
7161 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
7162 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
7163 "0x1 not within flag-matching ranges in pipeline layout"},
7164 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
7165 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
7166 "0x1 not within flag-matching ranges in pipeline layout"},
7167 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
7168 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
7169 "0x1 not within flag-matching ranges in pipeline layout"},
7170 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
7171 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
7172 "0x1 not within flag-matching ranges in pipeline layout"},
7173 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7174 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
7175 "any of the ranges in pipeline layout"},
7176 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7177 0, 16},
7178 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
7179 "any of the ranges in pipeline layout"},
7180 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007181 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007182 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007183 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007184 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007185 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007186 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007187 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007188 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007189 "vkCmdPushConstants() call has push constants with offset "},
7190 }};
7191
7192 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06007193 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007194 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06007195 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007196 };
Karl Schultzc81037d2016-05-12 08:11:23 -06007197 pipeline_layout_ci.pushConstantRangeCount =
7198 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007199 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007200 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7201 &pipeline_layout);
7202 ASSERT_VK_SUCCESS(err);
7203 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06007204 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7206 iter.msg);
7207 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06007208 iter.range.stageFlags, iter.range.offset,
7209 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007210 m_errorMonitor->VerifyFound();
7211 }
7212
7213 // Check for invalid stage flag
7214 m_errorMonitor->SetDesiredFailureMsg(
7215 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7216 "vkCmdPushConstants() call has no stageFlags set.");
7217 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06007218 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007219 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06007220 EndCommandBuffer();
7221 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
7222 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007223
Karl Schultzc81037d2016-05-12 08:11:23 -06007224 // overlapping range tests with cmd
7225 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
7226 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
7227 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
7228 "0x1 not within flag-matching ranges in pipeline layout"},
7229 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7230 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
7231 "0x1 not within flag-matching ranges in pipeline layout"},
7232 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
7233 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
7234 "0x1 not within flag-matching ranges in pipeline layout"},
7235 }};
7236 const VkPushConstantRange pc_range3[] = {
7237 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
7238 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7239 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7240 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
7241 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
7242 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
7243 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
7244 };
7245 pipeline_layout_ci.pushConstantRangeCount =
7246 sizeof(pc_range3) / sizeof(VkPushConstantRange);
7247 pipeline_layout_ci.pPushConstantRanges = pc_range3;
7248 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7249 &pipeline_layout);
7250 ASSERT_VK_SUCCESS(err);
7251 BeginCommandBuffer();
7252 for (const auto &iter : cmd_overlap_tests) {
7253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7254 iter.msg);
7255 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
7256 iter.range.stageFlags, iter.range.offset,
7257 iter.range.size, dummy_values);
7258 m_errorMonitor->VerifyFound();
7259 }
7260 EndCommandBuffer();
7261 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
7262 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7263
7264 // positive overlapping range tests with cmd
7265 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
7266 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
7267 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
7268 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
7269 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
7270 }};
7271 const VkPushConstantRange pc_range4[] = {
7272 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
7273 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
7274 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7275 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7276 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
7277 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
7278 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
7279 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
7280 };
7281 pipeline_layout_ci.pushConstantRangeCount =
7282 sizeof(pc_range4) / sizeof(VkPushConstantRange);
7283 pipeline_layout_ci.pPushConstantRanges = pc_range4;
7284 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7285 &pipeline_layout);
7286 ASSERT_VK_SUCCESS(err);
7287 BeginCommandBuffer();
7288 for (const auto &iter : cmd_overlap_tests_pos) {
7289 m_errorMonitor->ExpectSuccess();
7290 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
7291 iter.range.stageFlags, iter.range.offset,
7292 iter.range.size, dummy_values);
7293 m_errorMonitor->VerifyNotFound();
7294 }
7295 EndCommandBuffer();
7296 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007297 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7298}
7299
Karl Schultz6addd812016-02-02 17:17:23 -07007300TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007301 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007302 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007303
7304 ASSERT_NO_FATAL_FAILURE(InitState());
7305 ASSERT_NO_FATAL_FAILURE(InitViewport());
7306 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7307
Mike Stroyanb8a61002016-06-20 16:00:28 -06007308 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
7309 VkImageTiling tiling;
7310 VkFormatProperties format_properties;
7311 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
7312 if (format_properties.linearTilingFeatures &
7313 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
7314 tiling = VK_IMAGE_TILING_LINEAR;
7315 } else if (format_properties.optimalTilingFeatures &
7316 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
7317 tiling = VK_IMAGE_TILING_OPTIMAL;
7318 } else {
7319 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
7320 "skipped.\n");
7321 return;
7322 }
7323
Tobin Ehlis559c6382015-11-05 09:52:49 -07007324 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7325 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007326 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7327 ds_type_count[0].descriptorCount = 10;
7328 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7329 ds_type_count[1].descriptorCount = 2;
7330 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7331 ds_type_count[2].descriptorCount = 2;
7332 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7333 ds_type_count[3].descriptorCount = 5;
7334 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7335 // type
7336 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7337 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7338 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007339
7340 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007341 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7342 ds_pool_ci.pNext = NULL;
7343 ds_pool_ci.maxSets = 5;
7344 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7345 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007346
7347 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007348 err =
7349 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007350 ASSERT_VK_SUCCESS(err);
7351
7352 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7353 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007354 dsl_binding[0].binding = 0;
7355 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7356 dsl_binding[0].descriptorCount = 5;
7357 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7358 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007359
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007360 // Create layout identical to set0 layout but w/ different stageFlags
7361 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007362 dsl_fs_stage_only.binding = 0;
7363 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7364 dsl_fs_stage_only.descriptorCount = 5;
7365 dsl_fs_stage_only.stageFlags =
7366 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7367 // bind time
7368 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007369 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007370 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7371 ds_layout_ci.pNext = NULL;
7372 ds_layout_ci.bindingCount = 1;
7373 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007374 static const uint32_t NUM_LAYOUTS = 4;
7375 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007376 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007377 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7378 // layout for error case
7379 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7380 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007381 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007382 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007383 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7384 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007385 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007386 dsl_binding[0].binding = 0;
7387 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007388 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007389 dsl_binding[1].binding = 1;
7390 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7391 dsl_binding[1].descriptorCount = 2;
7392 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7393 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007394 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007395 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07007396 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7397 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007398 ASSERT_VK_SUCCESS(err);
7399 dsl_binding[0].binding = 0;
7400 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007401 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007402 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007403 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7404 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007405 ASSERT_VK_SUCCESS(err);
7406 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007407 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07007408 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7409 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007410 ASSERT_VK_SUCCESS(err);
7411
7412 static const uint32_t NUM_SETS = 4;
7413 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7414 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007415 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007416 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007417 alloc_info.descriptorPool = ds_pool;
7418 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007419 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7420 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007421 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007422 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007423 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007424 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007425 err =
7426 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007427 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007428
7429 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007430 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7431 pipeline_layout_ci.pNext = NULL;
7432 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7433 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007434
7435 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007436 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7437 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007438 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007439 // Create pipelineLayout with only one setLayout
7440 pipeline_layout_ci.setLayoutCount = 1;
7441 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007442 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7443 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007444 ASSERT_VK_SUCCESS(err);
7445 // Create pipelineLayout with 2 descriptor setLayout at index 0
7446 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7447 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07007448 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7449 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007450 ASSERT_VK_SUCCESS(err);
7451 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7452 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7453 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07007454 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7455 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007456 ASSERT_VK_SUCCESS(err);
7457 // Create pipelineLayout with UB type, but stageFlags for FS only
7458 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7459 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007460 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7461 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007462 ASSERT_VK_SUCCESS(err);
7463 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7464 VkDescriptorSetLayout pl_bad_s0[2] = {};
7465 pl_bad_s0[0] = ds_layout_fs_only;
7466 pl_bad_s0[1] = ds_layout[1];
7467 pipeline_layout_ci.setLayoutCount = 2;
7468 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7469 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07007470 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7471 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007472 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007473
7474 // Create a buffer to update the descriptor with
7475 uint32_t qfi = 0;
7476 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007477 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7478 buffCI.size = 1024;
7479 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7480 buffCI.queueFamilyIndexCount = 1;
7481 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007482
7483 VkBuffer dyub;
7484 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7485 ASSERT_VK_SUCCESS(err);
7486 // Correctly update descriptor to avoid "NOT_UPDATED" error
7487 static const uint32_t NUM_BUFFS = 5;
7488 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007489 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007490 buffInfo[i].buffer = dyub;
7491 buffInfo[i].offset = 0;
7492 buffInfo[i].range = 1024;
7493 }
Karl Schultz6addd812016-02-02 17:17:23 -07007494 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07007495 const int32_t tex_width = 32;
7496 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007497 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007498 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7499 image_create_info.pNext = NULL;
7500 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7501 image_create_info.format = tex_format;
7502 image_create_info.extent.width = tex_width;
7503 image_create_info.extent.height = tex_height;
7504 image_create_info.extent.depth = 1;
7505 image_create_info.mipLevels = 1;
7506 image_create_info.arrayLayers = 1;
7507 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06007508 image_create_info.tiling = tiling;
7509 image_create_info.usage =
7510 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07007511 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007512 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7513 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007514
Karl Schultz6addd812016-02-02 17:17:23 -07007515 VkMemoryRequirements memReqs;
7516 VkDeviceMemory imageMem;
7517 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007518 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007519 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7520 memAlloc.pNext = NULL;
7521 memAlloc.allocationSize = 0;
7522 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007523 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
7524 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007525 pass =
7526 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007527 ASSERT_TRUE(pass);
7528 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
7529 ASSERT_VK_SUCCESS(err);
7530 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
7531 ASSERT_VK_SUCCESS(err);
7532
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007533 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007534 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
7535 image_view_create_info.image = image;
7536 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7537 image_view_create_info.format = tex_format;
7538 image_view_create_info.subresourceRange.layerCount = 1;
7539 image_view_create_info.subresourceRange.baseMipLevel = 0;
7540 image_view_create_info.subresourceRange.levelCount = 1;
7541 image_view_create_info.subresourceRange.aspectMask =
7542 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007543
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007544 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007545 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7546 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007547 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007548 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007549 imageInfo[0].imageView = view;
7550 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
7551 imageInfo[1].imageView = view;
7552 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007553 imageInfo[2].imageView = view;
7554 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
7555 imageInfo[3].imageView = view;
7556 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007557
7558 static const uint32_t NUM_SET_UPDATES = 3;
7559 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
7560 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7561 descriptor_write[0].dstSet = descriptorSet[0];
7562 descriptor_write[0].dstBinding = 0;
7563 descriptor_write[0].descriptorCount = 5;
7564 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7565 descriptor_write[0].pBufferInfo = buffInfo;
7566 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7567 descriptor_write[1].dstSet = descriptorSet[1];
7568 descriptor_write[1].dstBinding = 0;
7569 descriptor_write[1].descriptorCount = 2;
7570 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7571 descriptor_write[1].pImageInfo = imageInfo;
7572 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7573 descriptor_write[2].dstSet = descriptorSet[1];
7574 descriptor_write[2].dstBinding = 1;
7575 descriptor_write[2].descriptorCount = 2;
7576 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007577 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007578
7579 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007580
Tobin Ehlis88452832015-12-03 09:40:56 -07007581 // Create PSO to be used for draw-time errors below
7582 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007583 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007584 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007585 "out gl_PerVertex {\n"
7586 " vec4 gl_Position;\n"
7587 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007588 "void main(){\n"
7589 " gl_Position = vec4(1);\n"
7590 "}\n";
7591 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007592 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007593 "\n"
7594 "layout(location=0) out vec4 x;\n"
7595 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7596 "void main(){\n"
7597 " x = vec4(bar.y);\n"
7598 "}\n";
7599 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7600 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007601 VkPipelineObj pipe(m_device);
7602 pipe.AddShader(&vs);
7603 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007604 pipe.AddColorAttachment();
7605 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007606
7607 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07007608
Karl Schultz6addd812016-02-02 17:17:23 -07007609 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7610 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7611 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7612 // of PSO
7613 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7614 // cmd_pipeline.c
7615 // due to the fact that cmd_alloc_dset_data() has not been called in
7616 // cmd_bind_graphics_pipeline()
7617 // TODO : Want to cause various binding incompatibility issues here to test
7618 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007619 // First cause various verify_layout_compatibility() fails
7620 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007621 // verify_set_layout_compatibility fail cases:
7622 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07007623 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis10fad692016-07-07 12:00:36 -06007624 "Invalid VkPipelineLayout Object ");
Karl Schultz6addd812016-02-02 17:17:23 -07007625 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7626 VK_PIPELINE_BIND_POINT_GRAPHICS,
7627 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
7628 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007629 m_errorMonitor->VerifyFound();
7630
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007631 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07007632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7633 " attempting to bind set to index 1");
7634 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7635 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
7636 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007637 m_errorMonitor->VerifyFound();
7638
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007639 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007640 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7641 // descriptors
7642 m_errorMonitor->SetDesiredFailureMsg(
7643 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06007644 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07007645 vkCmdBindDescriptorSets(
7646 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7647 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007648 m_errorMonitor->VerifyFound();
7649
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007650 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7651 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07007652 m_errorMonitor->SetDesiredFailureMsg(
7653 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06007654 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07007655 vkCmdBindDescriptorSets(
7656 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7657 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007658 m_errorMonitor->VerifyFound();
7659
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007660 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7661 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07007662 m_errorMonitor->SetDesiredFailureMsg(
7663 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06007664 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07007665 vkCmdBindDescriptorSets(
7666 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7667 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007668 m_errorMonitor->VerifyFound();
7669
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007670 // Cause INFO messages due to disturbing previously bound Sets
7671 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07007672 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7673 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7674 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007675 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07007676 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007677 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007678 " previously bound as set #0 was disturbed ");
7679 vkCmdBindDescriptorSets(
7680 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7681 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007682 m_errorMonitor->VerifyFound();
7683
Karl Schultz6addd812016-02-02 17:17:23 -07007684 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7685 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7686 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007687 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007689 " newly bound as set #0 so set #1 and "
7690 "any subsequent sets were disturbed ");
7691 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7692 VK_PIPELINE_BIND_POINT_GRAPHICS,
7693 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007694 m_errorMonitor->VerifyFound();
7695
Tobin Ehlis10fad692016-07-07 12:00:36 -06007696 // Now that we're done actively using the pipelineLayout that gfx pipeline
7697 // was created with, we should be able to delete it. Do that now to verify
7698 // that validation obeys pipelineLayout lifetime
7699 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7700
Tobin Ehlis88452832015-12-03 09:40:56 -07007701 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007702 // 1. Error due to not binding required set (we actually use same code as
7703 // above to disturb set0)
7704 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7705 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7706 2, &descriptorSet[0], 0, NULL);
7707 vkCmdBindDescriptorSets(
7708 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7709 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
7710 m_errorMonitor->SetDesiredFailureMsg(
7711 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7712 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07007713 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007714 m_errorMonitor->VerifyFound();
7715
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007716 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007717 // 2. Error due to bound set not being compatible with PSO's
7718 // VkPipelineLayout (diff stageFlags in this case)
7719 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7720 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7721 2, &descriptorSet[0], 0, NULL);
7722 m_errorMonitor->SetDesiredFailureMsg(
7723 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7724 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007725 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007726 m_errorMonitor->VerifyFound();
7727
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007728 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007729 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007730 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7731 }
7732 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06007733 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
7734 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007735 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007736 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7737 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007738 vkFreeMemory(m_device->device(), imageMem, NULL);
7739 vkDestroyImage(m_device->device(), image, NULL);
7740 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007741}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007742
Karl Schultz6addd812016-02-02 17:17:23 -07007743TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007744
Karl Schultz6addd812016-02-02 17:17:23 -07007745 m_errorMonitor->SetDesiredFailureMsg(
7746 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007747 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007748
7749 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007750 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007751 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007752 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007753
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007754 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007755}
7756
Karl Schultz6addd812016-02-02 17:17:23 -07007757TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7758 VkResult err;
7759 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007760
Karl Schultz6addd812016-02-02 17:17:23 -07007761 m_errorMonitor->SetDesiredFailureMsg(
7762 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07007763 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007764
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007765 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007766
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007767 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007768 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007769 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007770 cmd.commandPool = m_commandPool;
7771 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007772 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007773
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007774 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007775 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007776
7777 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007778 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007779 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007780 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007781 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007782 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
7783 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007784 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007785
7786 // The error should be caught by validation of the BeginCommandBuffer call
7787 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7788
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007789 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007790 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007791}
7792
Karl Schultz6addd812016-02-02 17:17:23 -07007793TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007794 // Cause error due to Begin while recording CB
7795 // Then cause 2 errors for attempting to reset CB w/o having
7796 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7797 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007799 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007800
7801 ASSERT_NO_FATAL_FAILURE(InitState());
7802
7803 // Calls AllocateCommandBuffers
7804 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7805
Karl Schultz6addd812016-02-02 17:17:23 -07007806 // Force the failure by setting the Renderpass and Framebuffer fields with
7807 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007808 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007809 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007810 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7811 cmd_buf_info.pNext = NULL;
7812 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007813 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007814
7815 // Begin CB to transition to recording state
7816 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7817 // Can't re-begin. This should trigger error
7818 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007819 m_errorMonitor->VerifyFound();
7820
Karl Schultz6addd812016-02-02 17:17:23 -07007821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7822 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007823 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
7824 // Reset attempt will trigger error due to incorrect CommandPool state
7825 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007826 m_errorMonitor->VerifyFound();
7827
Karl Schultz6addd812016-02-02 17:17:23 -07007828 m_errorMonitor->SetDesiredFailureMsg(
7829 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7830 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007831 // Transition CB to RECORDED state
7832 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7833 // Now attempting to Begin will implicitly reset, which triggers error
7834 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007835 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007836}
7837
Karl Schultz6addd812016-02-02 17:17:23 -07007838TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007839 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007840 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007841
Karl Schultz6addd812016-02-02 17:17:23 -07007842 m_errorMonitor->SetDesiredFailureMsg(
7843 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007844 "Invalid Pipeline CreateInfo State: Vtx Shader required");
7845
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007846 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007847 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007848
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007849 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007850 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7851 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007852
7853 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007854 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7855 ds_pool_ci.pNext = NULL;
7856 ds_pool_ci.maxSets = 1;
7857 ds_pool_ci.poolSizeCount = 1;
7858 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007859
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007860 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007861 err =
7862 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007863 ASSERT_VK_SUCCESS(err);
7864
Tony Barboureb254902015-07-15 12:50:33 -06007865 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007866 dsl_binding.binding = 0;
7867 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7868 dsl_binding.descriptorCount = 1;
7869 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7870 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007871
Tony Barboureb254902015-07-15 12:50:33 -06007872 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007873 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7874 ds_layout_ci.pNext = NULL;
7875 ds_layout_ci.bindingCount = 1;
7876 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007877
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007878 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007879 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7880 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007881 ASSERT_VK_SUCCESS(err);
7882
7883 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007884 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007885 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007886 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007887 alloc_info.descriptorPool = ds_pool;
7888 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007889 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7890 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007891 ASSERT_VK_SUCCESS(err);
7892
Tony Barboureb254902015-07-15 12:50:33 -06007893 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007894 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7895 pipeline_layout_ci.setLayoutCount = 1;
7896 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007897
7898 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007899 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7900 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007901 ASSERT_VK_SUCCESS(err);
7902
Tobin Ehlise68360f2015-10-01 11:15:13 -06007903 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07007904 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007905
7906 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007907 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7908 vp_state_ci.scissorCount = 1;
7909 vp_state_ci.pScissors = &sc;
7910 vp_state_ci.viewportCount = 1;
7911 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007912
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007913 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7914 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7915 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7916 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7917 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7918 rs_state_ci.depthClampEnable = VK_FALSE;
7919 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7920 rs_state_ci.depthBiasEnable = VK_FALSE;
7921
Tony Barboureb254902015-07-15 12:50:33 -06007922 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007923 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7924 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007925 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007926 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7927 gp_ci.layout = pipeline_layout;
7928 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06007929
7930 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007931 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7932 pc_ci.initialDataSize = 0;
7933 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007934
7935 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007936 VkPipelineCache pipelineCache;
7937
Karl Schultz6addd812016-02-02 17:17:23 -07007938 err =
7939 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007940 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007941 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7942 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007943
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007944 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007945
Chia-I Wuf7458c52015-10-26 21:10:41 +08007946 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7947 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7948 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7949 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007950}
Tobin Ehlis912df022015-09-17 08:46:18 -06007951/*// TODO : This test should be good, but needs Tess support in compiler to run
7952TEST_F(VkLayerTest, InvalidPatchControlPoints)
7953{
7954 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007955 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007956
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007958 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7959primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007960
Tobin Ehlis912df022015-09-17 08:46:18 -06007961 ASSERT_NO_FATAL_FAILURE(InitState());
7962 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007963
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007964 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007965 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007966 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007967
7968 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7969 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7970 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007971 ds_pool_ci.poolSizeCount = 1;
7972 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007973
7974 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007975 err = vkCreateDescriptorPool(m_device->device(),
7976VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007977 ASSERT_VK_SUCCESS(err);
7978
7979 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007980 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007981 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007982 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007983 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7984 dsl_binding.pImmutableSamplers = NULL;
7985
7986 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007987 ds_layout_ci.sType =
7988VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007989 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007990 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007991 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007992
7993 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007994 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7995&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007996 ASSERT_VK_SUCCESS(err);
7997
7998 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007999 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
8000VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06008001 ASSERT_VK_SUCCESS(err);
8002
8003 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008004 pipeline_layout_ci.sType =
8005VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008006 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008007 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008008 pipeline_layout_ci.pSetLayouts = &ds_layout;
8009
8010 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008011 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8012&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008013 ASSERT_VK_SUCCESS(err);
8014
8015 VkPipelineShaderStageCreateInfo shaderStages[3];
8016 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
8017
Karl Schultz6addd812016-02-02 17:17:23 -07008018 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
8019this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008020 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07008021 VkShaderObj
8022tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
8023this);
8024 VkShaderObj
8025te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
8026this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008027
Karl Schultz6addd812016-02-02 17:17:23 -07008028 shaderStages[0].sType =
8029VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008030 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008031 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008032 shaderStages[1].sType =
8033VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008034 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008035 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008036 shaderStages[2].sType =
8037VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008038 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008039 shaderStages[2].shader = te.handle();
8040
8041 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008042 iaCI.sType =
8043VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08008044 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06008045
8046 VkPipelineTessellationStateCreateInfo tsCI = {};
8047 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
8048 tsCI.patchControlPoints = 0; // This will cause an error
8049
8050 VkGraphicsPipelineCreateInfo gp_ci = {};
8051 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8052 gp_ci.pNext = NULL;
8053 gp_ci.stageCount = 3;
8054 gp_ci.pStages = shaderStages;
8055 gp_ci.pVertexInputState = NULL;
8056 gp_ci.pInputAssemblyState = &iaCI;
8057 gp_ci.pTessellationState = &tsCI;
8058 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008059 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06008060 gp_ci.pMultisampleState = NULL;
8061 gp_ci.pDepthStencilState = NULL;
8062 gp_ci.pColorBlendState = NULL;
8063 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8064 gp_ci.layout = pipeline_layout;
8065 gp_ci.renderPass = renderPass();
8066
8067 VkPipelineCacheCreateInfo pc_ci = {};
8068 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8069 pc_ci.pNext = NULL;
8070 pc_ci.initialSize = 0;
8071 pc_ci.initialData = 0;
8072 pc_ci.maxSize = 0;
8073
8074 VkPipeline pipeline;
8075 VkPipelineCache pipelineCache;
8076
Karl Schultz6addd812016-02-02 17:17:23 -07008077 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
8078&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06008079 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008080 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8081&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06008082
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008083 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008084
Chia-I Wuf7458c52015-10-26 21:10:41 +08008085 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8086 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8087 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8088 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06008089}
8090*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06008091// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07008092TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008093 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008094
Karl Schultz6addd812016-02-02 17:17:23 -07008095 m_errorMonitor->SetDesiredFailureMsg(
8096 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008097 "Gfx Pipeline viewport count (1) must match scissor count (0).");
8098
Tobin Ehlise68360f2015-10-01 11:15:13 -06008099 ASSERT_NO_FATAL_FAILURE(InitState());
8100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008101
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008102 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008103 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8104 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008105
8106 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008107 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8108 ds_pool_ci.maxSets = 1;
8109 ds_pool_ci.poolSizeCount = 1;
8110 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008111
8112 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008113 err =
8114 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008115 ASSERT_VK_SUCCESS(err);
8116
8117 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008118 dsl_binding.binding = 0;
8119 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8120 dsl_binding.descriptorCount = 1;
8121 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008122
8123 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008124 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8125 ds_layout_ci.bindingCount = 1;
8126 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008127
8128 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008129 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8130 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008131 ASSERT_VK_SUCCESS(err);
8132
8133 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008134 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008135 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008136 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008137 alloc_info.descriptorPool = ds_pool;
8138 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008139 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8140 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008141 ASSERT_VK_SUCCESS(err);
8142
8143 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008144 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8145 pipeline_layout_ci.setLayoutCount = 1;
8146 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008147
8148 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008149 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8150 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008151 ASSERT_VK_SUCCESS(err);
8152
8153 VkViewport vp = {}; // Just need dummy vp to point to
8154
8155 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008156 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8157 vp_state_ci.scissorCount = 0;
8158 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
8159 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008160
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008161 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8162 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8163 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8164 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8165 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8166 rs_state_ci.depthClampEnable = VK_FALSE;
8167 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8168 rs_state_ci.depthBiasEnable = VK_FALSE;
8169
Cody Northropeb3a6c12015-10-05 14:44:45 -06008170 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008171 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008172
Karl Schultz6addd812016-02-02 17:17:23 -07008173 VkShaderObj vs(m_device, bindStateVertShaderText,
8174 VK_SHADER_STAGE_VERTEX_BIT, this);
8175 VkShaderObj fs(m_device, bindStateFragShaderText,
8176 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008177 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008178 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008179 shaderStages[0] = vs.GetStageCreateInfo();
8180 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008181
8182 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008183 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8184 gp_ci.stageCount = 2;
8185 gp_ci.pStages = shaderStages;
8186 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008187 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008188 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8189 gp_ci.layout = pipeline_layout;
8190 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008191
8192 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008193 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008194
8195 VkPipeline pipeline;
8196 VkPipelineCache pipelineCache;
8197
Karl Schultz6addd812016-02-02 17:17:23 -07008198 err =
8199 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008200 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008201 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8202 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008203
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008204 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008205
Chia-I Wuf7458c52015-10-26 21:10:41 +08008206 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8207 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8208 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8209 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008210}
Karl Schultz6addd812016-02-02 17:17:23 -07008211// Don't set viewport state in PSO. This is an error b/c we always need this
8212// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06008213// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008214TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06008215 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008216 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008217
Karl Schultz6addd812016-02-02 17:17:23 -07008218 m_errorMonitor->SetDesiredFailureMsg(
8219 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008220 "Gfx Pipeline pViewportState is null. Even if ");
8221
Tobin Ehlise68360f2015-10-01 11:15:13 -06008222 ASSERT_NO_FATAL_FAILURE(InitState());
8223 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008224
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008225 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008226 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8227 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008228
8229 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008230 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8231 ds_pool_ci.maxSets = 1;
8232 ds_pool_ci.poolSizeCount = 1;
8233 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008234
8235 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008236 err =
8237 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008238 ASSERT_VK_SUCCESS(err);
8239
8240 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008241 dsl_binding.binding = 0;
8242 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8243 dsl_binding.descriptorCount = 1;
8244 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008245
8246 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008247 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8248 ds_layout_ci.bindingCount = 1;
8249 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008250
8251 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008252 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8253 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008254 ASSERT_VK_SUCCESS(err);
8255
8256 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008257 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008258 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008259 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008260 alloc_info.descriptorPool = ds_pool;
8261 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008262 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8263 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008264 ASSERT_VK_SUCCESS(err);
8265
8266 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008267 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8268 pipeline_layout_ci.setLayoutCount = 1;
8269 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008270
8271 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008272 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8273 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008274 ASSERT_VK_SUCCESS(err);
8275
8276 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8277 // Set scissor as dynamic to avoid second error
8278 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008279 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8280 dyn_state_ci.dynamicStateCount = 1;
8281 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008282
Cody Northropeb3a6c12015-10-05 14:44:45 -06008283 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008284 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008285
Karl Schultz6addd812016-02-02 17:17:23 -07008286 VkShaderObj vs(m_device, bindStateVertShaderText,
8287 VK_SHADER_STAGE_VERTEX_BIT, this);
8288 VkShaderObj fs(m_device, bindStateFragShaderText,
8289 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008290 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008291 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008292 shaderStages[0] = vs.GetStageCreateInfo();
8293 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008294
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008295
8296 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8297 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8298 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8299 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8300 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8301 rs_state_ci.depthClampEnable = VK_FALSE;
8302 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8303 rs_state_ci.depthBiasEnable = VK_FALSE;
8304
Tobin Ehlise68360f2015-10-01 11:15:13 -06008305 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008306 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8307 gp_ci.stageCount = 2;
8308 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008309 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008310 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
8311 // should cause validation error
8312 gp_ci.pDynamicState = &dyn_state_ci;
8313 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8314 gp_ci.layout = pipeline_layout;
8315 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008316
8317 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008318 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008319
8320 VkPipeline pipeline;
8321 VkPipelineCache pipelineCache;
8322
Karl Schultz6addd812016-02-02 17:17:23 -07008323 err =
8324 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008325 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008326 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8327 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008328
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008329 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008330
Chia-I Wuf7458c52015-10-26 21:10:41 +08008331 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8332 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8333 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8334 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008335}
8336// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07008337// Then run second test where dynamic scissor count doesn't match PSO scissor
8338// count
8339TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8340 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008341
Karl Schultz6addd812016-02-02 17:17:23 -07008342 m_errorMonitor->SetDesiredFailureMsg(
8343 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008344 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
8345
Tobin Ehlise68360f2015-10-01 11:15:13 -06008346 ASSERT_NO_FATAL_FAILURE(InitState());
8347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008348
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008349 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008350 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8351 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008352
8353 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008354 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8355 ds_pool_ci.maxSets = 1;
8356 ds_pool_ci.poolSizeCount = 1;
8357 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008358
8359 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008360 err =
8361 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008362 ASSERT_VK_SUCCESS(err);
8363
8364 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008365 dsl_binding.binding = 0;
8366 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8367 dsl_binding.descriptorCount = 1;
8368 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008369
8370 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008371 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8372 ds_layout_ci.bindingCount = 1;
8373 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008374
8375 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008376 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8377 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008378 ASSERT_VK_SUCCESS(err);
8379
8380 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008381 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008382 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008383 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008384 alloc_info.descriptorPool = ds_pool;
8385 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008386 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8387 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008388 ASSERT_VK_SUCCESS(err);
8389
8390 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008391 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8392 pipeline_layout_ci.setLayoutCount = 1;
8393 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008394
8395 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008396 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8397 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008398 ASSERT_VK_SUCCESS(err);
8399
8400 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008401 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8402 vp_state_ci.viewportCount = 1;
8403 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
8404 vp_state_ci.scissorCount = 1;
8405 vp_state_ci.pScissors =
8406 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008407
8408 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8409 // Set scissor as dynamic to avoid that error
8410 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008411 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8412 dyn_state_ci.dynamicStateCount = 1;
8413 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008414
Cody Northropeb3a6c12015-10-05 14:44:45 -06008415 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008416 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008417
Karl Schultz6addd812016-02-02 17:17:23 -07008418 VkShaderObj vs(m_device, bindStateVertShaderText,
8419 VK_SHADER_STAGE_VERTEX_BIT, this);
8420 VkShaderObj fs(m_device, bindStateFragShaderText,
8421 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008422 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008423 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008424 shaderStages[0] = vs.GetStageCreateInfo();
8425 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008426
Cody Northropf6622dc2015-10-06 10:33:21 -06008427 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8428 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8429 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008430 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008431 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008432 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008433 vi_ci.pVertexAttributeDescriptions = nullptr;
8434
8435 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8436 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8437 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8438
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008439 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008440 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06008441 rs_ci.pNext = nullptr;
8442
Mark Youngc89c6312016-03-31 16:03:20 -06008443 VkPipelineColorBlendAttachmentState att = {};
8444 att.blendEnable = VK_FALSE;
8445 att.colorWriteMask = 0xf;
8446
Cody Northropf6622dc2015-10-06 10:33:21 -06008447 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8448 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8449 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008450 cb_ci.attachmentCount = 1;
8451 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008452
Tobin Ehlise68360f2015-10-01 11:15:13 -06008453 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008454 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8455 gp_ci.stageCount = 2;
8456 gp_ci.pStages = shaderStages;
8457 gp_ci.pVertexInputState = &vi_ci;
8458 gp_ci.pInputAssemblyState = &ia_ci;
8459 gp_ci.pViewportState = &vp_state_ci;
8460 gp_ci.pRasterizationState = &rs_ci;
8461 gp_ci.pColorBlendState = &cb_ci;
8462 gp_ci.pDynamicState = &dyn_state_ci;
8463 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8464 gp_ci.layout = pipeline_layout;
8465 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008466
8467 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008468 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008469
8470 VkPipeline pipeline;
8471 VkPipelineCache pipelineCache;
8472
Karl Schultz6addd812016-02-02 17:17:23 -07008473 err =
8474 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008475 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008476 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8477 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008478
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008479 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008480
Tobin Ehlisd332f282015-10-02 11:00:56 -06008481 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008482 // First need to successfully create the PSO from above by setting
8483 // pViewports
8484 m_errorMonitor->SetDesiredFailureMsg(
8485 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8486 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
8487 "scissorCount is 1. These counts must match.");
8488
8489 VkViewport vp = {}; // Just need dummy vp to point to
8490 vp_state_ci.pViewports = &vp;
8491 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8492 &gp_ci, NULL, &pipeline);
8493 ASSERT_VK_SUCCESS(err);
8494 BeginCommandBuffer();
8495 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8496 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
8497 VkRect2D scissors[2] = {}; // don't care about data
8498 // Count of 2 doesn't match PSO count of 1
8499 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
8500 Draw(1, 0, 0, 0);
8501
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008502 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008503
8504 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8505 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8506 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8507 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008508 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008509}
8510// Create PSO w/o non-zero scissorCount but no scissor data
8511// Then run second test where dynamic viewportCount doesn't match PSO
8512// viewportCount
8513TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8514 VkResult err;
8515
8516 m_errorMonitor->SetDesiredFailureMsg(
8517 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8518 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
8519
8520 ASSERT_NO_FATAL_FAILURE(InitState());
8521 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8522
8523 VkDescriptorPoolSize ds_type_count = {};
8524 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8525 ds_type_count.descriptorCount = 1;
8526
8527 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8528 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8529 ds_pool_ci.maxSets = 1;
8530 ds_pool_ci.poolSizeCount = 1;
8531 ds_pool_ci.pPoolSizes = &ds_type_count;
8532
8533 VkDescriptorPool ds_pool;
8534 err =
8535 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
8536 ASSERT_VK_SUCCESS(err);
8537
8538 VkDescriptorSetLayoutBinding dsl_binding = {};
8539 dsl_binding.binding = 0;
8540 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8541 dsl_binding.descriptorCount = 1;
8542 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8543
8544 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8545 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8546 ds_layout_ci.bindingCount = 1;
8547 ds_layout_ci.pBindings = &dsl_binding;
8548
8549 VkDescriptorSetLayout ds_layout;
8550 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8551 &ds_layout);
8552 ASSERT_VK_SUCCESS(err);
8553
8554 VkDescriptorSet descriptorSet;
8555 VkDescriptorSetAllocateInfo alloc_info = {};
8556 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8557 alloc_info.descriptorSetCount = 1;
8558 alloc_info.descriptorPool = ds_pool;
8559 alloc_info.pSetLayouts = &ds_layout;
8560 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8561 &descriptorSet);
8562 ASSERT_VK_SUCCESS(err);
8563
8564 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8565 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8566 pipeline_layout_ci.setLayoutCount = 1;
8567 pipeline_layout_ci.pSetLayouts = &ds_layout;
8568
8569 VkPipelineLayout pipeline_layout;
8570 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8571 &pipeline_layout);
8572 ASSERT_VK_SUCCESS(err);
8573
8574 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8575 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8576 vp_state_ci.scissorCount = 1;
8577 vp_state_ci.pScissors =
8578 NULL; // Null scissor w/ count of 1 should cause error
8579 vp_state_ci.viewportCount = 1;
8580 vp_state_ci.pViewports =
8581 NULL; // vp is dynamic (below) so this won't cause error
8582
8583 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8584 // Set scissor as dynamic to avoid that error
8585 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8586 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8587 dyn_state_ci.dynamicStateCount = 1;
8588 dyn_state_ci.pDynamicStates = &vp_state;
8589
8590 VkPipelineShaderStageCreateInfo shaderStages[2];
8591 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8592
8593 VkShaderObj vs(m_device, bindStateVertShaderText,
8594 VK_SHADER_STAGE_VERTEX_BIT, this);
8595 VkShaderObj fs(m_device, bindStateFragShaderText,
8596 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008597 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008598 // but add it to be able to run on more devices
8599 shaderStages[0] = vs.GetStageCreateInfo();
8600 shaderStages[1] = fs.GetStageCreateInfo();
8601
8602 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8603 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8604 vi_ci.pNext = nullptr;
8605 vi_ci.vertexBindingDescriptionCount = 0;
8606 vi_ci.pVertexBindingDescriptions = nullptr;
8607 vi_ci.vertexAttributeDescriptionCount = 0;
8608 vi_ci.pVertexAttributeDescriptions = nullptr;
8609
8610 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8611 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8612 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8613
8614 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8615 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8616 rs_ci.pNext = nullptr;
8617
Mark Youngc89c6312016-03-31 16:03:20 -06008618 VkPipelineColorBlendAttachmentState att = {};
8619 att.blendEnable = VK_FALSE;
8620 att.colorWriteMask = 0xf;
8621
Karl Schultz6addd812016-02-02 17:17:23 -07008622 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8623 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8624 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008625 cb_ci.attachmentCount = 1;
8626 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008627
8628 VkGraphicsPipelineCreateInfo gp_ci = {};
8629 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8630 gp_ci.stageCount = 2;
8631 gp_ci.pStages = shaderStages;
8632 gp_ci.pVertexInputState = &vi_ci;
8633 gp_ci.pInputAssemblyState = &ia_ci;
8634 gp_ci.pViewportState = &vp_state_ci;
8635 gp_ci.pRasterizationState = &rs_ci;
8636 gp_ci.pColorBlendState = &cb_ci;
8637 gp_ci.pDynamicState = &dyn_state_ci;
8638 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8639 gp_ci.layout = pipeline_layout;
8640 gp_ci.renderPass = renderPass();
8641
8642 VkPipelineCacheCreateInfo pc_ci = {};
8643 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8644
8645 VkPipeline pipeline;
8646 VkPipelineCache pipelineCache;
8647
8648 err =
8649 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
8650 ASSERT_VK_SUCCESS(err);
8651 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8652 &gp_ci, NULL, &pipeline);
8653
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008654 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008655
8656 // Now hit second fail case where we set scissor w/ different count than PSO
8657 // First need to successfully create the PSO from above by setting
8658 // pViewports
8659 m_errorMonitor->SetDesiredFailureMsg(
8660 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8661 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
8662 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008663
Tobin Ehlisd332f282015-10-02 11:00:56 -06008664 VkRect2D sc = {}; // Just need dummy vp to point to
8665 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07008666 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8667 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008668 ASSERT_VK_SUCCESS(err);
8669 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008670 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8671 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008672 VkViewport viewports[2] = {}; // don't care about data
8673 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07008674 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008675 Draw(1, 0, 0, 0);
8676
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008677 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008678
Chia-I Wuf7458c52015-10-26 21:10:41 +08008679 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8680 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8681 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8682 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008683 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008684}
8685
Mark Young7394fdd2016-03-31 14:56:43 -06008686TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8687 VkResult err;
8688
8689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06008690 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008691
8692 ASSERT_NO_FATAL_FAILURE(InitState());
8693 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8694
8695 VkDescriptorPoolSize ds_type_count = {};
8696 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8697 ds_type_count.descriptorCount = 1;
8698
8699 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8700 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8701 ds_pool_ci.maxSets = 1;
8702 ds_pool_ci.poolSizeCount = 1;
8703 ds_pool_ci.pPoolSizes = &ds_type_count;
8704
8705 VkDescriptorPool ds_pool;
8706 err =
8707 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
8708 ASSERT_VK_SUCCESS(err);
8709
8710 VkDescriptorSetLayoutBinding dsl_binding = {};
8711 dsl_binding.binding = 0;
8712 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8713 dsl_binding.descriptorCount = 1;
8714 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8715
8716 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8717 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8718 ds_layout_ci.bindingCount = 1;
8719 ds_layout_ci.pBindings = &dsl_binding;
8720
8721 VkDescriptorSetLayout ds_layout;
8722 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8723 &ds_layout);
8724 ASSERT_VK_SUCCESS(err);
8725
8726 VkDescriptorSet descriptorSet;
8727 VkDescriptorSetAllocateInfo alloc_info = {};
8728 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8729 alloc_info.descriptorSetCount = 1;
8730 alloc_info.descriptorPool = ds_pool;
8731 alloc_info.pSetLayouts = &ds_layout;
8732 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8733 &descriptorSet);
8734 ASSERT_VK_SUCCESS(err);
8735
8736 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8737 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8738 pipeline_layout_ci.setLayoutCount = 1;
8739 pipeline_layout_ci.pSetLayouts = &ds_layout;
8740
8741 VkPipelineLayout pipeline_layout;
8742 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8743 &pipeline_layout);
8744 ASSERT_VK_SUCCESS(err);
8745
8746 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8747 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8748 vp_state_ci.scissorCount = 1;
8749 vp_state_ci.pScissors = NULL;
8750 vp_state_ci.viewportCount = 1;
8751 vp_state_ci.pViewports = NULL;
8752
8753 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
8754 VK_DYNAMIC_STATE_SCISSOR,
8755 VK_DYNAMIC_STATE_LINE_WIDTH};
8756 // Set scissor as dynamic to avoid that error
8757 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8758 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8759 dyn_state_ci.dynamicStateCount = 2;
8760 dyn_state_ci.pDynamicStates = dynamic_states;
8761
8762 VkPipelineShaderStageCreateInfo shaderStages[2];
8763 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8764
8765 VkShaderObj vs(m_device, bindStateVertShaderText,
8766 VK_SHADER_STAGE_VERTEX_BIT, this);
8767 VkShaderObj fs(m_device, bindStateFragShaderText,
8768 VK_SHADER_STAGE_FRAGMENT_BIT,
8769 this); // TODO - We shouldn't need a fragment shader
8770 // but add it to be able to run on more devices
8771 shaderStages[0] = vs.GetStageCreateInfo();
8772 shaderStages[1] = fs.GetStageCreateInfo();
8773
8774 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8775 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8776 vi_ci.pNext = nullptr;
8777 vi_ci.vertexBindingDescriptionCount = 0;
8778 vi_ci.pVertexBindingDescriptions = nullptr;
8779 vi_ci.vertexAttributeDescriptionCount = 0;
8780 vi_ci.pVertexAttributeDescriptions = nullptr;
8781
8782 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8783 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8784 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8785
8786 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8787 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8788 rs_ci.pNext = nullptr;
8789
Mark Young47107952016-05-02 15:59:55 -06008790 // Check too low (line width of -1.0f).
8791 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008792
8793 VkPipelineColorBlendAttachmentState att = {};
8794 att.blendEnable = VK_FALSE;
8795 att.colorWriteMask = 0xf;
8796
8797 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8798 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8799 cb_ci.pNext = nullptr;
8800 cb_ci.attachmentCount = 1;
8801 cb_ci.pAttachments = &att;
8802
8803 VkGraphicsPipelineCreateInfo gp_ci = {};
8804 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8805 gp_ci.stageCount = 2;
8806 gp_ci.pStages = shaderStages;
8807 gp_ci.pVertexInputState = &vi_ci;
8808 gp_ci.pInputAssemblyState = &ia_ci;
8809 gp_ci.pViewportState = &vp_state_ci;
8810 gp_ci.pRasterizationState = &rs_ci;
8811 gp_ci.pColorBlendState = &cb_ci;
8812 gp_ci.pDynamicState = &dyn_state_ci;
8813 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8814 gp_ci.layout = pipeline_layout;
8815 gp_ci.renderPass = renderPass();
8816
8817 VkPipelineCacheCreateInfo pc_ci = {};
8818 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8819
8820 VkPipeline pipeline;
8821 VkPipelineCache pipelineCache;
8822
8823 err =
8824 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
8825 ASSERT_VK_SUCCESS(err);
8826 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8827 &gp_ci, NULL, &pipeline);
8828
8829 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008830 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008831
8832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8833 "Attempt to set lineWidth to 65536");
8834
8835 // Check too high (line width of 65536.0f).
8836 rs_ci.lineWidth = 65536.0f;
8837
8838 err =
8839 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
8840 ASSERT_VK_SUCCESS(err);
8841 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8842 &gp_ci, NULL, &pipeline);
8843
8844 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008845 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008846
8847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06008848 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008849
8850 dyn_state_ci.dynamicStateCount = 3;
8851
8852 rs_ci.lineWidth = 1.0f;
8853
8854 err =
8855 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
8856 ASSERT_VK_SUCCESS(err);
8857 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8858 &gp_ci, NULL, &pipeline);
8859 BeginCommandBuffer();
8860 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8861 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
8862
8863 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008864 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008865 m_errorMonitor->VerifyFound();
8866
8867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8868 "Attempt to set lineWidth to 65536");
8869
8870 // Check too high with dynamic setting.
8871 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8872 m_errorMonitor->VerifyFound();
8873 EndCommandBuffer();
8874
8875 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8876 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8877 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8878 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008879 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008880}
8881
Karl Schultz6addd812016-02-02 17:17:23 -07008882TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008883 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008884 m_errorMonitor->SetDesiredFailureMsg(
8885 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008886 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008887
8888 ASSERT_NO_FATAL_FAILURE(InitState());
8889 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008890
Tony Barbourfe3351b2015-07-28 10:17:20 -06008891 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008892 // Don't care about RenderPass handle b/c error should be flagged before
8893 // that
8894 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
8895 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008896
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008897 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008898}
8899
Karl Schultz6addd812016-02-02 17:17:23 -07008900TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008901 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008902 m_errorMonitor->SetDesiredFailureMsg(
8903 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008904 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008905
8906 ASSERT_NO_FATAL_FAILURE(InitState());
8907 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008908
Tony Barbourfe3351b2015-07-28 10:17:20 -06008909 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008910 // Just create a dummy Renderpass that's non-NULL so we can get to the
8911 // proper error
Chris Forbes38ae7c42016-06-21 20:51:44 +12008912 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
Karl Schultz6addd812016-02-02 17:17:23 -07008913 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008914
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008915 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008916}
8917
Chris Forbes2eeabe32016-06-21 20:52:34 +12008918TEST_F(VkLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
8919 m_errorMonitor->ExpectSuccess();
8920
8921 ASSERT_NO_FATAL_FAILURE(InitState());
8922 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8923
8924 BeginCommandBuffer(); // framework implicitly begins the renderpass.
8925 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // end implicit.
8926
8927 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
8928 VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
8929 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8930 m_errorMonitor->VerifyNotFound();
8931 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
8932 VK_SUBPASS_CONTENTS_INLINE);
8933 m_errorMonitor->VerifyNotFound();
8934 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8935 m_errorMonitor->VerifyNotFound();
8936
8937 m_commandBuffer->EndCommandBuffer();
8938 m_errorMonitor->VerifyNotFound();
8939}
8940
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008941TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
8942 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
8943 "the number of renderPass attachments that use loadOp"
8944 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
8945
8946 ASSERT_NO_FATAL_FAILURE(InitState());
8947 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8948
8949 // Create a renderPass with a single attachment that uses loadOp CLEAR
8950 VkAttachmentReference attach = {};
8951 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8952 VkSubpassDescription subpass = {};
8953 subpass.inputAttachmentCount = 1;
8954 subpass.pInputAttachments = &attach;
8955 VkRenderPassCreateInfo rpci = {};
8956 rpci.subpassCount = 1;
8957 rpci.pSubpasses = &subpass;
8958 rpci.attachmentCount = 1;
8959 VkAttachmentDescription attach_desc = {};
8960 attach_desc.format = VK_FORMAT_UNDEFINED;
8961 // Set loadOp to CLEAR
8962 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8963 rpci.pAttachments = &attach_desc;
8964 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8965 VkRenderPass rp;
8966 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8967
8968 VkCommandBufferInheritanceInfo hinfo = {};
8969 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8970 hinfo.renderPass = VK_NULL_HANDLE;
8971 hinfo.subpass = 0;
8972 hinfo.framebuffer = VK_NULL_HANDLE;
8973 hinfo.occlusionQueryEnable = VK_FALSE;
8974 hinfo.queryFlags = 0;
8975 hinfo.pipelineStatistics = 0;
8976 VkCommandBufferBeginInfo info = {};
8977 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8978 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8979 info.pInheritanceInfo = &hinfo;
8980
8981 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8982 VkRenderPassBeginInfo rp_begin = {};
8983 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8984 rp_begin.pNext = NULL;
8985 rp_begin.renderPass = renderPass();
8986 rp_begin.framebuffer = framebuffer();
8987 rp_begin.clearValueCount = 0; // Should be 1
8988
8989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8990 " has a clearValueCount of 0 but the "
8991 "actual number of attachments in "
8992 "renderPass ");
8993
8994 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
8995 VK_SUBPASS_CONTENTS_INLINE);
8996
8997 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008998
8999 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009000}
9001
Cody Northrop3bb4d962016-05-09 16:15:57 -06009002TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
9003
9004 TEST_DESCRIPTION("End a command buffer with an active render pass");
9005
9006 m_errorMonitor->SetDesiredFailureMsg(
9007 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9008 "It is invalid to issue this call inside an active render pass");
9009
9010 ASSERT_NO_FATAL_FAILURE(InitState());
9011 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9012
9013 // The framework's BeginCommandBuffer calls CreateRenderPass
9014 BeginCommandBuffer();
9015
9016 // Call directly into vkEndCommandBuffer instead of the
9017 // the framework's EndCommandBuffer, which inserts a
9018 // vkEndRenderPass
9019 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
9020
9021 m_errorMonitor->VerifyFound();
9022
9023 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
9024 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
9025}
9026
Karl Schultz6addd812016-02-02 17:17:23 -07009027TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009028 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009029 m_errorMonitor->SetDesiredFailureMsg(
9030 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009031 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009032
9033 ASSERT_NO_FATAL_FAILURE(InitState());
9034 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009035
9036 // Renderpass is started here
9037 BeginCommandBuffer();
9038
9039 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009040 vk_testing::Buffer dstBuffer;
9041 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009042
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009043 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009044
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009045 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009046}
9047
Karl Schultz6addd812016-02-02 17:17:23 -07009048TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009049 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009050 m_errorMonitor->SetDesiredFailureMsg(
9051 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009052 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009053
9054 ASSERT_NO_FATAL_FAILURE(InitState());
9055 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009056
9057 // Renderpass is started here
9058 BeginCommandBuffer();
9059
9060 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009061 vk_testing::Buffer dstBuffer;
9062 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009063
Karl Schultz6addd812016-02-02 17:17:23 -07009064 VkDeviceSize dstOffset = 0;
9065 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -06009066 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009067
Karl Schultz6addd812016-02-02 17:17:23 -07009068 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
9069 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009070
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009071 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009072}
9073
Karl Schultz6addd812016-02-02 17:17:23 -07009074TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009075 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009076 m_errorMonitor->SetDesiredFailureMsg(
9077 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009078 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009079
9080 ASSERT_NO_FATAL_FAILURE(InitState());
9081 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009082
9083 // Renderpass is started here
9084 BeginCommandBuffer();
9085
Michael Lentine0a369f62016-02-03 16:51:46 -06009086 VkClearColorValue clear_color;
9087 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07009088 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9089 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9090 const int32_t tex_width = 32;
9091 const int32_t tex_height = 32;
9092 VkImageCreateInfo image_create_info = {};
9093 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9094 image_create_info.pNext = NULL;
9095 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9096 image_create_info.format = tex_format;
9097 image_create_info.extent.width = tex_width;
9098 image_create_info.extent.height = tex_height;
9099 image_create_info.extent.depth = 1;
9100 image_create_info.mipLevels = 1;
9101 image_create_info.arrayLayers = 1;
9102 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9103 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9104 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009105
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009106 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07009107 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
9108 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009109
Karl Schultz6addd812016-02-02 17:17:23 -07009110 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
9111 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009112
Karl Schultz6addd812016-02-02 17:17:23 -07009113 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
9114 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009115
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009116 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009117}
9118
Karl Schultz6addd812016-02-02 17:17:23 -07009119TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009120 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009121 m_errorMonitor->SetDesiredFailureMsg(
9122 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009123 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009124
9125 ASSERT_NO_FATAL_FAILURE(InitState());
9126 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009127
9128 // Renderpass is started here
9129 BeginCommandBuffer();
9130
9131 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07009132 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009133 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
9134 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9135 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
9136 image_create_info.extent.width = 64;
9137 image_create_info.extent.height = 64;
9138 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9139 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009140
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009141 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07009142 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
9143 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009144
Karl Schultz6addd812016-02-02 17:17:23 -07009145 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
9146 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009147
Karl Schultz6addd812016-02-02 17:17:23 -07009148 vkCmdClearDepthStencilImage(
9149 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
9150 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
9151 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009152
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009153 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009154}
9155
Karl Schultz6addd812016-02-02 17:17:23 -07009156TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009157 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009158 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009159
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009161 "vkCmdClearAttachments: This call "
9162 "must be issued inside an active "
9163 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009164
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009165 ASSERT_NO_FATAL_FAILURE(InitState());
9166 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009167
9168 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009169 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009170 ASSERT_VK_SUCCESS(err);
9171
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009172 VkClearAttachment color_attachment;
9173 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9174 color_attachment.clearValue.color.float32[0] = 0;
9175 color_attachment.clearValue.color.float32[1] = 0;
9176 color_attachment.clearValue.color.float32[2] = 0;
9177 color_attachment.clearValue.color.float32[3] = 0;
9178 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009179 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
9180 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
9181 &color_attachment, 1, &clear_rect);
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 Schultz9e66a292016-04-21 15:57:51 -06009186TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9187 // Try to add a buffer memory barrier with no buffer.
9188 m_errorMonitor->SetDesiredFailureMsg(
9189 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9190 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
9191
9192 ASSERT_NO_FATAL_FAILURE(InitState());
9193 BeginCommandBuffer();
9194
9195 VkBufferMemoryBarrier buf_barrier = {};
9196 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9197 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9198 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9199 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9200 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9201 buf_barrier.buffer = VK_NULL_HANDLE;
9202 buf_barrier.offset = 0;
9203 buf_barrier.size = VK_WHOLE_SIZE;
9204 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9205 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
9206 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
9207
9208 m_errorMonitor->VerifyFound();
9209}
9210
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009211TEST_F(VkLayerTest, InvalidBarriers) {
9212 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9213
9214 m_errorMonitor->SetDesiredFailureMsg(
9215 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
9216
9217 ASSERT_NO_FATAL_FAILURE(InitState());
9218 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9219
9220 VkMemoryBarrier mem_barrier = {};
9221 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9222 mem_barrier.pNext = NULL;
9223 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9224 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9225 BeginCommandBuffer();
9226 // BeginCommandBuffer() starts a render pass
9227 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9228 VK_PIPELINE_STAGE_HOST_BIT,
9229 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
9230 &mem_barrier, 0, nullptr, 0, nullptr);
9231 m_errorMonitor->VerifyFound();
9232
9233 m_errorMonitor->SetDesiredFailureMsg(
9234 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9235 "Image Layout cannot be transitioned to UNDEFINED");
9236 VkImageObj image(m_device);
9237 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9238 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9239 ASSERT_TRUE(image.initialized());
9240 VkImageMemoryBarrier img_barrier = {};
9241 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9242 img_barrier.pNext = NULL;
9243 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9244 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9245 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9246 // New layout can't be UNDEFINED
9247 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9248 img_barrier.image = image.handle();
9249 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9250 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9251 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9252 img_barrier.subresourceRange.baseArrayLayer = 0;
9253 img_barrier.subresourceRange.baseMipLevel = 0;
9254 img_barrier.subresourceRange.layerCount = 1;
9255 img_barrier.subresourceRange.levelCount = 1;
9256 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9257 VK_PIPELINE_STAGE_HOST_BIT,
9258 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9259 nullptr, 1, &img_barrier);
9260 m_errorMonitor->VerifyFound();
9261 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9262
9263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9264 "Subresource must have the sum of the "
9265 "baseArrayLayer");
9266 // baseArrayLayer + layerCount must be <= image's arrayLayers
9267 img_barrier.subresourceRange.baseArrayLayer = 1;
9268 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9269 VK_PIPELINE_STAGE_HOST_BIT,
9270 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9271 nullptr, 1, &img_barrier);
9272 m_errorMonitor->VerifyFound();
9273 img_barrier.subresourceRange.baseArrayLayer = 0;
9274
9275 m_errorMonitor->SetDesiredFailureMsg(
9276 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9277 "Subresource must have the sum of the baseMipLevel");
9278 // baseMipLevel + levelCount must be <= image's mipLevels
9279 img_barrier.subresourceRange.baseMipLevel = 1;
9280 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9281 VK_PIPELINE_STAGE_HOST_BIT,
9282 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9283 nullptr, 1, &img_barrier);
9284 m_errorMonitor->VerifyFound();
9285 img_barrier.subresourceRange.baseMipLevel = 0;
9286
9287 m_errorMonitor->SetDesiredFailureMsg(
9288 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9289 "Buffer Barriers cannot be used during a render pass");
9290 vk_testing::Buffer buffer;
9291 buffer.init(*m_device, 256);
9292 VkBufferMemoryBarrier buf_barrier = {};
9293 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9294 buf_barrier.pNext = NULL;
9295 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9296 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9297 buf_barrier.buffer = buffer.handle();
9298 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9299 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9300 buf_barrier.offset = 0;
9301 buf_barrier.size = VK_WHOLE_SIZE;
9302 // Can't send buffer barrier during a render pass
9303 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9304 VK_PIPELINE_STAGE_HOST_BIT,
9305 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9306 &buf_barrier, 0, nullptr);
9307 m_errorMonitor->VerifyFound();
9308 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9309
9310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9311 "which is not less than total size");
9312 buf_barrier.offset = 257;
9313 // Offset greater than total size
9314 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9315 VK_PIPELINE_STAGE_HOST_BIT,
9316 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9317 &buf_barrier, 0, nullptr);
9318 m_errorMonitor->VerifyFound();
9319 buf_barrier.offset = 0;
9320
9321 m_errorMonitor->SetDesiredFailureMsg(
9322 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
9323 buf_barrier.size = 257;
9324 // Size greater than total size
9325 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9326 VK_PIPELINE_STAGE_HOST_BIT,
9327 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9328 &buf_barrier, 0, nullptr);
9329 m_errorMonitor->VerifyFound();
9330 buf_barrier.size = VK_WHOLE_SIZE;
9331
9332 m_errorMonitor->SetDesiredFailureMsg(
9333 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9334 "Image is a depth and stencil format and thus must "
9335 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
9336 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
9337 VkDepthStencilObj ds_image(m_device);
9338 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
9339 ASSERT_TRUE(ds_image.initialized());
9340 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9341 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9342 img_barrier.image = ds_image.handle();
9343 // Leave aspectMask at COLOR on purpose
9344 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9345 VK_PIPELINE_STAGE_HOST_BIT,
9346 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9347 nullptr, 1, &img_barrier);
9348 m_errorMonitor->VerifyFound();
9349}
9350
Karl Schultz6addd812016-02-02 17:17:23 -07009351TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009352 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009353 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009354
Karl Schultz6addd812016-02-02 17:17:23 -07009355 m_errorMonitor->SetDesiredFailureMsg(
9356 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009357 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9358
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009359 ASSERT_NO_FATAL_FAILURE(InitState());
9360 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009361 uint32_t qfi = 0;
9362 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009363 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9364 buffCI.size = 1024;
9365 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9366 buffCI.queueFamilyIndexCount = 1;
9367 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009368
9369 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009370 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009371 ASSERT_VK_SUCCESS(err);
9372
9373 BeginCommandBuffer();
9374 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009375 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9376 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009377 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07009378 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
9379 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009380
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009381 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009382
Chia-I Wuf7458c52015-10-26 21:10:41 +08009383 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009384}
9385
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009386TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9387 // Create an out-of-range queueFamilyIndex
9388 m_errorMonitor->SetDesiredFailureMsg(
9389 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -06009390 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
9391 "of the indices specified when the device was created, via the "
9392 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009393
9394 ASSERT_NO_FATAL_FAILURE(InitState());
9395 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9396 VkBufferCreateInfo buffCI = {};
9397 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9398 buffCI.size = 1024;
9399 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9400 buffCI.queueFamilyIndexCount = 1;
9401 // Introduce failure by specifying invalid queue_family_index
9402 uint32_t qfi = 777;
9403 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06009404 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009405
9406 VkBuffer ib;
9407 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
9408
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009409 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009410 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009411}
9412
Karl Schultz6addd812016-02-02 17:17:23 -07009413TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
9414 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
9415 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009416
Karl Schultz6addd812016-02-02 17:17:23 -07009417 m_errorMonitor->SetDesiredFailureMsg(
9418 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009419 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009420
9421 ASSERT_NO_FATAL_FAILURE(InitState());
9422 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009423
9424 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009425 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009426 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
9427 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009428
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009429 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009430}
9431
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009432TEST_F(VkLayerTest, DSUsageBitsErrors) {
9433 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
9434 "that do not have correct usage bits sets.");
9435 VkResult err;
9436
9437 ASSERT_NO_FATAL_FAILURE(InitState());
9438 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9439 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9440 ds_type_count[i].type = VkDescriptorType(i);
9441 ds_type_count[i].descriptorCount = 1;
9442 }
9443 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9444 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9445 ds_pool_ci.pNext = NULL;
9446 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9447 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9448 ds_pool_ci.pPoolSizes = ds_type_count;
9449
9450 VkDescriptorPool ds_pool;
9451 err =
9452 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9453 ASSERT_VK_SUCCESS(err);
9454
9455 // Create 10 layouts where each has a single descriptor of different type
9456 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] =
9457 {};
9458 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9459 dsl_binding[i].binding = 0;
9460 dsl_binding[i].descriptorType = VkDescriptorType(i);
9461 dsl_binding[i].descriptorCount = 1;
9462 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9463 dsl_binding[i].pImmutableSamplers = NULL;
9464 }
9465
9466 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9467 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9468 ds_layout_ci.pNext = NULL;
9469 ds_layout_ci.bindingCount = 1;
9470 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9471 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9472 ds_layout_ci.pBindings = dsl_binding + i;
9473 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
9474 NULL, ds_layouts + i);
9475 ASSERT_VK_SUCCESS(err);
9476 }
9477 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9478 VkDescriptorSetAllocateInfo alloc_info = {};
9479 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9480 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9481 alloc_info.descriptorPool = ds_pool;
9482 alloc_info.pSetLayouts = ds_layouts;
9483 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9484 descriptor_sets);
9485 ASSERT_VK_SUCCESS(err);
9486
9487 // Create a buffer & bufferView to be used for invalid updates
9488 VkBufferCreateInfo buff_ci = {};
9489 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9490 // This usage is not valid for any descriptor type
9491 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
9492 buff_ci.size = 256;
9493 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9494 VkBuffer buffer;
9495 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9496 ASSERT_VK_SUCCESS(err);
9497
9498 VkBufferViewCreateInfo buff_view_ci = {};
9499 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9500 buff_view_ci.buffer = buffer;
9501 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9502 buff_view_ci.range = VK_WHOLE_SIZE;
9503 VkBufferView buff_view;
9504 err =
9505 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
9506 ASSERT_VK_SUCCESS(err);
9507
9508 // Create an image to be used for invalid updates
9509 VkImageCreateInfo image_ci = {};
9510 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9511 image_ci.imageType = VK_IMAGE_TYPE_2D;
9512 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
9513 image_ci.extent.width = 64;
9514 image_ci.extent.height = 64;
9515 image_ci.extent.depth = 1;
9516 image_ci.mipLevels = 1;
9517 image_ci.arrayLayers = 1;
9518 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
9519 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9520 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9521 // This usage is not valid for any descriptor type
9522 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9523 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9524 VkImage image;
9525 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9526 ASSERT_VK_SUCCESS(err);
9527 // Bind memory to image
9528 VkMemoryRequirements mem_reqs;
9529 VkDeviceMemory image_mem;
9530 bool pass;
9531 VkMemoryAllocateInfo mem_alloc = {};
9532 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9533 mem_alloc.pNext = NULL;
9534 mem_alloc.allocationSize = 0;
9535 mem_alloc.memoryTypeIndex = 0;
9536 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9537 mem_alloc.allocationSize = mem_reqs.size;
9538 pass =
9539 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9540 ASSERT_TRUE(pass);
9541 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9542 ASSERT_VK_SUCCESS(err);
9543 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9544 ASSERT_VK_SUCCESS(err);
9545 // Now create view for image
9546 VkImageViewCreateInfo image_view_ci = {};
9547 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9548 image_view_ci.image = image;
9549 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
9550 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9551 image_view_ci.subresourceRange.layerCount = 1;
9552 image_view_ci.subresourceRange.baseArrayLayer = 0;
9553 image_view_ci.subresourceRange.levelCount = 1;
9554 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9555 VkImageView image_view;
9556 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
9557 &image_view);
9558 ASSERT_VK_SUCCESS(err);
9559
9560 VkDescriptorBufferInfo buff_info = {};
9561 buff_info.buffer = buffer;
9562 VkDescriptorImageInfo img_info = {};
9563 img_info.imageView = image_view;
9564 VkWriteDescriptorSet descriptor_write = {};
9565 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9566 descriptor_write.dstBinding = 0;
9567 descriptor_write.descriptorCount = 1;
9568 descriptor_write.pTexelBufferView = &buff_view;
9569 descriptor_write.pBufferInfo = &buff_info;
9570 descriptor_write.pImageInfo = &img_info;
9571
9572 // These error messages align with VkDescriptorType struct
9573 const char *error_msgs[] = {
9574 "", // placeholder, no error for SAMPLER descriptor
9575 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
9576 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
9577 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
9578 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
9579 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
9580 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
9581 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
9582 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
9583 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
9584 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
9585 // Start loop at 1 as SAMPLER desc type has no usage bit error
9586 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9587 descriptor_write.descriptorType = VkDescriptorType(i);
9588 descriptor_write.dstSet = descriptor_sets[i];
9589 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9590 error_msgs[i]);
9591
9592 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
9593 NULL);
9594
9595 m_errorMonitor->VerifyFound();
9596 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
9597 }
9598 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9599 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009600 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009601 vkDestroyImageView(m_device->device(), image_view, NULL);
9602 vkDestroyBuffer(m_device->device(), buffer, NULL);
9603 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9604 vkFreeDescriptorSets(m_device->device(), ds_pool,
9605 VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
9606 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9607}
9608
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009609TEST_F(VkLayerTest, DSBufferInfoErrors) {
9610 TEST_DESCRIPTION(
9611 "Attempt to update buffer descriptor set that has incorrect "
9612 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
9613 "1. offset value greater than buffer size\n"
9614 "2. range value of 0\n"
9615 "3. range value greater than buffer (size - offset)");
9616 VkResult err;
9617
9618 ASSERT_NO_FATAL_FAILURE(InitState());
9619 VkDescriptorPoolSize ds_type_count = {};
9620 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9621 ds_type_count.descriptorCount = 1;
9622
9623 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9624 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9625 ds_pool_ci.pNext = NULL;
9626 ds_pool_ci.maxSets = 1;
9627 ds_pool_ci.poolSizeCount = 1;
9628 ds_pool_ci.pPoolSizes = &ds_type_count;
9629
9630 VkDescriptorPool ds_pool;
9631 err =
9632 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9633 ASSERT_VK_SUCCESS(err);
9634
9635 // Create layout with single uniform buffer descriptor
9636 VkDescriptorSetLayoutBinding dsl_binding = {};
9637 dsl_binding.binding = 0;
9638 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9639 dsl_binding.descriptorCount = 1;
9640 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9641 dsl_binding.pImmutableSamplers = NULL;
9642
9643 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9644 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9645 ds_layout_ci.pNext = NULL;
9646 ds_layout_ci.bindingCount = 1;
9647 ds_layout_ci.pBindings = &dsl_binding;
9648 VkDescriptorSetLayout ds_layout;
9649 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9650 &ds_layout);
9651 ASSERT_VK_SUCCESS(err);
9652
9653 VkDescriptorSet descriptor_set = {};
9654 VkDescriptorSetAllocateInfo alloc_info = {};
9655 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9656 alloc_info.descriptorSetCount = 1;
9657 alloc_info.descriptorPool = ds_pool;
9658 alloc_info.pSetLayouts = &ds_layout;
9659 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9660 &descriptor_set);
9661 ASSERT_VK_SUCCESS(err);
9662
9663 // Create a buffer to be used for invalid updates
9664 VkBufferCreateInfo buff_ci = {};
9665 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9666 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9667 buff_ci.size = 256;
9668 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9669 VkBuffer buffer;
9670 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9671 ASSERT_VK_SUCCESS(err);
9672 // Have to bind memory to buffer before descriptor update
9673 VkMemoryAllocateInfo mem_alloc = {};
9674 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9675 mem_alloc.pNext = NULL;
9676 mem_alloc.allocationSize = 256;
9677 mem_alloc.memoryTypeIndex = 0;
9678
9679 VkMemoryRequirements mem_reqs;
9680 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9681 bool pass =
9682 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9683 if (!pass) {
9684 vkDestroyBuffer(m_device->device(), buffer, NULL);
9685 return;
9686 }
9687
9688 VkDeviceMemory mem;
9689 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9690 ASSERT_VK_SUCCESS(err);
9691 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9692 ASSERT_VK_SUCCESS(err);
9693
9694 VkDescriptorBufferInfo buff_info = {};
9695 buff_info.buffer = buffer;
9696 // First make offset 1 larger than buffer size
9697 buff_info.offset = 257;
9698 buff_info.range = VK_WHOLE_SIZE;
9699 VkWriteDescriptorSet descriptor_write = {};
9700 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9701 descriptor_write.dstBinding = 0;
9702 descriptor_write.descriptorCount = 1;
9703 descriptor_write.pTexelBufferView = nullptr;
9704 descriptor_write.pBufferInfo = &buff_info;
9705 descriptor_write.pImageInfo = nullptr;
9706
9707 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9708 descriptor_write.dstSet = descriptor_set;
9709 m_errorMonitor->SetDesiredFailureMsg(
9710 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9711 " offset of 257 is greater than buffer ");
9712
9713 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9714
9715 m_errorMonitor->VerifyFound();
9716 // Now cause error due to range of 0
9717 buff_info.offset = 0;
9718 buff_info.range = 0;
9719 m_errorMonitor->SetDesiredFailureMsg(
9720 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9721 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
9722
9723 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9724
9725 m_errorMonitor->VerifyFound();
9726 // Now cause error due to range exceeding buffer size - offset
9727 buff_info.offset = 128;
9728 buff_info.range = 200;
9729 m_errorMonitor->SetDesiredFailureMsg(
9730 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9731 " range is 200 which is greater than buffer size ");
9732
9733 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9734
9735 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009736 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009737 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9738 vkDestroyBuffer(m_device->device(), buffer, NULL);
9739 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9740 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9741}
9742
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009743TEST_F(VkLayerTest, DSAspectBitsErrors) {
9744 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9745 // are set, but could expand this test to hit more cases.
9746 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
9747 "that do not have correct aspect bits sets.");
9748 VkResult err;
9749
9750 ASSERT_NO_FATAL_FAILURE(InitState());
9751 VkDescriptorPoolSize ds_type_count = {};
9752 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9753 ds_type_count.descriptorCount = 1;
9754
9755 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9756 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9757 ds_pool_ci.pNext = NULL;
9758 ds_pool_ci.maxSets = 5;
9759 ds_pool_ci.poolSizeCount = 1;
9760 ds_pool_ci.pPoolSizes = &ds_type_count;
9761
9762 VkDescriptorPool ds_pool;
9763 err =
9764 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9765 ASSERT_VK_SUCCESS(err);
9766
9767 VkDescriptorSetLayoutBinding dsl_binding = {};
9768 dsl_binding.binding = 0;
9769 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9770 dsl_binding.descriptorCount = 1;
9771 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9772 dsl_binding.pImmutableSamplers = NULL;
9773
9774 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9775 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9776 ds_layout_ci.pNext = NULL;
9777 ds_layout_ci.bindingCount = 1;
9778 ds_layout_ci.pBindings = &dsl_binding;
9779 VkDescriptorSetLayout ds_layout;
9780 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9781 &ds_layout);
9782 ASSERT_VK_SUCCESS(err);
9783
9784 VkDescriptorSet descriptor_set = {};
9785 VkDescriptorSetAllocateInfo alloc_info = {};
9786 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9787 alloc_info.descriptorSetCount = 1;
9788 alloc_info.descriptorPool = ds_pool;
9789 alloc_info.pSetLayouts = &ds_layout;
9790 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9791 &descriptor_set);
9792 ASSERT_VK_SUCCESS(err);
9793
9794 // Create an image to be used for invalid updates
9795 VkImageCreateInfo image_ci = {};
9796 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9797 image_ci.imageType = VK_IMAGE_TYPE_2D;
9798 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9799 image_ci.extent.width = 64;
9800 image_ci.extent.height = 64;
9801 image_ci.extent.depth = 1;
9802 image_ci.mipLevels = 1;
9803 image_ci.arrayLayers = 1;
9804 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
9805 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9806 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9807 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9808 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9809 VkImage image;
9810 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9811 ASSERT_VK_SUCCESS(err);
9812 // Bind memory to image
9813 VkMemoryRequirements mem_reqs;
9814 VkDeviceMemory image_mem;
9815 bool pass;
9816 VkMemoryAllocateInfo mem_alloc = {};
9817 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9818 mem_alloc.pNext = NULL;
9819 mem_alloc.allocationSize = 0;
9820 mem_alloc.memoryTypeIndex = 0;
9821 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9822 mem_alloc.allocationSize = mem_reqs.size;
9823 pass =
9824 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9825 ASSERT_TRUE(pass);
9826 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9827 ASSERT_VK_SUCCESS(err);
9828 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9829 ASSERT_VK_SUCCESS(err);
9830 // Now create view for image
9831 VkImageViewCreateInfo image_view_ci = {};
9832 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9833 image_view_ci.image = image;
9834 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9835 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9836 image_view_ci.subresourceRange.layerCount = 1;
9837 image_view_ci.subresourceRange.baseArrayLayer = 0;
9838 image_view_ci.subresourceRange.levelCount = 1;
9839 // Setting both depth & stencil aspect bits is illegal for descriptor
9840 image_view_ci.subresourceRange.aspectMask =
9841 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
9842
9843 VkImageView image_view;
9844 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
9845 &image_view);
9846 ASSERT_VK_SUCCESS(err);
9847
9848 VkDescriptorImageInfo img_info = {};
9849 img_info.imageView = image_view;
9850 VkWriteDescriptorSet descriptor_write = {};
9851 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9852 descriptor_write.dstBinding = 0;
9853 descriptor_write.descriptorCount = 1;
9854 descriptor_write.pTexelBufferView = NULL;
9855 descriptor_write.pBufferInfo = NULL;
9856 descriptor_write.pImageInfo = &img_info;
9857 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9858 descriptor_write.dstSet = descriptor_set;
9859 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
9860 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
9861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9862 error_msg);
9863
9864 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9865
9866 m_errorMonitor->VerifyFound();
9867 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9868 vkDestroyImage(m_device->device(), image, NULL);
9869 vkFreeMemory(m_device->device(), image_mem, NULL);
9870 vkDestroyImageView(m_device->device(), image_view, NULL);
9871 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9872 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9873}
9874
Karl Schultz6addd812016-02-02 17:17:23 -07009875TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009876 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07009877 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009878
Karl Schultz6addd812016-02-02 17:17:23 -07009879 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06009880 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9881 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
9882 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009883
Tobin Ehlis3b780662015-05-28 12:11:26 -06009884 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009885 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009886 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009887 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9888 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009889
9890 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009891 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9892 ds_pool_ci.pNext = NULL;
9893 ds_pool_ci.maxSets = 1;
9894 ds_pool_ci.poolSizeCount = 1;
9895 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009896
Tobin Ehlis3b780662015-05-28 12:11:26 -06009897 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009898 err =
9899 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009900 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009901 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009902 dsl_binding.binding = 0;
9903 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9904 dsl_binding.descriptorCount = 1;
9905 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9906 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009907
Tony Barboureb254902015-07-15 12:50:33 -06009908 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009909 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9910 ds_layout_ci.pNext = NULL;
9911 ds_layout_ci.bindingCount = 1;
9912 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009913
Tobin Ehlis3b780662015-05-28 12:11:26 -06009914 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009915 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9916 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009917 ASSERT_VK_SUCCESS(err);
9918
9919 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009920 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009921 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009922 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009923 alloc_info.descriptorPool = ds_pool;
9924 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009925 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9926 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009927 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009928
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009929 VkSamplerCreateInfo sampler_ci = {};
9930 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9931 sampler_ci.pNext = NULL;
9932 sampler_ci.magFilter = VK_FILTER_NEAREST;
9933 sampler_ci.minFilter = VK_FILTER_NEAREST;
9934 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9935 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9936 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9937 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9938 sampler_ci.mipLodBias = 1.0;
9939 sampler_ci.anisotropyEnable = VK_FALSE;
9940 sampler_ci.maxAnisotropy = 1;
9941 sampler_ci.compareEnable = VK_FALSE;
9942 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9943 sampler_ci.minLod = 1.0;
9944 sampler_ci.maxLod = 1.0;
9945 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9946 sampler_ci.unnormalizedCoordinates = VK_FALSE;
9947 VkSampler sampler;
9948 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
9949 ASSERT_VK_SUCCESS(err);
9950
9951 VkDescriptorImageInfo info = {};
9952 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009953
9954 VkWriteDescriptorSet descriptor_write;
9955 memset(&descriptor_write, 0, sizeof(descriptor_write));
9956 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009957 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009958 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009959 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009960 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009961 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009962
9963 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9964
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009965 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009966
Chia-I Wuf7458c52015-10-26 21:10:41 +08009967 vkDestroySampler(m_device->device(), sampler, NULL);
9968 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9969 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009970}
9971
Karl Schultz6addd812016-02-02 17:17:23 -07009972TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009973 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07009974 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009975
Karl Schultz6addd812016-02-02 17:17:23 -07009976 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06009977 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9978 " binding #0 with 1 total descriptors but update of 1 descriptors "
9979 "starting at binding offset of 0 combined with update array element "
9980 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009981
Tobin Ehlis3b780662015-05-28 12:11:26 -06009982 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009983 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009984 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009985 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9986 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009987
9988 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009989 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9990 ds_pool_ci.pNext = NULL;
9991 ds_pool_ci.maxSets = 1;
9992 ds_pool_ci.poolSizeCount = 1;
9993 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009994
Tobin Ehlis3b780662015-05-28 12:11:26 -06009995 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009996 err =
9997 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009998 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009999
Tony Barboureb254902015-07-15 12:50:33 -060010000 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010001 dsl_binding.binding = 0;
10002 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10003 dsl_binding.descriptorCount = 1;
10004 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10005 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010006
10007 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010008 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10009 ds_layout_ci.pNext = NULL;
10010 ds_layout_ci.bindingCount = 1;
10011 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010012
Tobin Ehlis3b780662015-05-28 12:11:26 -060010013 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010014 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10015 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010016 ASSERT_VK_SUCCESS(err);
10017
10018 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010019 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010020 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010021 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010022 alloc_info.descriptorPool = ds_pool;
10023 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010024 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10025 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010026 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010027
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010028 // Correctly update descriptor to avoid "NOT_UPDATED" error
10029 VkDescriptorBufferInfo buff_info = {};
10030 buff_info.buffer =
10031 VkBuffer(0); // Don't care about buffer handle for this test
10032 buff_info.offset = 0;
10033 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010034
10035 VkWriteDescriptorSet descriptor_write;
10036 memset(&descriptor_write, 0, sizeof(descriptor_write));
10037 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010038 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010039 descriptor_write.dstArrayElement =
10040 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010041 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010042 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10043 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010044
10045 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10046
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010047 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010048
Chia-I Wuf7458c52015-10-26 21:10:41 +080010049 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10050 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010051}
10052
Karl Schultz6addd812016-02-02 17:17:23 -070010053TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
10054 // Create layout w/ count of 1 and attempt update to that layout w/ binding
10055 // index 2
10056 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010057
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010058 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10059 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010060
Tobin Ehlis3b780662015-05-28 12:11:26 -060010061 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010062 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010063 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010064 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10065 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010066
10067 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010068 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10069 ds_pool_ci.pNext = NULL;
10070 ds_pool_ci.maxSets = 1;
10071 ds_pool_ci.poolSizeCount = 1;
10072 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010073
Tobin Ehlis3b780662015-05-28 12:11:26 -060010074 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010075 err =
10076 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010077 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010078
Tony Barboureb254902015-07-15 12:50:33 -060010079 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010080 dsl_binding.binding = 0;
10081 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10082 dsl_binding.descriptorCount = 1;
10083 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10084 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010085
10086 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010087 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10088 ds_layout_ci.pNext = NULL;
10089 ds_layout_ci.bindingCount = 1;
10090 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010091 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010092 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10093 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010094 ASSERT_VK_SUCCESS(err);
10095
10096 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010097 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010098 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010099 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010100 alloc_info.descriptorPool = ds_pool;
10101 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010102 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10103 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010104 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010105
Tony Barboureb254902015-07-15 12:50:33 -060010106 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010107 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10108 sampler_ci.pNext = NULL;
10109 sampler_ci.magFilter = VK_FILTER_NEAREST;
10110 sampler_ci.minFilter = VK_FILTER_NEAREST;
10111 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10112 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10113 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10114 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10115 sampler_ci.mipLodBias = 1.0;
10116 sampler_ci.anisotropyEnable = VK_FALSE;
10117 sampler_ci.maxAnisotropy = 1;
10118 sampler_ci.compareEnable = VK_FALSE;
10119 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10120 sampler_ci.minLod = 1.0;
10121 sampler_ci.maxLod = 1.0;
10122 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10123 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010124
Tobin Ehlis3b780662015-05-28 12:11:26 -060010125 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010126 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010127 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010128
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010129 VkDescriptorImageInfo info = {};
10130 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010131
10132 VkWriteDescriptorSet descriptor_write;
10133 memset(&descriptor_write, 0, sizeof(descriptor_write));
10134 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010135 descriptor_write.dstSet = descriptorSet;
10136 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010137 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010138 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010139 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010140 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010141
10142 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10143
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010144 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010145
Chia-I Wuf7458c52015-10-26 21:10:41 +080010146 vkDestroySampler(m_device->device(), sampler, NULL);
10147 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10148 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010149}
10150
Karl Schultz6addd812016-02-02 17:17:23 -070010151TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10152 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10153 // types
10154 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010155
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010156 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis660bcdc2016-05-17 10:39:46 -060010157 ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010158
Tobin Ehlis3b780662015-05-28 12:11:26 -060010159 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010160
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010161 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010162 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10163 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010164
10165 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010166 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10167 ds_pool_ci.pNext = NULL;
10168 ds_pool_ci.maxSets = 1;
10169 ds_pool_ci.poolSizeCount = 1;
10170 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010171
Tobin Ehlis3b780662015-05-28 12:11:26 -060010172 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010173 err =
10174 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010175 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010176 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010177 dsl_binding.binding = 0;
10178 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10179 dsl_binding.descriptorCount = 1;
10180 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10181 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010182
Tony Barboureb254902015-07-15 12:50:33 -060010183 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010184 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10185 ds_layout_ci.pNext = NULL;
10186 ds_layout_ci.bindingCount = 1;
10187 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010188
Tobin Ehlis3b780662015-05-28 12:11:26 -060010189 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010190 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10191 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010192 ASSERT_VK_SUCCESS(err);
10193
10194 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010195 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010196 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010197 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010198 alloc_info.descriptorPool = ds_pool;
10199 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010200 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10201 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010202 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010203
Tony Barboureb254902015-07-15 12:50:33 -060010204 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010205 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10206 sampler_ci.pNext = NULL;
10207 sampler_ci.magFilter = VK_FILTER_NEAREST;
10208 sampler_ci.minFilter = VK_FILTER_NEAREST;
10209 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10210 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10211 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10212 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10213 sampler_ci.mipLodBias = 1.0;
10214 sampler_ci.anisotropyEnable = VK_FALSE;
10215 sampler_ci.maxAnisotropy = 1;
10216 sampler_ci.compareEnable = VK_FALSE;
10217 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10218 sampler_ci.minLod = 1.0;
10219 sampler_ci.maxLod = 1.0;
10220 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10221 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010222 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010223 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010224 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010225
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010226 VkDescriptorImageInfo info = {};
10227 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010228
10229 VkWriteDescriptorSet descriptor_write;
10230 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -070010231 descriptor_write.sType =
10232 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010233 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010234 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010235 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010236 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010237 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010238
10239 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10240
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010241 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010242
Chia-I Wuf7458c52015-10-26 21:10:41 +080010243 vkDestroySampler(m_device->device(), sampler, NULL);
10244 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10245 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010246}
10247
Karl Schultz6addd812016-02-02 17:17:23 -070010248TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010249 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010250 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010251
Karl Schultz6addd812016-02-02 17:17:23 -070010252 m_errorMonitor->SetDesiredFailureMsg(
10253 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010254 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010255
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010256 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010257 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10258 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010259 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010260 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10261 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010262
10263 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010264 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10265 ds_pool_ci.pNext = NULL;
10266 ds_pool_ci.maxSets = 1;
10267 ds_pool_ci.poolSizeCount = 1;
10268 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010269
10270 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010271 err =
10272 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010273 ASSERT_VK_SUCCESS(err);
10274
10275 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010276 dsl_binding.binding = 0;
10277 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10278 dsl_binding.descriptorCount = 1;
10279 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10280 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010281
10282 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010283 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10284 ds_layout_ci.pNext = NULL;
10285 ds_layout_ci.bindingCount = 1;
10286 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010287 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010288 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10289 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010290 ASSERT_VK_SUCCESS(err);
10291
10292 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010293 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010294 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010295 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010296 alloc_info.descriptorPool = ds_pool;
10297 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010298 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10299 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010300 ASSERT_VK_SUCCESS(err);
10301
Karl Schultz6addd812016-02-02 17:17:23 -070010302 VkSampler sampler =
10303 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010304
10305 VkDescriptorImageInfo descriptor_info;
10306 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10307 descriptor_info.sampler = sampler;
10308
10309 VkWriteDescriptorSet descriptor_write;
10310 memset(&descriptor_write, 0, sizeof(descriptor_write));
10311 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010312 descriptor_write.dstSet = descriptorSet;
10313 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010314 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010315 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10316 descriptor_write.pImageInfo = &descriptor_info;
10317
10318 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10319
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010320 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010321
Chia-I Wuf7458c52015-10-26 21:10:41 +080010322 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10323 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010324}
10325
Karl Schultz6addd812016-02-02 17:17:23 -070010326TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10327 // Create a single combined Image/Sampler descriptor and send it an invalid
10328 // imageView
10329 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010330
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10332 "Attempted write update to combined "
10333 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -060010334 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010335
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010336 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010337 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010338 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10339 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010340
10341 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010342 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10343 ds_pool_ci.pNext = NULL;
10344 ds_pool_ci.maxSets = 1;
10345 ds_pool_ci.poolSizeCount = 1;
10346 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010347
10348 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010349 err =
10350 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010351 ASSERT_VK_SUCCESS(err);
10352
10353 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010354 dsl_binding.binding = 0;
10355 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10356 dsl_binding.descriptorCount = 1;
10357 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10358 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010359
10360 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010361 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10362 ds_layout_ci.pNext = NULL;
10363 ds_layout_ci.bindingCount = 1;
10364 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010365 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010366 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10367 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010368 ASSERT_VK_SUCCESS(err);
10369
10370 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010371 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010372 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010373 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010374 alloc_info.descriptorPool = ds_pool;
10375 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010376 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10377 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010378 ASSERT_VK_SUCCESS(err);
10379
10380 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010381 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10382 sampler_ci.pNext = NULL;
10383 sampler_ci.magFilter = VK_FILTER_NEAREST;
10384 sampler_ci.minFilter = VK_FILTER_NEAREST;
10385 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10386 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10387 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10388 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10389 sampler_ci.mipLodBias = 1.0;
10390 sampler_ci.anisotropyEnable = VK_FALSE;
10391 sampler_ci.maxAnisotropy = 1;
10392 sampler_ci.compareEnable = VK_FALSE;
10393 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10394 sampler_ci.minLod = 1.0;
10395 sampler_ci.maxLod = 1.0;
10396 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10397 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010398
10399 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010400 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010401 ASSERT_VK_SUCCESS(err);
10402
Karl Schultz6addd812016-02-02 17:17:23 -070010403 VkImageView view =
10404 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010405
10406 VkDescriptorImageInfo descriptor_info;
10407 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10408 descriptor_info.sampler = sampler;
10409 descriptor_info.imageView = view;
10410
10411 VkWriteDescriptorSet descriptor_write;
10412 memset(&descriptor_write, 0, sizeof(descriptor_write));
10413 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010414 descriptor_write.dstSet = descriptorSet;
10415 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010416 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010417 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10418 descriptor_write.pImageInfo = &descriptor_info;
10419
10420 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10421
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010422 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010423
Chia-I Wuf7458c52015-10-26 21:10:41 +080010424 vkDestroySampler(m_device->device(), sampler, NULL);
10425 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10426 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010427}
10428
Karl Schultz6addd812016-02-02 17:17:23 -070010429TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10430 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10431 // into the other
10432 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010433
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10435 " binding #1 with type "
10436 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10437 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010438
Tobin Ehlis04356f92015-10-27 16:35:27 -060010439 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010440 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010441 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010442 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10443 ds_type_count[0].descriptorCount = 1;
10444 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10445 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010446
10447 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010448 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10449 ds_pool_ci.pNext = NULL;
10450 ds_pool_ci.maxSets = 1;
10451 ds_pool_ci.poolSizeCount = 2;
10452 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010453
10454 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010455 err =
10456 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010457 ASSERT_VK_SUCCESS(err);
10458 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010459 dsl_binding[0].binding = 0;
10460 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10461 dsl_binding[0].descriptorCount = 1;
10462 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10463 dsl_binding[0].pImmutableSamplers = NULL;
10464 dsl_binding[1].binding = 1;
10465 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10466 dsl_binding[1].descriptorCount = 1;
10467 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10468 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010469
10470 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010471 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10472 ds_layout_ci.pNext = NULL;
10473 ds_layout_ci.bindingCount = 2;
10474 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010475
10476 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010477 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10478 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010479 ASSERT_VK_SUCCESS(err);
10480
10481 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010482 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010483 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010484 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010485 alloc_info.descriptorPool = ds_pool;
10486 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010487 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10488 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010489 ASSERT_VK_SUCCESS(err);
10490
10491 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010492 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10493 sampler_ci.pNext = NULL;
10494 sampler_ci.magFilter = VK_FILTER_NEAREST;
10495 sampler_ci.minFilter = VK_FILTER_NEAREST;
10496 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10497 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10498 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10499 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10500 sampler_ci.mipLodBias = 1.0;
10501 sampler_ci.anisotropyEnable = VK_FALSE;
10502 sampler_ci.maxAnisotropy = 1;
10503 sampler_ci.compareEnable = VK_FALSE;
10504 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10505 sampler_ci.minLod = 1.0;
10506 sampler_ci.maxLod = 1.0;
10507 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10508 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010509
10510 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010511 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010512 ASSERT_VK_SUCCESS(err);
10513
10514 VkDescriptorImageInfo info = {};
10515 info.sampler = sampler;
10516
10517 VkWriteDescriptorSet descriptor_write;
10518 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10519 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010520 descriptor_write.dstSet = descriptorSet;
10521 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010522 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010523 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10524 descriptor_write.pImageInfo = &info;
10525 // This write update should succeed
10526 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10527 // Now perform a copy update that fails due to type mismatch
10528 VkCopyDescriptorSet copy_ds_update;
10529 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10530 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10531 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -060010532 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010533 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010534 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +080010535 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010536 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10537
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010538 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010539 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070010540 m_errorMonitor->SetDesiredFailureMsg(
10541 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010542 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060010543 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10544 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10545 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010546 copy_ds_update.srcBinding =
10547 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010548 copy_ds_update.dstSet = descriptorSet;
10549 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -060010550 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010551 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10552
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010553 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010554
Tobin Ehlis04356f92015-10-27 16:35:27 -060010555 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070010556 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010557 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
10558 "update array offset of 0 and update of "
10559 "5 descriptors oversteps total number "
10560 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010561
Tobin Ehlis04356f92015-10-27 16:35:27 -060010562 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10563 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10564 copy_ds_update.srcSet = descriptorSet;
10565 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010566 copy_ds_update.dstSet = descriptorSet;
10567 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010568 copy_ds_update.descriptorCount =
10569 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010570 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10571
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010572 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010573
Chia-I Wuf7458c52015-10-26 21:10:41 +080010574 vkDestroySampler(m_device->device(), sampler, NULL);
10575 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10576 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010577}
10578
Karl Schultz6addd812016-02-02 17:17:23 -070010579TEST_F(VkLayerTest, NumSamplesMismatch) {
10580 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10581 // sampleCount
10582 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010583
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070010585 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010586
Tobin Ehlis3b780662015-05-28 12:11:26 -060010587 ASSERT_NO_FATAL_FAILURE(InitState());
10588 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010589 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010590 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010591 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010592
10593 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010594 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10595 ds_pool_ci.pNext = NULL;
10596 ds_pool_ci.maxSets = 1;
10597 ds_pool_ci.poolSizeCount = 1;
10598 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010599
Tobin Ehlis3b780662015-05-28 12:11:26 -060010600 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010601 err =
10602 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010603 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010604
Tony Barboureb254902015-07-15 12:50:33 -060010605 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010606 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010607 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010608 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010609 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10610 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010611
Tony Barboureb254902015-07-15 12:50:33 -060010612 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10613 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10614 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010615 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010616 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010617
Tobin Ehlis3b780662015-05-28 12:11:26 -060010618 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010619 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10620 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010621 ASSERT_VK_SUCCESS(err);
10622
10623 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010624 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010625 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010626 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010627 alloc_info.descriptorPool = ds_pool;
10628 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010629 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10630 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010631 ASSERT_VK_SUCCESS(err);
10632
Tony Barboureb254902015-07-15 12:50:33 -060010633 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010634 pipe_ms_state_ci.sType =
10635 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
10636 pipe_ms_state_ci.pNext = NULL;
10637 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10638 pipe_ms_state_ci.sampleShadingEnable = 0;
10639 pipe_ms_state_ci.minSampleShading = 1.0;
10640 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010641
Tony Barboureb254902015-07-15 12:50:33 -060010642 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010643 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10644 pipeline_layout_ci.pNext = NULL;
10645 pipeline_layout_ci.setLayoutCount = 1;
10646 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010647
10648 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010649 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
10650 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010651 ASSERT_VK_SUCCESS(err);
10652
Karl Schultz6addd812016-02-02 17:17:23 -070010653 VkShaderObj vs(m_device, bindStateVertShaderText,
10654 VK_SHADER_STAGE_VERTEX_BIT, this);
10655 VkShaderObj fs(m_device, bindStateFragShaderText,
10656 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060010657 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070010658 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010659 VkPipelineObj pipe(m_device);
10660 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010661 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010662 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010663 pipe.SetMSAA(&pipe_ms_state_ci);
10664 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010665
Tony Barbourfe3351b2015-07-28 10:17:20 -060010666 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070010667 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10668 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010669
Mark Young29927482016-05-04 14:38:51 -060010670 // Render triangle (the error should trigger on the attempt to draw).
10671 Draw(3, 1, 0, 0);
10672
10673 // Finalize recording of the command buffer
10674 EndCommandBuffer();
10675
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010676 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010677
Chia-I Wuf7458c52015-10-26 21:10:41 +080010678 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10679 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10680 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010681}
Mark Young29927482016-05-04 14:38:51 -060010682
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010683TEST_F(VkLayerTest, RenderPassIncompatible) {
10684 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
10685 "Initial case is drawing with an active renderpass that's "
10686 "not compatible with the bound PSO's creation renderpass");
10687 VkResult err;
10688
10689 ASSERT_NO_FATAL_FAILURE(InitState());
10690 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10691
10692 VkDescriptorSetLayoutBinding dsl_binding = {};
10693 dsl_binding.binding = 0;
10694 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10695 dsl_binding.descriptorCount = 1;
10696 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10697 dsl_binding.pImmutableSamplers = NULL;
10698
10699 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10700 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10701 ds_layout_ci.pNext = NULL;
10702 ds_layout_ci.bindingCount = 1;
10703 ds_layout_ci.pBindings = &dsl_binding;
10704
10705 VkDescriptorSetLayout ds_layout;
10706 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10707 &ds_layout);
10708 ASSERT_VK_SUCCESS(err);
10709
10710 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10711 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10712 pipeline_layout_ci.pNext = NULL;
10713 pipeline_layout_ci.setLayoutCount = 1;
10714 pipeline_layout_ci.pSetLayouts = &ds_layout;
10715
10716 VkPipelineLayout pipeline_layout;
10717 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
10718 &pipeline_layout);
10719 ASSERT_VK_SUCCESS(err);
10720
10721 VkShaderObj vs(m_device, bindStateVertShaderText,
10722 VK_SHADER_STAGE_VERTEX_BIT, this);
10723 VkShaderObj fs(m_device, bindStateFragShaderText,
10724 VK_SHADER_STAGE_FRAGMENT_BIT,
10725 this); // We shouldn't need a fragment shader
10726 // but add it to be able to run on more devices
10727 // Create a renderpass that will be incompatible with default renderpass
10728 VkAttachmentReference attach = {};
10729 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
10730 VkAttachmentReference color_att = {};
10731 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10732 VkSubpassDescription subpass = {};
10733 subpass.inputAttachmentCount = 1;
10734 subpass.pInputAttachments = &attach;
10735 subpass.colorAttachmentCount = 1;
10736 subpass.pColorAttachments = &color_att;
10737 VkRenderPassCreateInfo rpci = {};
10738 rpci.subpassCount = 1;
10739 rpci.pSubpasses = &subpass;
10740 rpci.attachmentCount = 1;
10741 VkAttachmentDescription attach_desc = {};
10742 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060010743 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
10744 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010745 rpci.pAttachments = &attach_desc;
10746 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
10747 VkRenderPass rp;
10748 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10749 VkPipelineObj pipe(m_device);
10750 pipe.AddShader(&vs);
10751 pipe.AddShader(&fs);
10752 pipe.AddColorAttachment();
10753 VkViewport view_port = {};
10754 m_viewports.push_back(view_port);
10755 pipe.SetViewport(m_viewports);
10756 VkRect2D rect = {};
10757 m_scissors.push_back(rect);
10758 pipe.SetScissor(m_scissors);
10759 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10760
10761 VkCommandBufferInheritanceInfo cbii = {};
10762 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
10763 cbii.renderPass = rp;
10764 cbii.subpass = 0;
10765 VkCommandBufferBeginInfo cbbi = {};
10766 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
10767 cbbi.pInheritanceInfo = &cbii;
10768 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
10769 VkRenderPassBeginInfo rpbi = {};
10770 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
10771 rpbi.framebuffer = m_framebuffer;
10772 rpbi.renderPass = rp;
10773 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi,
10774 VK_SUBPASS_CONTENTS_INLINE);
10775 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10776 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
10777
10778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10779 " is incompatible w/ gfx pipeline ");
10780 // Render triangle (the error should trigger on the attempt to draw).
10781 Draw(3, 1, 0, 0);
10782
10783 // Finalize recording of the command buffer
10784 EndCommandBuffer();
10785
10786 m_errorMonitor->VerifyFound();
10787
10788 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10789 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10790 vkDestroyRenderPass(m_device->device(), rp, NULL);
10791}
10792
Mark Youngc89c6312016-03-31 16:03:20 -060010793TEST_F(VkLayerTest, NumBlendAttachMismatch) {
10794 // Create Pipeline where the number of blend attachments doesn't match the
10795 // number of color attachments. In this case, we don't add any color
10796 // blend attachments even though we have a color attachment.
10797 VkResult err;
10798
10799 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -060010800 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060010801
10802 ASSERT_NO_FATAL_FAILURE(InitState());
10803 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10804 VkDescriptorPoolSize ds_type_count = {};
10805 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10806 ds_type_count.descriptorCount = 1;
10807
10808 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10809 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10810 ds_pool_ci.pNext = NULL;
10811 ds_pool_ci.maxSets = 1;
10812 ds_pool_ci.poolSizeCount = 1;
10813 ds_pool_ci.pPoolSizes = &ds_type_count;
10814
10815 VkDescriptorPool ds_pool;
10816 err =
10817 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10818 ASSERT_VK_SUCCESS(err);
10819
10820 VkDescriptorSetLayoutBinding dsl_binding = {};
10821 dsl_binding.binding = 0;
10822 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10823 dsl_binding.descriptorCount = 1;
10824 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10825 dsl_binding.pImmutableSamplers = NULL;
10826
10827 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10828 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10829 ds_layout_ci.pNext = NULL;
10830 ds_layout_ci.bindingCount = 1;
10831 ds_layout_ci.pBindings = &dsl_binding;
10832
10833 VkDescriptorSetLayout ds_layout;
10834 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10835 &ds_layout);
10836 ASSERT_VK_SUCCESS(err);
10837
10838 VkDescriptorSet descriptorSet;
10839 VkDescriptorSetAllocateInfo alloc_info = {};
10840 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10841 alloc_info.descriptorSetCount = 1;
10842 alloc_info.descriptorPool = ds_pool;
10843 alloc_info.pSetLayouts = &ds_layout;
10844 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10845 &descriptorSet);
10846 ASSERT_VK_SUCCESS(err);
10847
10848 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
10849 pipe_ms_state_ci.sType =
10850 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
10851 pipe_ms_state_ci.pNext = NULL;
10852 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10853 pipe_ms_state_ci.sampleShadingEnable = 0;
10854 pipe_ms_state_ci.minSampleShading = 1.0;
10855 pipe_ms_state_ci.pSampleMask = NULL;
10856
10857 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10858 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10859 pipeline_layout_ci.pNext = NULL;
10860 pipeline_layout_ci.setLayoutCount = 1;
10861 pipeline_layout_ci.pSetLayouts = &ds_layout;
10862
10863 VkPipelineLayout pipeline_layout;
10864 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
10865 &pipeline_layout);
10866 ASSERT_VK_SUCCESS(err);
10867
10868 VkShaderObj vs(m_device, bindStateVertShaderText,
10869 VK_SHADER_STAGE_VERTEX_BIT, this);
10870 VkShaderObj fs(m_device, bindStateFragShaderText,
10871 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060010872 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -060010873 // but add it to be able to run on more devices
10874 VkPipelineObj pipe(m_device);
10875 pipe.AddShader(&vs);
10876 pipe.AddShader(&fs);
10877 pipe.SetMSAA(&pipe_ms_state_ci);
10878 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10879
10880 BeginCommandBuffer();
10881 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10882 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
10883
Mark Young29927482016-05-04 14:38:51 -060010884 // Render triangle (the error should trigger on the attempt to draw).
10885 Draw(3, 1, 0, 0);
10886
10887 // Finalize recording of the command buffer
10888 EndCommandBuffer();
10889
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010890 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060010891
10892 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10893 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10894 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10895}
Mark Young29927482016-05-04 14:38:51 -060010896
Mark Muellerd4914412016-06-13 17:52:06 -060010897TEST_F(VkLayerTest, MissingClearAttachment) {
10898 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
10899 "structure passed to vkCmdClearAttachments");
10900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10901 "vkCmdClearAttachments() attachment index 1 not found in attachment "
10902 "reference array of active subpass 0");
10903
10904 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
10905 m_errorMonitor->VerifyFound();
10906}
10907
Karl Schultz6addd812016-02-02 17:17:23 -070010908TEST_F(VkLayerTest, ClearCmdNoDraw) {
10909 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
10910 // to issuing a Draw
10911 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010912
Karl Schultz6addd812016-02-02 17:17:23 -070010913 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -070010914 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010915 "vkCmdClearAttachments() issued on CB object ");
10916
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010917 ASSERT_NO_FATAL_FAILURE(InitState());
10918 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010919
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010920 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010921 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10922 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010923
10924 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010925 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10926 ds_pool_ci.pNext = NULL;
10927 ds_pool_ci.maxSets = 1;
10928 ds_pool_ci.poolSizeCount = 1;
10929 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010930
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010931 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010932 err =
10933 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010934 ASSERT_VK_SUCCESS(err);
10935
Tony Barboureb254902015-07-15 12:50:33 -060010936 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010937 dsl_binding.binding = 0;
10938 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10939 dsl_binding.descriptorCount = 1;
10940 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10941 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010942
Tony Barboureb254902015-07-15 12:50:33 -060010943 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010944 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10945 ds_layout_ci.pNext = NULL;
10946 ds_layout_ci.bindingCount = 1;
10947 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010948
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010949 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010950 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10951 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010952 ASSERT_VK_SUCCESS(err);
10953
10954 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010955 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010956 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010957 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010958 alloc_info.descriptorPool = ds_pool;
10959 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010960 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10961 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010962 ASSERT_VK_SUCCESS(err);
10963
Tony Barboureb254902015-07-15 12:50:33 -060010964 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010965 pipe_ms_state_ci.sType =
10966 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
10967 pipe_ms_state_ci.pNext = NULL;
10968 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10969 pipe_ms_state_ci.sampleShadingEnable = 0;
10970 pipe_ms_state_ci.minSampleShading = 1.0;
10971 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010972
Tony Barboureb254902015-07-15 12:50:33 -060010973 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010974 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10975 pipeline_layout_ci.pNext = NULL;
10976 pipeline_layout_ci.setLayoutCount = 1;
10977 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010978
10979 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010980 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
10981 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010982 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010983
Karl Schultz6addd812016-02-02 17:17:23 -070010984 VkShaderObj vs(m_device, bindStateVertShaderText,
10985 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060010986 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070010987 // on more devices
10988 VkShaderObj fs(m_device, bindStateFragShaderText,
10989 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010990
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010991 VkPipelineObj pipe(m_device);
10992 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010993 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010994 pipe.SetMSAA(&pipe_ms_state_ci);
10995 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060010996
10997 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010998
Karl Schultz6addd812016-02-02 17:17:23 -070010999 // Main thing we care about for this test is that the VkImage obj we're
11000 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011001 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011002 VkClearAttachment color_attachment;
11003 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11004 color_attachment.clearValue.color.float32[0] = 1.0;
11005 color_attachment.clearValue.color.float32[1] = 1.0;
11006 color_attachment.clearValue.color.float32[2] = 1.0;
11007 color_attachment.clearValue.color.float32[3] = 1.0;
11008 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011009 VkClearRect clear_rect = {
11010 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011011
Karl Schultz6addd812016-02-02 17:17:23 -070011012 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
11013 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011014
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011015 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011016
Chia-I Wuf7458c52015-10-26 21:10:41 +080011017 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11018 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11019 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011020}
11021
Karl Schultz6addd812016-02-02 17:17:23 -070011022TEST_F(VkLayerTest, VtxBufferBadIndex) {
11023 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011024
Karl Schultz6addd812016-02-02 17:17:23 -070011025 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070011026 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -070011027 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011028
Tobin Ehlis502480b2015-06-24 15:53:07 -060011029 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011030 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011031 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011032
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011033 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011034 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11035 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011036
11037 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011038 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11039 ds_pool_ci.pNext = NULL;
11040 ds_pool_ci.maxSets = 1;
11041 ds_pool_ci.poolSizeCount = 1;
11042 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011043
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011044 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011045 err =
11046 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011047 ASSERT_VK_SUCCESS(err);
11048
Tony Barboureb254902015-07-15 12:50:33 -060011049 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011050 dsl_binding.binding = 0;
11051 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11052 dsl_binding.descriptorCount = 1;
11053 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11054 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011055
Tony Barboureb254902015-07-15 12:50:33 -060011056 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011057 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11058 ds_layout_ci.pNext = NULL;
11059 ds_layout_ci.bindingCount = 1;
11060 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011061
Tobin Ehlis502480b2015-06-24 15:53:07 -060011062 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011063 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11064 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011065 ASSERT_VK_SUCCESS(err);
11066
11067 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011068 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011069 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011070 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011071 alloc_info.descriptorPool = ds_pool;
11072 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011073 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11074 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011075 ASSERT_VK_SUCCESS(err);
11076
Tony Barboureb254902015-07-15 12:50:33 -060011077 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011078 pipe_ms_state_ci.sType =
11079 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11080 pipe_ms_state_ci.pNext = NULL;
11081 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11082 pipe_ms_state_ci.sampleShadingEnable = 0;
11083 pipe_ms_state_ci.minSampleShading = 1.0;
11084 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011085
Tony Barboureb254902015-07-15 12:50:33 -060011086 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011087 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11088 pipeline_layout_ci.pNext = NULL;
11089 pipeline_layout_ci.setLayoutCount = 1;
11090 pipeline_layout_ci.pSetLayouts = &ds_layout;
11091 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011092
Karl Schultz6addd812016-02-02 17:17:23 -070011093 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11094 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011095 ASSERT_VK_SUCCESS(err);
11096
Karl Schultz6addd812016-02-02 17:17:23 -070011097 VkShaderObj vs(m_device, bindStateVertShaderText,
11098 VK_SHADER_STAGE_VERTEX_BIT, this);
11099 VkShaderObj fs(m_device, bindStateFragShaderText,
11100 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011101 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011102 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011103 VkPipelineObj pipe(m_device);
11104 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011105 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011106 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011107 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011108 pipe.SetViewport(m_viewports);
11109 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011110 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011111
11112 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011113 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11114 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011115 // Don't care about actual data, just need to get to draw to flag error
11116 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -070011117 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
11118 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011119 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011120 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011121
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011122 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011123
Chia-I Wuf7458c52015-10-26 21:10:41 +080011124 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11125 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11126 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011127}
Mark Muellerdfe37552016-07-07 14:47:42 -060011128
11129TEST_F(VkLayerTest, VertexBufferInvalid) {
11130 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
11131 "delete a buffer twice, use an invalid offset for each "
11132 "buffer type, and attempt to bind a null buffer");
11133
11134 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
11135 "using deleted buffer ";
11136 const char *double_destroy_message = "Cannot free buffer 0x";
11137 const char *invalid_offset_message = "vkBindBufferMemory(): "
11138 "memoryOffset is 0x";
11139 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
11140 "storage memoryOffset "
11141 "is 0x";
11142 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
11143 "texel memoryOffset "
11144 "is 0x";
11145 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
11146 "uniform memoryOffset "
11147 "is 0x";
11148 const char *bind_null_buffer_message = "In vkBindBufferMemory, attempting"
11149 " to Bind Obj(0x";
11150 const char *free_invalid_buffer_message = "Request to delete memory "
11151 "object 0x";
11152
11153 ASSERT_NO_FATAL_FAILURE(InitState());
11154 ASSERT_NO_FATAL_FAILURE(InitViewport());
11155 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11156
11157 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11158 pipe_ms_state_ci.sType =
11159 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11160 pipe_ms_state_ci.pNext = NULL;
11161 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11162 pipe_ms_state_ci.sampleShadingEnable = 0;
11163 pipe_ms_state_ci.minSampleShading = 1.0;
11164 pipe_ms_state_ci.pSampleMask = nullptr;
11165
11166 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11167 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11168 VkPipelineLayout pipeline_layout;
11169
11170 VkResult err = vkCreatePipelineLayout(m_device->device(),
11171 &pipeline_layout_ci, nullptr,
11172 &pipeline_layout);
11173 ASSERT_VK_SUCCESS(err);
11174
11175 VkShaderObj vs(m_device, bindStateVertShaderText,
11176 VK_SHADER_STAGE_VERTEX_BIT, this);
11177 VkShaderObj fs(m_device, bindStateFragShaderText,
11178 VK_SHADER_STAGE_FRAGMENT_BIT,
11179 this);
11180 VkPipelineObj pipe(m_device);
11181 pipe.AddShader(&vs);
11182 pipe.AddShader(&fs);
11183 pipe.AddColorAttachment();
11184 pipe.SetMSAA(&pipe_ms_state_ci);
11185 pipe.SetViewport(m_viewports);
11186 pipe.SetScissor(m_scissors);
11187 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11188
11189 BeginCommandBuffer();
11190 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11191 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11192
11193 {
11194 // Create and bind a vertex buffer in a reduced scope, which will cause
11195 // it to be deleted upon leaving this scope
11196 const float vbo_data[3] = {1.f, 0.f, 1.f};
11197 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data),
11198 3, vbo_data);
11199 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11200 draw_verticies.AddVertexInputToPipe(pipe);
11201 }
11202
11203 Draw(1, 0, 0, 0);
11204
11205 EndCommandBuffer();
11206
11207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11208 deleted_buffer_in_command_buffer);
11209 QueueCommandBuffer(false);
11210 m_errorMonitor->VerifyFound();
11211
11212 {
11213 // Create and bind a vertex buffer in a reduced scope, and delete it
11214 // twice, the second through the destructor
11215 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11216 VkBufferTest::eDoubleDelete);
11217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11218 double_destroy_message);
11219 buffer_test.TestDoubleDestroy();
11220 }
11221 m_errorMonitor->VerifyFound();
11222
11223 if (VkBufferTest::
11224 GetTestConditionValid(m_device,
11225 VkBufferTest::eInvalidMemoryOffset)) {
11226 // Create and bind a memory buffer with an invalid offset.
11227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11228 invalid_offset_message);
11229 VkBufferTest buffer_test(m_device,
11230 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
11231 VkBufferTest::eInvalidMemoryOffset);
11232 (void) buffer_test;
11233 m_errorMonitor->VerifyFound();
11234 }
11235
11236 if (VkBufferTest::
11237 GetTestConditionValid(m_device,
11238 VkBufferTest::eInvalidDeviceOffset,
11239 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
11240 // Create and bind a memory buffer with an invalid offset again,
11241 // but look for a texel buffer message.
11242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11243 invalid_texel_buffer_offset_message);
11244 VkBufferTest buffer_test(m_device,
11245 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
11246 VkBufferTest::eInvalidDeviceOffset);
11247 (void) buffer_test;
11248 m_errorMonitor->VerifyFound();
11249 }
11250
11251 if (VkBufferTest::
11252 GetTestConditionValid(m_device,
11253 VkBufferTest::eInvalidDeviceOffset,
11254 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
11255 // Create and bind a memory buffer with an invalid offset again, but
11256 // look for a uniform buffer message.
11257 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11258 invalid_uniform_buffer_offset_message);
11259 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
11260 VkBufferTest::eInvalidDeviceOffset);
11261 (void) buffer_test;
11262 m_errorMonitor->VerifyFound();
11263 }
11264
11265 if (VkBufferTest::
11266 GetTestConditionValid(m_device,
11267 VkBufferTest::eInvalidDeviceOffset,
11268 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
11269 // Create and bind a memory buffer with an invalid offset again, but
11270 // look for a storage buffer message.
11271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11272 invalid_storage_buffer_offset_message);
11273 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11274 VkBufferTest::eInvalidDeviceOffset);
11275 (void) buffer_test;
11276 m_errorMonitor->VerifyFound();
11277 }
11278
11279 {
11280 // Attempt to bind a null buffer.
11281 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11282 bind_null_buffer_message);
11283 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11284 VkBufferTest::eBindNullBuffer);
11285 (void) buffer_test;
11286 m_errorMonitor->VerifyFound();
11287 }
11288
11289 {
11290 // Attempt to use an invalid handle to delete a buffer.
11291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11292 free_invalid_buffer_message);
11293 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11294 VkBufferTest::eFreeInvalidHandle);
11295 (void) buffer_test;
11296 }
11297 m_errorMonitor->VerifyFound();
11298
11299 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11300}
11301
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011302// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11303TEST_F(VkLayerTest, InvalidImageLayout) {
11304 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
11305 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11306 "images in the wrong layout when they're copied or transitioned.");
11307 // 3 in ValidateCmdBufImageLayouts
11308 // * -1 Attempt to submit cmd buf w/ deleted image
11309 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11310 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
11311 m_errorMonitor->SetDesiredFailureMsg(
11312 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11313 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11314
11315 ASSERT_NO_FATAL_FAILURE(InitState());
11316 // Create src & dst images to use for copy operations
11317 VkImage src_image;
11318 VkImage dst_image;
11319
11320 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11321 const int32_t tex_width = 32;
11322 const int32_t tex_height = 32;
11323
11324 VkImageCreateInfo image_create_info = {};
11325 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11326 image_create_info.pNext = NULL;
11327 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11328 image_create_info.format = tex_format;
11329 image_create_info.extent.width = tex_width;
11330 image_create_info.extent.height = tex_height;
11331 image_create_info.extent.depth = 1;
11332 image_create_info.mipLevels = 1;
11333 image_create_info.arrayLayers = 4;
11334 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11335 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11336 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11337 image_create_info.flags = 0;
11338
11339 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11340 ASSERT_VK_SUCCESS(err);
11341 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11342 ASSERT_VK_SUCCESS(err);
11343
11344 BeginCommandBuffer();
11345 VkImageCopy copyRegion;
11346 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11347 copyRegion.srcSubresource.mipLevel = 0;
11348 copyRegion.srcSubresource.baseArrayLayer = 0;
11349 copyRegion.srcSubresource.layerCount = 1;
11350 copyRegion.srcOffset.x = 0;
11351 copyRegion.srcOffset.y = 0;
11352 copyRegion.srcOffset.z = 0;
11353 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11354 copyRegion.dstSubresource.mipLevel = 0;
11355 copyRegion.dstSubresource.baseArrayLayer = 0;
11356 copyRegion.dstSubresource.layerCount = 1;
11357 copyRegion.dstOffset.x = 0;
11358 copyRegion.dstOffset.y = 0;
11359 copyRegion.dstOffset.z = 0;
11360 copyRegion.extent.width = 1;
11361 copyRegion.extent.height = 1;
11362 copyRegion.extent.depth = 1;
11363 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11364 m_errorMonitor->VerifyFound();
11365 // Now cause error due to src image layout changing
11366 m_errorMonitor->SetDesiredFailureMsg(
11367 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11368 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
11369 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11370 m_errorMonitor->VerifyFound();
11371 // Final src error is due to bad layout type
11372 m_errorMonitor->SetDesiredFailureMsg(
11373 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11374 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
11375 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11376 m_errorMonitor->VerifyFound();
11377 // Now verify same checks for dst
11378 m_errorMonitor->SetDesiredFailureMsg(
11379 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11380 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
11381 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11382 m_errorMonitor->VerifyFound();
11383 // Now cause error due to src image layout changing
11384 m_errorMonitor->SetDesiredFailureMsg(
11385 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11386 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
11387 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
11388 m_errorMonitor->VerifyFound();
11389 m_errorMonitor->SetDesiredFailureMsg(
11390 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11391 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
11392 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
11393 m_errorMonitor->VerifyFound();
11394 // Now cause error due to bad image layout transition in PipelineBarrier
11395 VkImageMemoryBarrier image_barrier[1] = {};
11396 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11397 image_barrier[0].image = src_image;
11398 image_barrier[0].subresourceRange.layerCount = 2;
11399 image_barrier[0].subresourceRange.levelCount = 2;
11400 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11401 m_errorMonitor->SetDesiredFailureMsg(
11402 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11403 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
11404 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
11405 m_errorMonitor->VerifyFound();
11406
11407 // Finally some layout errors at RenderPass create time
11408 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11409 VkAttachmentReference attach = {};
11410 // perf warning for GENERAL layout w/ non-DS input attachment
11411 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11412 VkSubpassDescription subpass = {};
11413 subpass.inputAttachmentCount = 1;
11414 subpass.pInputAttachments = &attach;
11415 VkRenderPassCreateInfo rpci = {};
11416 rpci.subpassCount = 1;
11417 rpci.pSubpasses = &subpass;
11418 rpci.attachmentCount = 1;
11419 VkAttachmentDescription attach_desc = {};
11420 attach_desc.format = VK_FORMAT_UNDEFINED;
11421 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011422 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011423 VkRenderPass rp;
11424 m_errorMonitor->SetDesiredFailureMsg(
11425 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11426 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
11427 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11428 m_errorMonitor->VerifyFound();
11429 // error w/ non-general layout
11430 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11431
11432 m_errorMonitor->SetDesiredFailureMsg(
11433 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11434 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11435 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11436 m_errorMonitor->VerifyFound();
11437 subpass.inputAttachmentCount = 0;
11438 subpass.colorAttachmentCount = 1;
11439 subpass.pColorAttachments = &attach;
11440 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11441 // perf warning for GENERAL layout on color attachment
11442 m_errorMonitor->SetDesiredFailureMsg(
11443 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11444 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
11445 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11446 m_errorMonitor->VerifyFound();
11447 // error w/ non-color opt or GENERAL layout for color attachment
11448 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11449 m_errorMonitor->SetDesiredFailureMsg(
11450 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11451 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11452 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11453 m_errorMonitor->VerifyFound();
11454 subpass.colorAttachmentCount = 0;
11455 subpass.pDepthStencilAttachment = &attach;
11456 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11457 // perf warning for GENERAL layout on DS attachment
11458 m_errorMonitor->SetDesiredFailureMsg(
11459 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11460 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
11461 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11462 m_errorMonitor->VerifyFound();
11463 // error w/ non-ds opt or GENERAL layout for color attachment
11464 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11465 m_errorMonitor->SetDesiredFailureMsg(
11466 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11467 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
11468 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11469 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060011470 // For this error we need a valid renderpass so create default one
11471 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11472 attach.attachment = 0;
11473 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
11474 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
11475 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
11476 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
11477 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
11478 // Can't do a CLEAR load on READ_ONLY initialLayout
11479 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
11480 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11481 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11482 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11483 " with invalid first layout "
11484 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
11485 "ONLY_OPTIMAL");
11486 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11487 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011488
11489 vkDestroyImage(m_device->device(), src_image, NULL);
11490 vkDestroyImage(m_device->device(), dst_image, NULL);
11491}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011492#endif // DRAW_STATE_TESTS
11493
Tobin Ehlis0788f522015-05-26 16:11:58 -060011494#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060011495#if GTEST_IS_THREADSAFE
11496struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011497 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011498 VkEvent event;
11499 bool bailout;
11500};
11501
Karl Schultz6addd812016-02-02 17:17:23 -070011502extern "C" void *AddToCommandBuffer(void *arg) {
11503 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011504
Karl Schultz6addd812016-02-02 17:17:23 -070011505 for (int i = 0; i < 10000; i++) {
11506 vkCmdSetEvent(data->commandBuffer, data->event,
11507 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011508 if (data->bailout) {
11509 break;
11510 }
11511 }
11512 return NULL;
11513}
11514
Karl Schultz6addd812016-02-02 17:17:23 -070011515TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011516 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011517
Karl Schultz6addd812016-02-02 17:17:23 -070011518 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11519 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011520
Mike Stroyanaccf7692015-05-12 16:00:45 -060011521 ASSERT_NO_FATAL_FAILURE(InitState());
11522 ASSERT_NO_FATAL_FAILURE(InitViewport());
11523 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11524
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011525 // Calls AllocateCommandBuffers
11526 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060011527
11528 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011529 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011530
11531 VkEventCreateInfo event_info;
11532 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011533 VkResult err;
11534
11535 memset(&event_info, 0, sizeof(event_info));
11536 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11537
Chia-I Wuf7458c52015-10-26 21:10:41 +080011538 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011539 ASSERT_VK_SUCCESS(err);
11540
Mike Stroyanaccf7692015-05-12 16:00:45 -060011541 err = vkResetEvent(device(), event);
11542 ASSERT_VK_SUCCESS(err);
11543
11544 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011545 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011546 data.event = event;
11547 data.bailout = false;
11548 m_errorMonitor->SetBailout(&data.bailout);
11549 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011550 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011551 // Add many entries to command buffer from this thread at the same time.
11552 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060011553
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011554 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011555 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011556
Mike Stroyan10b8cb72016-01-22 15:22:03 -070011557 m_errorMonitor->SetBailout(NULL);
11558
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011559 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011560
Chia-I Wuf7458c52015-10-26 21:10:41 +080011561 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011562}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011563#endif // GTEST_IS_THREADSAFE
11564#endif // THREADING_TESTS
11565
Chris Forbes9f7ff632015-05-25 11:13:08 +120011566#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070011567TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011568 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011569 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011570
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011571 ASSERT_NO_FATAL_FAILURE(InitState());
11572 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11573
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011574 VkShaderModule module;
11575 VkShaderModuleCreateInfo moduleCreateInfo;
11576 struct icd_spv_header spv;
11577
11578 spv.magic = ICD_SPV_MAGIC;
11579 spv.version = ICD_SPV_VERSION;
11580 spv.gen_magic = 0;
11581
11582 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
11583 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070011584 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011585 moduleCreateInfo.codeSize = 4;
11586 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011587 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011588
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011589 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011590}
11591
Karl Schultz6addd812016-02-02 17:17:23 -070011592TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011594 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011595
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011596 ASSERT_NO_FATAL_FAILURE(InitState());
11597 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11598
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011599 VkShaderModule module;
11600 VkShaderModuleCreateInfo moduleCreateInfo;
11601 struct icd_spv_header spv;
11602
11603 spv.magic = ~ICD_SPV_MAGIC;
11604 spv.version = ICD_SPV_VERSION;
11605 spv.gen_magic = 0;
11606
11607 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
11608 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070011609 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011610 moduleCreateInfo.codeSize = sizeof(spv) + 10;
11611 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011612 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011613
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011614 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011615}
11616
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011617#if 0
11618// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070011619TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011621 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011622
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011623 ASSERT_NO_FATAL_FAILURE(InitState());
11624 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11625
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011626 VkShaderModule module;
11627 VkShaderModuleCreateInfo moduleCreateInfo;
11628 struct icd_spv_header spv;
11629
11630 spv.magic = ICD_SPV_MAGIC;
11631 spv.version = ~ICD_SPV_VERSION;
11632 spv.gen_magic = 0;
11633
11634 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
11635 moduleCreateInfo.pNext = NULL;
11636
Karl Schultz6addd812016-02-02 17:17:23 -070011637 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011638 moduleCreateInfo.codeSize = sizeof(spv) + 10;
11639 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011640 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011641
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011642 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011643}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011644#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011645
Karl Schultz6addd812016-02-02 17:17:23 -070011646TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070011647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011648 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011649
Chris Forbes9f7ff632015-05-25 11:13:08 +120011650 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060011651 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120011652
11653 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011654 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120011655 "\n"
11656 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070011657 "out gl_PerVertex {\n"
11658 " vec4 gl_Position;\n"
11659 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120011660 "void main(){\n"
11661 " gl_Position = vec4(1);\n"
11662 " x = 0;\n"
11663 "}\n";
11664 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011665 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120011666 "\n"
11667 "layout(location=0) out vec4 color;\n"
11668 "void main(){\n"
11669 " color = vec4(1);\n"
11670 "}\n";
11671
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060011672 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11673 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120011674
11675 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080011676 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120011677 pipe.AddShader(&vs);
11678 pipe.AddShader(&fs);
11679
Chris Forbes9f7ff632015-05-25 11:13:08 +120011680 VkDescriptorSetObj descriptorSet(m_device);
11681 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011682 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120011683
Tony Barbour5781e8f2015-08-04 16:23:11 -060011684 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120011685
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011686 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120011687}
Chris Forbes9f7ff632015-05-25 11:13:08 +120011688
Karl Schultz6addd812016-02-02 17:17:23 -070011689TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011691 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011692
Chris Forbes59cb88d2015-05-25 11:13:13 +120011693 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060011694 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120011695
11696 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011697 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120011698 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070011699 "out gl_PerVertex {\n"
11700 " vec4 gl_Position;\n"
11701 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120011702 "void main(){\n"
11703 " gl_Position = vec4(1);\n"
11704 "}\n";
11705 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011706 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120011707 "\n"
11708 "layout(location=0) in float x;\n"
11709 "layout(location=0) out vec4 color;\n"
11710 "void main(){\n"
11711 " color = vec4(x);\n"
11712 "}\n";
11713
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060011714 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11715 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120011716
11717 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080011718 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120011719 pipe.AddShader(&vs);
11720 pipe.AddShader(&fs);
11721
Chris Forbes59cb88d2015-05-25 11:13:13 +120011722 VkDescriptorSetObj descriptorSet(m_device);
11723 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011724 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120011725
Tony Barbour5781e8f2015-08-04 16:23:11 -060011726 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120011727
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011728 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120011729}
11730
Karl Schultz6addd812016-02-02 17:17:23 -070011731TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +130011732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011733 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130011734
11735 ASSERT_NO_FATAL_FAILURE(InitState());
11736 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11737
11738 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011739 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130011740 "\n"
11741 "out gl_PerVertex {\n"
11742 " vec4 gl_Position;\n"
11743 "};\n"
11744 "void main(){\n"
11745 " gl_Position = vec4(1);\n"
11746 "}\n";
11747 char const *fsSource =
11748 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130011749 "\n"
11750 "in block { layout(location=0) float x; } ins;\n"
11751 "layout(location=0) out vec4 color;\n"
11752 "void main(){\n"
11753 " color = vec4(ins.x);\n"
11754 "}\n";
11755
11756 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11757 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11758
11759 VkPipelineObj pipe(m_device);
11760 pipe.AddColorAttachment();
11761 pipe.AddShader(&vs);
11762 pipe.AddShader(&fs);
11763
11764 VkDescriptorSetObj descriptorSet(m_device);
11765 descriptorSet.AppendDummy();
11766 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11767
11768 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11769
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011770 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130011771}
11772
Karl Schultz6addd812016-02-02 17:17:23 -070011773TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +130011774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +130011775 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -070011776 "output arr[2] of float32' vs 'ptr to "
11777 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130011778
11779 ASSERT_NO_FATAL_FAILURE(InitState());
11780 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11781
11782 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011783 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130011784 "\n"
11785 "layout(location=0) out float x[2];\n"
11786 "out gl_PerVertex {\n"
11787 " vec4 gl_Position;\n"
11788 "};\n"
11789 "void main(){\n"
11790 " x[0] = 0; x[1] = 0;\n"
11791 " gl_Position = vec4(1);\n"
11792 "}\n";
11793 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011794 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130011795 "\n"
11796 "layout(location=0) in float x[3];\n"
11797 "layout(location=0) out vec4 color;\n"
11798 "void main(){\n"
11799 " color = vec4(x[0] + x[1] + x[2]);\n"
11800 "}\n";
11801
11802 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11803 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11804
11805 VkPipelineObj pipe(m_device);
11806 pipe.AddColorAttachment();
11807 pipe.AddShader(&vs);
11808 pipe.AddShader(&fs);
11809
11810 VkDescriptorSetObj descriptorSet(m_device);
11811 descriptorSet.AppendDummy();
11812 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11813
11814 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11815
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011816 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130011817}
11818
Karl Schultz6addd812016-02-02 17:17:23 -070011819TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011821 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011822
Chris Forbesb56af562015-05-25 11:13:17 +120011823 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060011824 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120011825
11826 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011827 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120011828 "\n"
11829 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070011830 "out gl_PerVertex {\n"
11831 " vec4 gl_Position;\n"
11832 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +120011833 "void main(){\n"
11834 " x = 0;\n"
11835 " gl_Position = vec4(1);\n"
11836 "}\n";
11837 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011838 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120011839 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070011840 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +120011841 "layout(location=0) out vec4 color;\n"
11842 "void main(){\n"
11843 " color = vec4(x);\n"
11844 "}\n";
11845
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060011846 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11847 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120011848
11849 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080011850 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120011851 pipe.AddShader(&vs);
11852 pipe.AddShader(&fs);
11853
Chris Forbesb56af562015-05-25 11:13:17 +120011854 VkDescriptorSetObj descriptorSet(m_device);
11855 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011856 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120011857
Tony Barbour5781e8f2015-08-04 16:23:11 -060011858 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120011859
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011860 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120011861}
11862
Karl Schultz6addd812016-02-02 17:17:23 -070011863TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +130011864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011865 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130011866
11867 ASSERT_NO_FATAL_FAILURE(InitState());
11868 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11869
11870 char const *vsSource =
11871 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130011872 "\n"
11873 "out block { layout(location=0) int x; } outs;\n"
11874 "out gl_PerVertex {\n"
11875 " vec4 gl_Position;\n"
11876 "};\n"
11877 "void main(){\n"
11878 " outs.x = 0;\n"
11879 " gl_Position = vec4(1);\n"
11880 "}\n";
11881 char const *fsSource =
11882 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130011883 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070011884 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +130011885 "layout(location=0) out vec4 color;\n"
11886 "void main(){\n"
11887 " color = vec4(ins.x);\n"
11888 "}\n";
11889
11890 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11891 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11892
11893 VkPipelineObj pipe(m_device);
11894 pipe.AddColorAttachment();
11895 pipe.AddShader(&vs);
11896 pipe.AddShader(&fs);
11897
11898 VkDescriptorSetObj descriptorSet(m_device);
11899 descriptorSet.AppendDummy();
11900 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11901
11902 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11903
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011904 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130011905}
11906
11907TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
11908 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11909 "location 0.0 which is not written by vertex shader");
11910
11911 ASSERT_NO_FATAL_FAILURE(InitState());
11912 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11913
11914 char const *vsSource =
11915 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130011916 "\n"
11917 "out block { layout(location=1) float x; } outs;\n"
11918 "out gl_PerVertex {\n"
11919 " vec4 gl_Position;\n"
11920 "};\n"
11921 "void main(){\n"
11922 " outs.x = 0;\n"
11923 " gl_Position = vec4(1);\n"
11924 "}\n";
11925 char const *fsSource =
11926 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130011927 "\n"
11928 "in block { layout(location=0) float x; } ins;\n"
11929 "layout(location=0) out vec4 color;\n"
11930 "void main(){\n"
11931 " color = vec4(ins.x);\n"
11932 "}\n";
11933
11934 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11935 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11936
11937 VkPipelineObj pipe(m_device);
11938 pipe.AddColorAttachment();
11939 pipe.AddShader(&vs);
11940 pipe.AddShader(&fs);
11941
11942 VkDescriptorSetObj descriptorSet(m_device);
11943 descriptorSet.AppendDummy();
11944 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11945
11946 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11947
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011948 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130011949}
11950
11951TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
11952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11953 "location 0.1 which is not written by vertex shader");
11954
11955 ASSERT_NO_FATAL_FAILURE(InitState());
11956 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11957
11958 char const *vsSource =
11959 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130011960 "\n"
11961 "out block { layout(location=0, component=0) float x; } outs;\n"
11962 "out gl_PerVertex {\n"
11963 " vec4 gl_Position;\n"
11964 "};\n"
11965 "void main(){\n"
11966 " outs.x = 0;\n"
11967 " gl_Position = vec4(1);\n"
11968 "}\n";
11969 char const *fsSource =
11970 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130011971 "\n"
11972 "in block { layout(location=0, component=1) float x; } ins;\n"
11973 "layout(location=0) out vec4 color;\n"
11974 "void main(){\n"
11975 " color = vec4(ins.x);\n"
11976 "}\n";
11977
11978 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11979 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11980
11981 VkPipelineObj pipe(m_device);
11982 pipe.AddColorAttachment();
11983 pipe.AddShader(&vs);
11984 pipe.AddShader(&fs);
11985
11986 VkDescriptorSetObj descriptorSet(m_device);
11987 descriptorSet.AppendDummy();
11988 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11989
11990 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11991
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011992 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130011993}
11994
Karl Schultz6addd812016-02-02 17:17:23 -070011995TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070011996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011997 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011998
Chris Forbesde136e02015-05-25 11:13:28 +120011999 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012000 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120012001
12002 VkVertexInputBindingDescription input_binding;
12003 memset(&input_binding, 0, sizeof(input_binding));
12004
12005 VkVertexInputAttributeDescription input_attrib;
12006 memset(&input_attrib, 0, sizeof(input_attrib));
12007 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12008
12009 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012010 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012011 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012012 "out gl_PerVertex {\n"
12013 " vec4 gl_Position;\n"
12014 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012015 "void main(){\n"
12016 " gl_Position = vec4(1);\n"
12017 "}\n";
12018 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012019 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012020 "\n"
12021 "layout(location=0) out vec4 color;\n"
12022 "void main(){\n"
12023 " color = vec4(1);\n"
12024 "}\n";
12025
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012026 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12027 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120012028
12029 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012030 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120012031 pipe.AddShader(&vs);
12032 pipe.AddShader(&fs);
12033
12034 pipe.AddVertexInputBindings(&input_binding, 1);
12035 pipe.AddVertexInputAttribs(&input_attrib, 1);
12036
Chris Forbesde136e02015-05-25 11:13:28 +120012037 VkDescriptorSetObj descriptorSet(m_device);
12038 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012039 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120012040
Tony Barbour5781e8f2015-08-04 16:23:11 -060012041 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120012042
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012043 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120012044}
12045
Karl Schultz6addd812016-02-02 17:17:23 -070012046TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012047 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012048 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +130012049
12050 ASSERT_NO_FATAL_FAILURE(InitState());
12051 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12052
12053 VkVertexInputBindingDescription input_binding;
12054 memset(&input_binding, 0, sizeof(input_binding));
12055
12056 VkVertexInputAttributeDescription input_attrib;
12057 memset(&input_attrib, 0, sizeof(input_attrib));
12058 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12059
12060 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012061 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130012062 "\n"
12063 "layout(location=1) in float x;\n"
12064 "out gl_PerVertex {\n"
12065 " vec4 gl_Position;\n"
12066 "};\n"
12067 "void main(){\n"
12068 " gl_Position = vec4(x);\n"
12069 "}\n";
12070 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012071 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130012072 "\n"
12073 "layout(location=0) out vec4 color;\n"
12074 "void main(){\n"
12075 " color = vec4(1);\n"
12076 "}\n";
12077
12078 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12079 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12080
12081 VkPipelineObj pipe(m_device);
12082 pipe.AddColorAttachment();
12083 pipe.AddShader(&vs);
12084 pipe.AddShader(&fs);
12085
12086 pipe.AddVertexInputBindings(&input_binding, 1);
12087 pipe.AddVertexInputAttribs(&input_attrib, 1);
12088
12089 VkDescriptorSetObj descriptorSet(m_device);
12090 descriptorSet.AppendDummy();
12091 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12092
12093 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12094
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012095 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130012096}
12097
Karl Schultz6addd812016-02-02 17:17:23 -070012098TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
12099 m_errorMonitor->SetDesiredFailureMsg(
12100 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012101 "VS consumes input at location 0 but not provided");
12102
Chris Forbes62e8e502015-05-25 11:13:29 +120012103 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012104 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120012105
12106 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012107 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012108 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012109 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -070012110 "out gl_PerVertex {\n"
12111 " vec4 gl_Position;\n"
12112 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012113 "void main(){\n"
12114 " gl_Position = x;\n"
12115 "}\n";
12116 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012117 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012118 "\n"
12119 "layout(location=0) out vec4 color;\n"
12120 "void main(){\n"
12121 " color = vec4(1);\n"
12122 "}\n";
12123
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012124 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12125 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120012126
12127 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012128 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120012129 pipe.AddShader(&vs);
12130 pipe.AddShader(&fs);
12131
Chris Forbes62e8e502015-05-25 11:13:29 +120012132 VkDescriptorSetObj descriptorSet(m_device);
12133 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012134 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120012135
Tony Barbour5781e8f2015-08-04 16:23:11 -060012136 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120012137
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012138 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120012139}
12140
Karl Schultz6addd812016-02-02 17:17:23 -070012141TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
12142 m_errorMonitor->SetDesiredFailureMsg(
12143 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012144 "location 0 does not match VS input type");
12145
Chris Forbesc97d98e2015-05-25 11:13:31 +120012146 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012147 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120012148
12149 VkVertexInputBindingDescription input_binding;
12150 memset(&input_binding, 0, sizeof(input_binding));
12151
12152 VkVertexInputAttributeDescription input_attrib;
12153 memset(&input_attrib, 0, sizeof(input_attrib));
12154 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12155
12156 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012157 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012158 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012159 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070012160 "out gl_PerVertex {\n"
12161 " vec4 gl_Position;\n"
12162 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012163 "void main(){\n"
12164 " gl_Position = vec4(x);\n"
12165 "}\n";
12166 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012167 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012168 "\n"
12169 "layout(location=0) out vec4 color;\n"
12170 "void main(){\n"
12171 " color = vec4(1);\n"
12172 "}\n";
12173
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012174 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12175 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120012176
12177 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012178 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120012179 pipe.AddShader(&vs);
12180 pipe.AddShader(&fs);
12181
12182 pipe.AddVertexInputBindings(&input_binding, 1);
12183 pipe.AddVertexInputAttribs(&input_attrib, 1);
12184
Chris Forbesc97d98e2015-05-25 11:13:31 +120012185 VkDescriptorSetObj descriptorSet(m_device);
12186 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012187 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120012188
Tony Barbour5781e8f2015-08-04 16:23:11 -060012189 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120012190
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012191 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120012192}
12193
Chris Forbesc68b43c2016-04-06 11:18:47 +120012194TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
12195 m_errorMonitor->SetDesiredFailureMsg(
12196 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12197 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
12198
12199 ASSERT_NO_FATAL_FAILURE(InitState());
12200 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12201
12202 char const *vsSource =
12203 "#version 450\n"
12204 "\n"
12205 "out gl_PerVertex {\n"
12206 " vec4 gl_Position;\n"
12207 "};\n"
12208 "void main(){\n"
12209 " gl_Position = vec4(1);\n"
12210 "}\n";
12211 char const *fsSource =
12212 "#version 450\n"
12213 "\n"
12214 "layout(location=0) out vec4 color;\n"
12215 "void main(){\n"
12216 " color = vec4(1);\n"
12217 "}\n";
12218
12219 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12220 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12221
12222 VkPipelineObj pipe(m_device);
12223 pipe.AddColorAttachment();
12224 pipe.AddShader(&vs);
12225 pipe.AddShader(&vs);
12226 pipe.AddShader(&fs);
12227
12228 VkDescriptorSetObj descriptorSet(m_device);
12229 descriptorSet.AppendDummy();
12230 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12231
12232 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12233
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012234 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120012235}
12236
Karl Schultz6addd812016-02-02 17:17:23 -070012237TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012238 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130012239
12240 ASSERT_NO_FATAL_FAILURE(InitState());
12241 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12242
12243 VkVertexInputBindingDescription input_binding;
12244 memset(&input_binding, 0, sizeof(input_binding));
12245
12246 VkVertexInputAttributeDescription input_attribs[2];
12247 memset(input_attribs, 0, sizeof(input_attribs));
12248
12249 for (int i = 0; i < 2; i++) {
12250 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12251 input_attribs[i].location = i;
12252 }
12253
12254 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012255 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012256 "\n"
12257 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012258 "out gl_PerVertex {\n"
12259 " vec4 gl_Position;\n"
12260 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012261 "void main(){\n"
12262 " gl_Position = x[0] + x[1];\n"
12263 "}\n";
12264 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012265 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012266 "\n"
12267 "layout(location=0) out vec4 color;\n"
12268 "void main(){\n"
12269 " color = vec4(1);\n"
12270 "}\n";
12271
12272 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12273 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12274
12275 VkPipelineObj pipe(m_device);
12276 pipe.AddColorAttachment();
12277 pipe.AddShader(&vs);
12278 pipe.AddShader(&fs);
12279
12280 pipe.AddVertexInputBindings(&input_binding, 1);
12281 pipe.AddVertexInputAttribs(input_attribs, 2);
12282
12283 VkDescriptorSetObj descriptorSet(m_device);
12284 descriptorSet.AppendDummy();
12285 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12286
12287 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12288
12289 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012290 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130012291}
12292
Chris Forbes2682b242015-11-24 11:13:14 +130012293TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
12294{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012295 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130012296
12297 ASSERT_NO_FATAL_FAILURE(InitState());
12298 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12299
12300 VkVertexInputBindingDescription input_binding;
12301 memset(&input_binding, 0, sizeof(input_binding));
12302
12303 VkVertexInputAttributeDescription input_attribs[2];
12304 memset(input_attribs, 0, sizeof(input_attribs));
12305
12306 for (int i = 0; i < 2; i++) {
12307 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12308 input_attribs[i].location = i;
12309 }
12310
12311 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012312 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012313 "\n"
12314 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -070012315 "out gl_PerVertex {\n"
12316 " vec4 gl_Position;\n"
12317 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012318 "void main(){\n"
12319 " gl_Position = x[0] + x[1];\n"
12320 "}\n";
12321 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012322 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012323 "\n"
12324 "layout(location=0) out vec4 color;\n"
12325 "void main(){\n"
12326 " color = vec4(1);\n"
12327 "}\n";
12328
12329 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12330 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12331
12332 VkPipelineObj pipe(m_device);
12333 pipe.AddColorAttachment();
12334 pipe.AddShader(&vs);
12335 pipe.AddShader(&fs);
12336
12337 pipe.AddVertexInputBindings(&input_binding, 1);
12338 pipe.AddVertexInputAttribs(input_attribs, 2);
12339
12340 VkDescriptorSetObj descriptorSet(m_device);
12341 descriptorSet.AppendDummy();
12342 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12343
12344 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12345
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012346 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130012347}
Chris Forbes2682b242015-11-24 11:13:14 +130012348
Chris Forbesbc290ce2016-07-06 12:01:49 +120012349TEST_F(VkLayerTest, CreatePipelineAttribComponents)
12350{
12351 m_errorMonitor->ExpectSuccess();
12352
12353 ASSERT_NO_FATAL_FAILURE(InitState());
12354 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12355
12356 VkVertexInputBindingDescription input_binding;
12357 memset(&input_binding, 0, sizeof(input_binding));
12358
12359 VkVertexInputAttributeDescription input_attribs[3];
12360 memset(input_attribs, 0, sizeof(input_attribs));
12361
12362 for (int i = 0; i < 3; i++) {
12363 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12364 input_attribs[i].location = i;
12365 }
12366
12367 char const *vsSource =
12368 "#version 450\n"
12369 "\n"
12370 "layout(location=0) in vec4 x;\n"
12371 "layout(location=1) in vec3 y1;\n"
12372 "layout(location=1, component=3) in float y2;\n"
12373 "layout(location=2) in vec4 z;\n"
12374 "out gl_PerVertex {\n"
12375 " vec4 gl_Position;\n"
12376 "};\n"
12377 "void main(){\n"
12378 " gl_Position = x + vec4(y1, y2) + z;\n"
12379 "}\n";
12380 char const *fsSource =
12381 "#version 450\n"
12382 "\n"
12383 "layout(location=0) out vec4 color;\n"
12384 "void main(){\n"
12385 " color = vec4(1);\n"
12386 "}\n";
12387
12388 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12389 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12390
12391 VkPipelineObj pipe(m_device);
12392 pipe.AddColorAttachment();
12393 pipe.AddShader(&vs);
12394 pipe.AddShader(&fs);
12395
12396 pipe.AddVertexInputBindings(&input_binding, 1);
12397 pipe.AddVertexInputAttribs(input_attribs, 3);
12398
12399 VkDescriptorSetObj descriptorSet(m_device);
12400 descriptorSet.AppendDummy();
12401 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12402
12403 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12404
12405 m_errorMonitor->VerifyNotFound();
12406}
12407
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012408TEST_F(VkLayerTest, CreatePipelineSimplePositive)
12409{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012410 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012411
12412 ASSERT_NO_FATAL_FAILURE(InitState());
12413 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12414
12415 char const *vsSource =
12416 "#version 450\n"
12417 "out gl_PerVertex {\n"
12418 " vec4 gl_Position;\n"
12419 "};\n"
12420 "void main(){\n"
12421 " gl_Position = vec4(0);\n"
12422 "}\n";
12423 char const *fsSource =
12424 "#version 450\n"
12425 "\n"
12426 "layout(location=0) out vec4 color;\n"
12427 "void main(){\n"
12428 " color = vec4(1);\n"
12429 "}\n";
12430
12431 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12432 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12433
12434 VkPipelineObj pipe(m_device);
12435 pipe.AddColorAttachment();
12436 pipe.AddShader(&vs);
12437 pipe.AddShader(&fs);
12438
12439 VkDescriptorSetObj descriptorSet(m_device);
12440 descriptorSet.AppendDummy();
12441 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12442
12443 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12444
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012445 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012446}
12447
Chris Forbes912c9192016-04-05 17:50:35 +120012448TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
12449{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012450 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +120012451
12452 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
12453
12454 ASSERT_NO_FATAL_FAILURE(InitState());
12455 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12456
12457 char const *vsSource =
12458 "#version 450\n"
12459 "out gl_PerVertex {\n"
12460 " vec4 gl_Position;\n"
12461 "};\n"
12462 "layout(location=0) out vec3 x;\n"
12463 "layout(location=1) out ivec3 y;\n"
12464 "layout(location=2) out vec3 z;\n"
12465 "void main(){\n"
12466 " gl_Position = vec4(0);\n"
12467 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
12468 "}\n";
12469 char const *fsSource =
12470 "#version 450\n"
12471 "\n"
12472 "layout(location=0) out vec4 color;\n"
12473 "layout(location=0) in float x;\n"
12474 "layout(location=1) flat in int y;\n"
12475 "layout(location=2) in vec2 z;\n"
12476 "void main(){\n"
12477 " color = vec4(1 + x + y + z.x);\n"
12478 "}\n";
12479
12480 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12481 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12482
12483 VkPipelineObj pipe(m_device);
12484 pipe.AddColorAttachment();
12485 pipe.AddShader(&vs);
12486 pipe.AddShader(&fs);
12487
12488 VkDescriptorSetObj descriptorSet(m_device);
12489 descriptorSet.AppendDummy();
12490 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12491
Mike Stroyan255e9582016-06-24 09:49:32 -060012492 VkResult err = VK_SUCCESS;
12493 err =
12494 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12495 ASSERT_VK_SUCCESS(err);
12496
Chris Forbes912c9192016-04-05 17:50:35 +120012497
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012498 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +120012499}
12500
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012501TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
12502{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012503 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012504
12505 ASSERT_NO_FATAL_FAILURE(InitState());
12506 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12507
Chris Forbesc1e852d2016-04-04 19:26:42 +120012508 if (!m_device->phy().features().tessellationShader) {
12509 printf("Device does not support tessellation shaders; skipped.\n");
12510 return;
12511 }
12512
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012513 char const *vsSource =
12514 "#version 450\n"
12515 "void main(){}\n";
12516 char const *tcsSource =
12517 "#version 450\n"
12518 "layout(location=0) out int x[];\n"
12519 "layout(vertices=3) out;\n"
12520 "void main(){\n"
12521 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
12522 " gl_TessLevelInner[0] = 1;\n"
12523 " x[gl_InvocationID] = gl_InvocationID;\n"
12524 "}\n";
12525 char const *tesSource =
12526 "#version 450\n"
12527 "layout(triangles, equal_spacing, cw) in;\n"
12528 "layout(location=0) in int x[];\n"
12529 "out gl_PerVertex { vec4 gl_Position; };\n"
12530 "void main(){\n"
12531 " gl_Position.xyz = gl_TessCoord;\n"
12532 " gl_Position.w = x[0] + x[1] + x[2];\n"
12533 "}\n";
12534 char const *fsSource =
12535 "#version 450\n"
12536 "layout(location=0) out vec4 color;\n"
12537 "void main(){\n"
12538 " color = vec4(1);\n"
12539 "}\n";
12540
12541 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12542 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
12543 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
12544 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12545
12546 VkPipelineInputAssemblyStateCreateInfo iasci{
12547 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
12548 nullptr,
12549 0,
12550 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
12551 VK_FALSE};
12552
Chris Forbesb4cacb62016-04-04 19:15:00 +120012553 VkPipelineTessellationStateCreateInfo tsci{
12554 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
12555 nullptr,
12556 0,
12557 3};
12558
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012559 VkPipelineObj pipe(m_device);
12560 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +120012561 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012562 pipe.AddColorAttachment();
12563 pipe.AddShader(&vs);
12564 pipe.AddShader(&tcs);
12565 pipe.AddShader(&tes);
12566 pipe.AddShader(&fs);
12567
12568 VkDescriptorSetObj descriptorSet(m_device);
12569 descriptorSet.AppendDummy();
12570 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12571
12572 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12573
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012574 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012575}
12576
Chris Forbesa0ab8152016-04-20 13:34:27 +120012577TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
12578{
12579 m_errorMonitor->ExpectSuccess();
12580
12581 ASSERT_NO_FATAL_FAILURE(InitState());
12582 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12583
12584 if (!m_device->phy().features().geometryShader) {
12585 printf("Device does not support geometry shaders; skipped.\n");
12586 return;
12587 }
12588
12589 char const *vsSource =
12590 "#version 450\n"
12591 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
12592 "void main(){\n"
12593 " vs_out.x = vec4(1);\n"
12594 "}\n";
12595 char const *gsSource =
12596 "#version 450\n"
12597 "layout(triangles) in;\n"
12598 "layout(triangle_strip, max_vertices=3) out;\n"
12599 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
12600 "out gl_PerVertex { vec4 gl_Position; };\n"
12601 "void main() {\n"
12602 " gl_Position = gs_in[0].x;\n"
12603 " EmitVertex();\n"
12604 "}\n";
12605 char const *fsSource =
12606 "#version 450\n"
12607 "layout(location=0) out vec4 color;\n"
12608 "void main(){\n"
12609 " color = vec4(1);\n"
12610 "}\n";
12611
12612 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12613 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
12614 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12615
12616 VkPipelineObj pipe(m_device);
12617 pipe.AddColorAttachment();
12618 pipe.AddShader(&vs);
12619 pipe.AddShader(&gs);
12620 pipe.AddShader(&fs);
12621
12622 VkDescriptorSetObj descriptorSet(m_device);
12623 descriptorSet.AppendDummy();
12624 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12625
12626 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12627
12628 m_errorMonitor->VerifyNotFound();
12629}
12630
Chris Forbesa0193bc2016-04-04 19:19:47 +120012631TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
12632{
12633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12634 "is per-vertex in tessellation control shader stage "
12635 "but per-patch in tessellation evaluation shader stage");
12636
12637 ASSERT_NO_FATAL_FAILURE(InitState());
12638 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12639
Chris Forbesc1e852d2016-04-04 19:26:42 +120012640 if (!m_device->phy().features().tessellationShader) {
12641 printf("Device does not support tessellation shaders; skipped.\n");
12642 return;
12643 }
12644
Chris Forbesa0193bc2016-04-04 19:19:47 +120012645 char const *vsSource =
12646 "#version 450\n"
12647 "void main(){}\n";
12648 char const *tcsSource =
12649 "#version 450\n"
12650 "layout(location=0) out int x[];\n"
12651 "layout(vertices=3) out;\n"
12652 "void main(){\n"
12653 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
12654 " gl_TessLevelInner[0] = 1;\n"
12655 " x[gl_InvocationID] = gl_InvocationID;\n"
12656 "}\n";
12657 char const *tesSource =
12658 "#version 450\n"
12659 "layout(triangles, equal_spacing, cw) in;\n"
12660 "layout(location=0) patch in int x;\n"
12661 "out gl_PerVertex { vec4 gl_Position; };\n"
12662 "void main(){\n"
12663 " gl_Position.xyz = gl_TessCoord;\n"
12664 " gl_Position.w = x;\n"
12665 "}\n";
12666 char const *fsSource =
12667 "#version 450\n"
12668 "layout(location=0) out vec4 color;\n"
12669 "void main(){\n"
12670 " color = vec4(1);\n"
12671 "}\n";
12672
12673 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12674 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
12675 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
12676 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12677
12678 VkPipelineInputAssemblyStateCreateInfo iasci{
12679 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
12680 nullptr,
12681 0,
12682 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
12683 VK_FALSE};
12684
12685 VkPipelineTessellationStateCreateInfo tsci{
12686 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
12687 nullptr,
12688 0,
12689 3};
12690
12691 VkPipelineObj pipe(m_device);
12692 pipe.SetInputAssembly(&iasci);
12693 pipe.SetTessellation(&tsci);
12694 pipe.AddColorAttachment();
12695 pipe.AddShader(&vs);
12696 pipe.AddShader(&tcs);
12697 pipe.AddShader(&tes);
12698 pipe.AddShader(&fs);
12699
12700 VkDescriptorSetObj descriptorSet(m_device);
12701 descriptorSet.AppendDummy();
12702 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12703
12704 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12705
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012706 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120012707}
12708
Karl Schultz6addd812016-02-02 17:17:23 -070012709TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
12710 m_errorMonitor->SetDesiredFailureMsg(
12711 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012712 "Duplicate vertex input binding descriptions for binding 0");
12713
Chris Forbes280ba2c2015-06-12 11:16:41 +120012714 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012715 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120012716
12717 /* Two binding descriptions for binding 0 */
12718 VkVertexInputBindingDescription input_bindings[2];
12719 memset(input_bindings, 0, sizeof(input_bindings));
12720
12721 VkVertexInputAttributeDescription input_attrib;
12722 memset(&input_attrib, 0, sizeof(input_attrib));
12723 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12724
12725 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012726 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120012727 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012728 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070012729 "out gl_PerVertex {\n"
12730 " vec4 gl_Position;\n"
12731 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120012732 "void main(){\n"
12733 " gl_Position = vec4(x);\n"
12734 "}\n";
12735 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012736 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120012737 "\n"
12738 "layout(location=0) out vec4 color;\n"
12739 "void main(){\n"
12740 " color = vec4(1);\n"
12741 "}\n";
12742
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012743 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12744 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120012745
12746 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012747 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120012748 pipe.AddShader(&vs);
12749 pipe.AddShader(&fs);
12750
12751 pipe.AddVertexInputBindings(input_bindings, 2);
12752 pipe.AddVertexInputAttribs(&input_attrib, 1);
12753
Chris Forbes280ba2c2015-06-12 11:16:41 +120012754 VkDescriptorSetObj descriptorSet(m_device);
12755 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012756 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120012757
Tony Barbour5781e8f2015-08-04 16:23:11 -060012758 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120012759
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012760 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120012761}
Chris Forbes8f68b562015-05-25 11:13:32 +120012762
Chris Forbes35efec72016-04-21 14:32:08 +120012763TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
12764 m_errorMonitor->ExpectSuccess();
12765
12766 ASSERT_NO_FATAL_FAILURE(InitState());
12767 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12768
Chris Forbes91cf3a82016-06-28 17:51:35 +120012769 if (!m_device->phy().features().shaderFloat64) {
Chris Forbes35efec72016-04-21 14:32:08 +120012770 printf("Device does not support 64bit vertex attributes; skipped.\n");
12771 return;
12772 }
12773
12774 VkVertexInputBindingDescription input_bindings[1];
12775 memset(input_bindings, 0, sizeof(input_bindings));
12776
12777 VkVertexInputAttributeDescription input_attribs[4];
12778 memset(input_attribs, 0, sizeof(input_attribs));
12779 input_attribs[0].location = 0;
12780 input_attribs[0].offset = 0;
12781 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
12782 input_attribs[1].location = 2;
12783 input_attribs[1].offset = 32;
12784 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
12785 input_attribs[2].location = 4;
12786 input_attribs[2].offset = 64;
12787 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
12788 input_attribs[3].location = 6;
12789 input_attribs[3].offset = 96;
12790 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
12791
12792 char const *vsSource =
12793 "#version 450\n"
12794 "\n"
12795 "layout(location=0) in dmat4 x;\n"
12796 "out gl_PerVertex {\n"
12797 " vec4 gl_Position;\n"
12798 "};\n"
12799 "void main(){\n"
12800 " gl_Position = vec4(x[0][0]);\n"
12801 "}\n";
12802 char const *fsSource =
12803 "#version 450\n"
12804 "\n"
12805 "layout(location=0) out vec4 color;\n"
12806 "void main(){\n"
12807 " color = vec4(1);\n"
12808 "}\n";
12809
12810 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12811 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12812
12813 VkPipelineObj pipe(m_device);
12814 pipe.AddColorAttachment();
12815 pipe.AddShader(&vs);
12816 pipe.AddShader(&fs);
12817
12818 pipe.AddVertexInputBindings(input_bindings, 1);
12819 pipe.AddVertexInputAttribs(input_attribs, 4);
12820
12821 VkDescriptorSetObj descriptorSet(m_device);
12822 descriptorSet.AppendDummy();
12823 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12824
12825 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12826
12827 m_errorMonitor->VerifyNotFound();
12828}
12829
Karl Schultz6addd812016-02-02 17:17:23 -070012830TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012831 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012832 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012833
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012834 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012835
12836 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012837 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012838 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012839 "out gl_PerVertex {\n"
12840 " vec4 gl_Position;\n"
12841 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012842 "void main(){\n"
12843 " gl_Position = vec4(1);\n"
12844 "}\n";
12845 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012846 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012847 "\n"
12848 "void main(){\n"
12849 "}\n";
12850
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012851 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12852 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012853
12854 VkPipelineObj pipe(m_device);
12855 pipe.AddShader(&vs);
12856 pipe.AddShader(&fs);
12857
Chia-I Wu08accc62015-07-07 11:50:03 +080012858 /* set up CB 0, not written */
12859 pipe.AddColorAttachment();
12860 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012861
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012862 VkDescriptorSetObj descriptorSet(m_device);
12863 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012864 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012865
Tony Barbour5781e8f2015-08-04 16:23:11 -060012866 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012867
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012868 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012869}
12870
Karl Schultz6addd812016-02-02 17:17:23 -070012871TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -070012872 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012873 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012874 "FS writes to output location 1 with no matching attachment");
12875
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012876 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012877
12878 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012879 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012880 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012881 "out gl_PerVertex {\n"
12882 " vec4 gl_Position;\n"
12883 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012884 "void main(){\n"
12885 " gl_Position = vec4(1);\n"
12886 "}\n";
12887 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012888 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012889 "\n"
12890 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012891 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012892 "void main(){\n"
12893 " x = vec4(1);\n"
12894 " y = vec4(1);\n"
12895 "}\n";
12896
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012897 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12898 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012899
12900 VkPipelineObj pipe(m_device);
12901 pipe.AddShader(&vs);
12902 pipe.AddShader(&fs);
12903
Chia-I Wu08accc62015-07-07 11:50:03 +080012904 /* set up CB 0, not written */
12905 pipe.AddColorAttachment();
12906 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012907 /* FS writes CB 1, but we don't configure it */
12908
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012909 VkDescriptorSetObj descriptorSet(m_device);
12910 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012911 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012912
Tony Barbour5781e8f2015-08-04 16:23:11 -060012913 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012914
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012915 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012916}
12917
Karl Schultz6addd812016-02-02 17:17:23 -070012918TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012919 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012920 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012921
Chris Forbesa36d69e2015-05-25 11:13:44 +120012922 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120012923
12924 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012925 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120012926 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012927 "out gl_PerVertex {\n"
12928 " vec4 gl_Position;\n"
12929 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120012930 "void main(){\n"
12931 " gl_Position = vec4(1);\n"
12932 "}\n";
12933 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012934 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120012935 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012936 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +120012937 "void main(){\n"
12938 " x = ivec4(1);\n"
12939 "}\n";
12940
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012941 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12942 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120012943
12944 VkPipelineObj pipe(m_device);
12945 pipe.AddShader(&vs);
12946 pipe.AddShader(&fs);
12947
Chia-I Wu08accc62015-07-07 11:50:03 +080012948 /* set up CB 0; type is UNORM by default */
12949 pipe.AddColorAttachment();
12950 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120012951
Chris Forbesa36d69e2015-05-25 11:13:44 +120012952 VkDescriptorSetObj descriptorSet(m_device);
12953 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012954 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120012955
Tony Barbour5781e8f2015-08-04 16:23:11 -060012956 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120012957
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012958 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120012959}
Chris Forbes7b1b8932015-06-05 14:43:36 +120012960
Karl Schultz6addd812016-02-02 17:17:23 -070012961TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012962 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012963 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012964
Chris Forbes556c76c2015-08-14 12:04:59 +120012965 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120012966
12967 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012968 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120012969 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012970 "out gl_PerVertex {\n"
12971 " vec4 gl_Position;\n"
12972 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120012973 "void main(){\n"
12974 " gl_Position = vec4(1);\n"
12975 "}\n";
12976 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012977 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120012978 "\n"
12979 "layout(location=0) out vec4 x;\n"
12980 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
12981 "void main(){\n"
12982 " x = vec4(bar.y);\n"
12983 "}\n";
12984
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012985 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12986 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120012987
Chris Forbes556c76c2015-08-14 12:04:59 +120012988 VkPipelineObj pipe(m_device);
12989 pipe.AddShader(&vs);
12990 pipe.AddShader(&fs);
12991
12992 /* set up CB 0; type is UNORM by default */
12993 pipe.AddColorAttachment();
12994 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12995
12996 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012997 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120012998
12999 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13000
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013001 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120013002}
13003
Chris Forbes5c59e902016-02-26 16:56:09 +130013004TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
13005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13006 "not declared in layout");
13007
13008 ASSERT_NO_FATAL_FAILURE(InitState());
13009
13010 char const *vsSource =
13011 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130013012 "\n"
13013 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13014 "out gl_PerVertex {\n"
13015 " vec4 gl_Position;\n"
13016 "};\n"
13017 "void main(){\n"
13018 " gl_Position = vec4(consts.x);\n"
13019 "}\n";
13020 char const *fsSource =
13021 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130013022 "\n"
13023 "layout(location=0) out vec4 x;\n"
13024 "void main(){\n"
13025 " x = vec4(1);\n"
13026 "}\n";
13027
13028 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13029 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13030
13031 VkPipelineObj pipe(m_device);
13032 pipe.AddShader(&vs);
13033 pipe.AddShader(&fs);
13034
13035 /* set up CB 0; type is UNORM by default */
13036 pipe.AddColorAttachment();
13037 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13038
13039 VkDescriptorSetObj descriptorSet(m_device);
13040 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13041
13042 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13043
13044 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013045 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130013046}
13047
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013048TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
13049 m_errorMonitor->SetDesiredFailureMsg(
13050 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13051 "Shader uses descriptor slot 0.0");
13052
13053 ASSERT_NO_FATAL_FAILURE(InitState());
13054
13055 char const *csSource =
13056 "#version 450\n"
13057 "\n"
13058 "layout(local_size_x=1) in;\n"
13059 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13060 "void main(){\n"
13061 " x = vec4(1);\n"
13062 "}\n";
13063
13064 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13065
13066 VkDescriptorSetObj descriptorSet(m_device);
13067 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13068
13069 VkComputePipelineCreateInfo cpci = {
13070 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13071 nullptr, 0, {
13072 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13073 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13074 cs.handle(), "main", nullptr
13075 },
13076 descriptorSet.GetPipelineLayout(),
13077 VK_NULL_HANDLE, -1
13078 };
13079
13080 VkPipeline pipe;
13081 VkResult err = vkCreateComputePipelines(
13082 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13083
13084 m_errorMonitor->VerifyFound();
13085
13086 if (err == VK_SUCCESS) {
13087 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13088 }
13089}
13090
13091TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
13092 m_errorMonitor->ExpectSuccess();
13093
13094 ASSERT_NO_FATAL_FAILURE(InitState());
13095
13096 char const *csSource =
13097 "#version 450\n"
13098 "\n"
13099 "layout(local_size_x=1) in;\n"
13100 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13101 "void main(){\n"
13102 " // x is not used.\n"
13103 "}\n";
13104
13105 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13106
13107 VkDescriptorSetObj descriptorSet(m_device);
13108 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13109
13110 VkComputePipelineCreateInfo cpci = {
13111 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13112 nullptr, 0, {
13113 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13114 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13115 cs.handle(), "main", nullptr
13116 },
13117 descriptorSet.GetPipelineLayout(),
13118 VK_NULL_HANDLE, -1
13119 };
13120
13121 VkPipeline pipe;
13122 VkResult err = vkCreateComputePipelines(
13123 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13124
13125 m_errorMonitor->VerifyNotFound();
13126
13127 if (err == VK_SUCCESS) {
13128 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13129 }
13130}
13131
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013132#endif // SHADER_CHECKER_TESTS
13133
13134#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060013135TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -070013136 m_errorMonitor->SetDesiredFailureMsg(
13137 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013138 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013139
13140 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013141
13142 // Create an image
13143 VkImage image;
13144
Karl Schultz6addd812016-02-02 17:17:23 -070013145 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13146 const int32_t tex_width = 32;
13147 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013148
13149 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013150 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13151 image_create_info.pNext = NULL;
13152 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13153 image_create_info.format = tex_format;
13154 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013155 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070013156 image_create_info.extent.depth = 1;
13157 image_create_info.mipLevels = 1;
13158 image_create_info.arrayLayers = 1;
13159 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13160 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13161 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13162 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013163
13164 // Introduce error by sending down a bogus width extent
13165 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013166 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013167
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013168 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013169}
13170
Mark Youngc48c4c12016-04-11 14:26:49 -060013171TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
13172 m_errorMonitor->SetDesiredFailureMsg(
13173 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13174 "CreateImage extents is 0 for at least one required dimension");
13175
13176 ASSERT_NO_FATAL_FAILURE(InitState());
13177
13178 // Create an image
13179 VkImage image;
13180
13181 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13182 const int32_t tex_width = 32;
13183 const int32_t tex_height = 32;
13184
13185 VkImageCreateInfo image_create_info = {};
13186 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13187 image_create_info.pNext = NULL;
13188 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13189 image_create_info.format = tex_format;
13190 image_create_info.extent.width = tex_width;
13191 image_create_info.extent.height = tex_height;
13192 image_create_info.extent.depth = 1;
13193 image_create_info.mipLevels = 1;
13194 image_create_info.arrayLayers = 1;
13195 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13196 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13197 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13198 image_create_info.flags = 0;
13199
13200 // Introduce error by sending down a bogus width extent
13201 image_create_info.extent.width = 0;
13202 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
13203
13204 m_errorMonitor->VerifyFound();
13205}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013206#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120013207
Tobin Ehliscde08892015-09-22 10:11:37 -060013208#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070013209TEST_F(VkLayerTest, InvalidImageView) {
13210 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060013211
Karl Schultz6addd812016-02-02 17:17:23 -070013212 m_errorMonitor->SetDesiredFailureMsg(
13213 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013214 "vkCreateImageView called with baseMipLevel 10 ");
13215
Tobin Ehliscde08892015-09-22 10:11:37 -060013216 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060013217
Mike Stroyana3082432015-09-25 13:39:21 -060013218 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070013219 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060013220
Karl Schultz6addd812016-02-02 17:17:23 -070013221 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13222 const int32_t tex_width = 32;
13223 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060013224
13225 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013226 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13227 image_create_info.pNext = NULL;
13228 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13229 image_create_info.format = tex_format;
13230 image_create_info.extent.width = tex_width;
13231 image_create_info.extent.height = tex_height;
13232 image_create_info.extent.depth = 1;
13233 image_create_info.mipLevels = 1;
13234 image_create_info.arrayLayers = 1;
13235 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13236 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13237 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13238 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060013239
Chia-I Wuf7458c52015-10-26 21:10:41 +080013240 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060013241 ASSERT_VK_SUCCESS(err);
13242
13243 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013244 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13245 image_view_create_info.image = image;
13246 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13247 image_view_create_info.format = tex_format;
13248 image_view_create_info.subresourceRange.layerCount = 1;
13249 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
13250 image_view_create_info.subresourceRange.levelCount = 1;
13251 image_view_create_info.subresourceRange.aspectMask =
13252 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060013253
13254 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070013255 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
13256 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060013257
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013258 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060013259 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060013260}
Mike Stroyana3082432015-09-25 13:39:21 -060013261
Mark Youngd339ba32016-05-30 13:28:35 -060013262TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
13263 VkResult err;
13264
13265 m_errorMonitor->SetDesiredFailureMsg(
13266 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13267 "vkCreateImageView called with invalid memory ");
13268
13269 ASSERT_NO_FATAL_FAILURE(InitState());
13270
13271 // Create an image and try to create a view with no memory backing the image
13272 VkImage image;
13273
13274 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13275 const int32_t tex_width = 32;
13276 const int32_t tex_height = 32;
13277
13278 VkImageCreateInfo image_create_info = {};
13279 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13280 image_create_info.pNext = NULL;
13281 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13282 image_create_info.format = tex_format;
13283 image_create_info.extent.width = tex_width;
13284 image_create_info.extent.height = tex_height;
13285 image_create_info.extent.depth = 1;
13286 image_create_info.mipLevels = 1;
13287 image_create_info.arrayLayers = 1;
13288 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13289 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13290 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13291 image_create_info.flags = 0;
13292
13293 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
13294 ASSERT_VK_SUCCESS(err);
13295
13296 VkImageViewCreateInfo image_view_create_info = {};
13297 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13298 image_view_create_info.image = image;
13299 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13300 image_view_create_info.format = tex_format;
13301 image_view_create_info.subresourceRange.layerCount = 1;
13302 image_view_create_info.subresourceRange.baseMipLevel = 0;
13303 image_view_create_info.subresourceRange.levelCount = 1;
13304 image_view_create_info.subresourceRange.aspectMask =
13305 VK_IMAGE_ASPECT_COLOR_BIT;
13306
13307 VkImageView view;
13308 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
13309 &view);
13310
13311 m_errorMonitor->VerifyFound();
13312 vkDestroyImage(m_device->device(), image, NULL);
13313 // If last error is success, it still created the view, so delete it.
13314 if (err == VK_SUCCESS) {
13315 vkDestroyImageView(m_device->device(), view, NULL);
13316 }
13317
13318}
13319
Karl Schultz6addd812016-02-02 17:17:23 -070013320TEST_F(VkLayerTest, InvalidImageViewAspect) {
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013321 TEST_DESCRIPTION(
13322 "Create an image and try to create a view with an invalid aspectMask");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013324 "vkCreateImageView: Color image "
13325 "formats must have ONLY the "
13326 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013327
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013328 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013329
Karl Schultz6addd812016-02-02 17:17:23 -070013330 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013331 VkImageObj image(m_device);
13332 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT,
13333 VK_IMAGE_TILING_LINEAR, 0);
13334 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013335
13336 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013337 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013338 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070013339 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13340 image_view_create_info.format = tex_format;
13341 image_view_create_info.subresourceRange.baseMipLevel = 0;
13342 image_view_create_info.subresourceRange.levelCount = 1;
13343 // Cause an error by setting an invalid image aspect
13344 image_view_create_info.subresourceRange.aspectMask =
13345 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013346
13347 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013348 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013349
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013350 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013351}
13352
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013353TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070013354 VkResult err;
13355 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060013356
Karl Schultz6addd812016-02-02 17:17:23 -070013357 m_errorMonitor->SetDesiredFailureMsg(
13358 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013359 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013360
Mike Stroyana3082432015-09-25 13:39:21 -060013361 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060013362
13363 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070013364 VkImage srcImage;
13365 VkImage dstImage;
13366 VkDeviceMemory srcMem;
13367 VkDeviceMemory destMem;
13368 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060013369
13370 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013371 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13372 image_create_info.pNext = NULL;
13373 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13374 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
13375 image_create_info.extent.width = 32;
13376 image_create_info.extent.height = 32;
13377 image_create_info.extent.depth = 1;
13378 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013379 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070013380 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13381 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
13382 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13383 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013384
Karl Schultz6addd812016-02-02 17:17:23 -070013385 err =
13386 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013387 ASSERT_VK_SUCCESS(err);
13388
Karl Schultz6addd812016-02-02 17:17:23 -070013389 err =
13390 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013391 ASSERT_VK_SUCCESS(err);
13392
13393 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013394 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013395 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13396 memAlloc.pNext = NULL;
13397 memAlloc.allocationSize = 0;
13398 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013399
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060013400 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060013401 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070013402 pass =
13403 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060013404 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013405 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060013406 ASSERT_VK_SUCCESS(err);
13407
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013408 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060013409 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070013410 pass =
13411 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060013412 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013413 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060013414 ASSERT_VK_SUCCESS(err);
13415
13416 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
13417 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013418 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060013419 ASSERT_VK_SUCCESS(err);
13420
13421 BeginCommandBuffer();
13422 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080013423 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060013424 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060013425 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013426 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060013427 copyRegion.srcOffset.x = 0;
13428 copyRegion.srcOffset.y = 0;
13429 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080013430 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013431 copyRegion.dstSubresource.mipLevel = 0;
13432 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013433 // Introduce failure by forcing the dst layerCount to differ from src
13434 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013435 copyRegion.dstOffset.x = 0;
13436 copyRegion.dstOffset.y = 0;
13437 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013438 copyRegion.extent.width = 1;
13439 copyRegion.extent.height = 1;
13440 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070013441 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
13442 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060013443 EndCommandBuffer();
13444
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013445 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060013446
Chia-I Wuf7458c52015-10-26 21:10:41 +080013447 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013448 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080013449 vkFreeMemory(m_device->device(), srcMem, NULL);
13450 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060013451}
13452
Tony Barbourd6673642016-05-05 14:46:39 -060013453TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
13454
13455 TEST_DESCRIPTION("Creating images with unsuported formats ");
13456
13457 ASSERT_NO_FATAL_FAILURE(InitState());
13458 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13459 VkImageObj image(m_device);
13460 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
13461 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
13462 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
13463 VK_IMAGE_TILING_OPTIMAL, 0);
13464 ASSERT_TRUE(image.initialized());
13465
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013466 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
13467 VkImageCreateInfo image_create_info;
13468 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13469 image_create_info.pNext = NULL;
13470 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13471 image_create_info.format = VK_FORMAT_UNDEFINED;
13472 image_create_info.extent.width = 32;
13473 image_create_info.extent.height = 32;
13474 image_create_info.extent.depth = 1;
13475 image_create_info.mipLevels = 1;
13476 image_create_info.arrayLayers = 1;
13477 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13478 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
13479 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13480 image_create_info.flags = 0;
13481
13482 m_errorMonitor->SetDesiredFailureMsg(
13483 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13484 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
13485
13486 VkImage localImage;
13487 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
13488 m_errorMonitor->VerifyFound();
13489
Tony Barbourd6673642016-05-05 14:46:39 -060013490 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013491 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060013492 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
13493 VkFormat format = static_cast<VkFormat>(f);
13494 VkFormatProperties fProps = m_device->format_properties(format);
13495 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
13496 fProps.optimalTilingFeatures == 0) {
13497 unsupported = format;
13498 break;
13499 }
13500 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013501
Tony Barbourd6673642016-05-05 14:46:39 -060013502 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060013503 image_create_info.format = unsupported;
Tony Barbourd6673642016-05-05 14:46:39 -060013504 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013505 "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060013506
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013507 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060013508 m_errorMonitor->VerifyFound();
13509 }
13510}
13511
13512TEST_F(VkLayerTest, ImageLayerViewTests) {
13513 VkResult ret;
13514 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
13515
13516 ASSERT_NO_FATAL_FAILURE(InitState());
13517
13518 VkImageObj image(m_device);
13519 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
13520 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
13521 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
13522 VK_IMAGE_TILING_OPTIMAL, 0);
13523 ASSERT_TRUE(image.initialized());
13524
13525 VkImageView imgView;
13526 VkImageViewCreateInfo imgViewInfo = {};
13527 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13528 imgViewInfo.image = image.handle();
13529 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
13530 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
13531 imgViewInfo.subresourceRange.layerCount = 1;
13532 imgViewInfo.subresourceRange.baseMipLevel = 0;
13533 imgViewInfo.subresourceRange.levelCount = 1;
13534 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13535
13536 m_errorMonitor->SetDesiredFailureMsg(
13537 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13538 "vkCreateImageView called with baseMipLevel");
13539 // View can't have baseMipLevel >= image's mipLevels - Expect
13540 // VIEW_CREATE_ERROR
13541 imgViewInfo.subresourceRange.baseMipLevel = 1;
13542 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13543 m_errorMonitor->VerifyFound();
13544 imgViewInfo.subresourceRange.baseMipLevel = 0;
13545
13546 m_errorMonitor->SetDesiredFailureMsg(
13547 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13548 "vkCreateImageView called with baseArrayLayer");
13549 // View can't have baseArrayLayer >= image's arraySize - Expect
13550 // VIEW_CREATE_ERROR
13551 imgViewInfo.subresourceRange.baseArrayLayer = 1;
13552 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13553 m_errorMonitor->VerifyFound();
13554 imgViewInfo.subresourceRange.baseArrayLayer = 0;
13555
13556 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13557 "vkCreateImageView called with 0 in "
13558 "pCreateInfo->subresourceRange."
13559 "levelCount");
13560 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
13561 imgViewInfo.subresourceRange.levelCount = 0;
13562 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13563 m_errorMonitor->VerifyFound();
13564 imgViewInfo.subresourceRange.levelCount = 1;
13565
13566 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13567 "vkCreateImageView called with 0 in "
13568 "pCreateInfo->subresourceRange."
13569 "layerCount");
13570 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
13571 imgViewInfo.subresourceRange.layerCount = 0;
13572 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13573 m_errorMonitor->VerifyFound();
13574 imgViewInfo.subresourceRange.layerCount = 1;
13575
13576 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13577 "but both must be color formats");
13578 // Can't use depth format for view into color image - Expect INVALID_FORMAT
13579 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
13580 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13581 m_errorMonitor->VerifyFound();
13582 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
13583
13584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13585 "Formats MUST be IDENTICAL unless "
13586 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
13587 "was set on image creation.");
13588 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
13589 // VIEW_CREATE_ERROR
13590 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
13591 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13592 m_errorMonitor->VerifyFound();
13593 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
13594
13595 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13596 "can support ImageViews with "
13597 "differing formats but they must be "
13598 "in the same compatibility class.");
13599 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
13600 // VIEW_CREATE_ERROR
13601 VkImageCreateInfo mutImgInfo = image.create_info();
13602 VkImage mutImage;
13603 mutImgInfo.format = VK_FORMAT_R8_UINT;
13604 assert(
13605 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
13606 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
13607 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
13608 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
13609 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
13610 ASSERT_VK_SUCCESS(ret);
13611 imgViewInfo.image = mutImage;
13612 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13613 m_errorMonitor->VerifyFound();
13614 imgViewInfo.image = image.handle();
13615 vkDestroyImage(m_device->handle(), mutImage, NULL);
13616}
13617
13618TEST_F(VkLayerTest, MiscImageLayerTests) {
13619
13620 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
13621
13622 ASSERT_NO_FATAL_FAILURE(InitState());
13623
13624 VkImageObj image(m_device);
13625 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
13626 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
13627 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
13628 VK_IMAGE_TILING_OPTIMAL, 0);
13629 ASSERT_TRUE(image.initialized());
13630
13631 m_errorMonitor->SetDesiredFailureMsg(
13632 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13633 "number of layers in image subresource is zero");
13634 vk_testing::Buffer buffer;
13635 VkMemoryPropertyFlags reqs = 0;
13636 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
13637 VkBufferImageCopy region = {};
13638 region.bufferRowLength = 128;
13639 region.bufferImageHeight = 128;
13640 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13641 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
13642 region.imageSubresource.layerCount = 0;
13643 region.imageExtent.height = 4;
13644 region.imageExtent.width = 4;
13645 region.imageExtent.depth = 1;
13646 m_commandBuffer->BeginCommandBuffer();
13647 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
13648 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
13649 1, &region);
13650 m_errorMonitor->VerifyFound();
13651 region.imageSubresource.layerCount = 1;
13652
13653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13654 "aspectMasks for each region must "
13655 "specify only COLOR or DEPTH or "
13656 "STENCIL");
13657 // Expect MISMATCHED_IMAGE_ASPECT
13658 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
13659 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
13660 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
13661 1, &region);
13662 m_errorMonitor->VerifyFound();
13663 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13664
13665 m_errorMonitor->SetDesiredFailureMsg(
13666 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13667 "If the format of srcImage is a depth, stencil, depth stencil or "
13668 "integer-based format then filter must be VK_FILTER_NEAREST");
13669 // Expect INVALID_FILTER
13670 VkImageObj intImage1(m_device);
13671 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
13672 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
13673 0);
13674 VkImageObj intImage2(m_device);
13675 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
13676 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
13677 0);
13678 VkImageBlit blitRegion = {};
13679 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13680 blitRegion.srcSubresource.baseArrayLayer = 0;
13681 blitRegion.srcSubresource.layerCount = 1;
13682 blitRegion.srcSubresource.mipLevel = 0;
13683 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13684 blitRegion.dstSubresource.baseArrayLayer = 0;
13685 blitRegion.dstSubresource.layerCount = 1;
13686 blitRegion.dstSubresource.mipLevel = 0;
13687
13688 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
13689 intImage1.layout(), intImage2.handle(), intImage2.layout(),
13690 16, &blitRegion, VK_FILTER_LINEAR);
13691 m_errorMonitor->VerifyFound();
13692
13693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13694 "called with 0 in ppMemoryBarriers");
13695 VkImageMemoryBarrier img_barrier;
13696 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
13697 img_barrier.pNext = NULL;
13698 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
13699 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
13700 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
13701 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
13702 img_barrier.image = image.handle();
13703 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
13704 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
13705 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13706 img_barrier.subresourceRange.baseArrayLayer = 0;
13707 img_barrier.subresourceRange.baseMipLevel = 0;
13708 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
13709 img_barrier.subresourceRange.layerCount = 0;
13710 img_barrier.subresourceRange.levelCount = 1;
13711 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
13712 VK_PIPELINE_STAGE_HOST_BIT,
13713 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
13714 nullptr, 1, &img_barrier);
13715 m_errorMonitor->VerifyFound();
13716 img_barrier.subresourceRange.layerCount = 1;
13717}
13718
13719TEST_F(VkLayerTest, ImageFormatLimits) {
13720
13721 TEST_DESCRIPTION("Exceed the limits of image format ");
13722
13723 m_errorMonitor->SetDesiredFailureMsg(
13724 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13725 "CreateImage extents exceed allowable limits for format");
13726 VkImageCreateInfo image_create_info = {};
13727 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13728 image_create_info.pNext = NULL;
13729 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13730 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
13731 image_create_info.extent.width = 32;
13732 image_create_info.extent.height = 32;
13733 image_create_info.extent.depth = 1;
13734 image_create_info.mipLevels = 1;
13735 image_create_info.arrayLayers = 1;
13736 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13737 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13738 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13739 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
13740 image_create_info.flags = 0;
13741
13742 VkImage nullImg;
13743 VkImageFormatProperties imgFmtProps;
13744 vkGetPhysicalDeviceImageFormatProperties(
13745 gpu(), image_create_info.format, image_create_info.imageType,
13746 image_create_info.tiling, image_create_info.usage,
13747 image_create_info.flags, &imgFmtProps);
13748 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
13749 // Expect INVALID_FORMAT_LIMITS_VIOLATION
13750 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13751 m_errorMonitor->VerifyFound();
13752 image_create_info.extent.depth = 1;
13753
13754 m_errorMonitor->SetDesiredFailureMsg(
13755 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13756 "exceeds allowable maximum supported by format of");
13757 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
13758 // Expect INVALID_FORMAT_LIMITS_VIOLATION
13759 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13760 m_errorMonitor->VerifyFound();
13761 image_create_info.mipLevels = 1;
13762
13763 m_errorMonitor->SetDesiredFailureMsg(
13764 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13765 "exceeds allowable maximum supported by format of");
13766 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
13767 // Expect INVALID_FORMAT_LIMITS_VIOLATION
13768 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13769 m_errorMonitor->VerifyFound();
13770 image_create_info.arrayLayers = 1;
13771
13772 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13773 "is not supported by format");
13774 int samples = imgFmtProps.sampleCounts >> 1;
13775 image_create_info.samples = (VkSampleCountFlagBits)samples;
13776 // Expect INVALID_FORMAT_LIMITS_VIOLATION
13777 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13778 m_errorMonitor->VerifyFound();
13779 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13780
13781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13782 "pCreateInfo->initialLayout, must be "
13783 "VK_IMAGE_LAYOUT_UNDEFINED or "
13784 "VK_IMAGE_LAYOUT_PREINITIALIZED");
13785 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
13786 // Expect INVALID_LAYOUT
13787 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13788 m_errorMonitor->VerifyFound();
13789 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
13790}
13791
Karl Schultz6addd812016-02-02 17:17:23 -070013792TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060013793 VkResult err;
13794 bool pass;
13795
13796 // Create color images with different format sizes and try to copy between them
13797 m_errorMonitor->SetDesiredFailureMsg(
13798 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13799 "vkCmdCopyImage called with unmatched source and dest image format sizes");
13800
13801 ASSERT_NO_FATAL_FAILURE(InitState());
13802
13803 // Create two images of different types and try to copy between them
13804 VkImage srcImage;
13805 VkImage dstImage;
13806 VkDeviceMemory srcMem;
13807 VkDeviceMemory destMem;
13808 VkMemoryRequirements memReqs;
13809
13810 VkImageCreateInfo image_create_info = {};
13811 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13812 image_create_info.pNext = NULL;
13813 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13814 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
13815 image_create_info.extent.width = 32;
13816 image_create_info.extent.height = 32;
13817 image_create_info.extent.depth = 1;
13818 image_create_info.mipLevels = 1;
13819 image_create_info.arrayLayers = 1;
13820 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13821 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13822 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13823 image_create_info.flags = 0;
13824
13825 err =
13826 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
13827 ASSERT_VK_SUCCESS(err);
13828
13829 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
13830 // Introduce failure by creating second image with a different-sized format.
13831 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
13832
13833 err =
13834 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
13835 ASSERT_VK_SUCCESS(err);
13836
13837 // Allocate memory
13838 VkMemoryAllocateInfo memAlloc = {};
13839 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13840 memAlloc.pNext = NULL;
13841 memAlloc.allocationSize = 0;
13842 memAlloc.memoryTypeIndex = 0;
13843
13844 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
13845 memAlloc.allocationSize = memReqs.size;
13846 pass =
13847 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
13848 ASSERT_TRUE(pass);
13849 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
13850 ASSERT_VK_SUCCESS(err);
13851
13852 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
13853 memAlloc.allocationSize = memReqs.size;
13854 pass =
13855 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
13856 ASSERT_TRUE(pass);
13857 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
13858 ASSERT_VK_SUCCESS(err);
13859
13860 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
13861 ASSERT_VK_SUCCESS(err);
13862 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
13863 ASSERT_VK_SUCCESS(err);
13864
13865 BeginCommandBuffer();
13866 VkImageCopy copyRegion;
13867 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13868 copyRegion.srcSubresource.mipLevel = 0;
13869 copyRegion.srcSubresource.baseArrayLayer = 0;
13870 copyRegion.srcSubresource.layerCount = 0;
13871 copyRegion.srcOffset.x = 0;
13872 copyRegion.srcOffset.y = 0;
13873 copyRegion.srcOffset.z = 0;
13874 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13875 copyRegion.dstSubresource.mipLevel = 0;
13876 copyRegion.dstSubresource.baseArrayLayer = 0;
13877 copyRegion.dstSubresource.layerCount = 0;
13878 copyRegion.dstOffset.x = 0;
13879 copyRegion.dstOffset.y = 0;
13880 copyRegion.dstOffset.z = 0;
13881 copyRegion.extent.width = 1;
13882 copyRegion.extent.height = 1;
13883 copyRegion.extent.depth = 1;
13884 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
13885 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
13886 EndCommandBuffer();
13887
13888 m_errorMonitor->VerifyFound();
13889
13890 vkDestroyImage(m_device->device(), srcImage, NULL);
13891 vkDestroyImage(m_device->device(), dstImage, NULL);
13892 vkFreeMemory(m_device->device(), srcMem, NULL);
13893 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060013894}
13895
Karl Schultz6addd812016-02-02 17:17:23 -070013896TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
13897 VkResult err;
13898 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060013899
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013900 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070013901 m_errorMonitor->SetDesiredFailureMsg(
13902 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013903 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013904
Mike Stroyana3082432015-09-25 13:39:21 -060013905 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060013906
13907 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070013908 VkImage srcImage;
13909 VkImage dstImage;
13910 VkDeviceMemory srcMem;
13911 VkDeviceMemory destMem;
13912 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060013913
13914 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013915 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13916 image_create_info.pNext = NULL;
13917 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13918 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
13919 image_create_info.extent.width = 32;
13920 image_create_info.extent.height = 32;
13921 image_create_info.extent.depth = 1;
13922 image_create_info.mipLevels = 1;
13923 image_create_info.arrayLayers = 1;
13924 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13925 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13926 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13927 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013928
Karl Schultz6addd812016-02-02 17:17:23 -070013929 err =
13930 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013931 ASSERT_VK_SUCCESS(err);
13932
Karl Schultzbdb75952016-04-19 11:36:49 -060013933 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
13934
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013935 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070013936 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013937 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
13938 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060013939
Karl Schultz6addd812016-02-02 17:17:23 -070013940 err =
13941 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013942 ASSERT_VK_SUCCESS(err);
13943
13944 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013945 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013946 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13947 memAlloc.pNext = NULL;
13948 memAlloc.allocationSize = 0;
13949 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013950
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060013951 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060013952 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070013953 pass =
13954 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060013955 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013956 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060013957 ASSERT_VK_SUCCESS(err);
13958
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013959 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060013960 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070013961 pass =
13962 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060013963 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013964 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060013965 ASSERT_VK_SUCCESS(err);
13966
13967 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
13968 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013969 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060013970 ASSERT_VK_SUCCESS(err);
13971
13972 BeginCommandBuffer();
13973 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080013974 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060013975 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060013976 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013977 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013978 copyRegion.srcOffset.x = 0;
13979 copyRegion.srcOffset.y = 0;
13980 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080013981 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013982 copyRegion.dstSubresource.mipLevel = 0;
13983 copyRegion.dstSubresource.baseArrayLayer = 0;
13984 copyRegion.dstSubresource.layerCount = 0;
13985 copyRegion.dstOffset.x = 0;
13986 copyRegion.dstOffset.y = 0;
13987 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013988 copyRegion.extent.width = 1;
13989 copyRegion.extent.height = 1;
13990 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070013991 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
13992 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060013993 EndCommandBuffer();
13994
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013995 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060013996
Chia-I Wuf7458c52015-10-26 21:10:41 +080013997 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013998 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080013999 vkFreeMemory(m_device->device(), srcMem, NULL);
14000 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014001}
14002
Karl Schultz6addd812016-02-02 17:17:23 -070014003TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
14004 VkResult err;
14005 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014006
Karl Schultz6addd812016-02-02 17:17:23 -070014007 m_errorMonitor->SetDesiredFailureMsg(
14008 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014009 "vkCmdResolveImage called with source sample count less than 2.");
14010
Mike Stroyana3082432015-09-25 13:39:21 -060014011 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014012
14013 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070014014 VkImage srcImage;
14015 VkImage dstImage;
14016 VkDeviceMemory srcMem;
14017 VkDeviceMemory destMem;
14018 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014019
14020 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014021 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14022 image_create_info.pNext = NULL;
14023 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14024 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14025 image_create_info.extent.width = 32;
14026 image_create_info.extent.height = 1;
14027 image_create_info.extent.depth = 1;
14028 image_create_info.mipLevels = 1;
14029 image_create_info.arrayLayers = 1;
14030 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14031 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14032 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14033 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014034
Karl Schultz6addd812016-02-02 17:17:23 -070014035 err =
14036 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014037 ASSERT_VK_SUCCESS(err);
14038
Karl Schultz6addd812016-02-02 17:17:23 -070014039 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014040
Karl Schultz6addd812016-02-02 17:17:23 -070014041 err =
14042 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014043 ASSERT_VK_SUCCESS(err);
14044
14045 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014046 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014047 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14048 memAlloc.pNext = NULL;
14049 memAlloc.allocationSize = 0;
14050 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014051
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014052 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014053 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014054 pass =
14055 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014056 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014057 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014058 ASSERT_VK_SUCCESS(err);
14059
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014060 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014061 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014062 pass =
14063 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014064 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014065 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014066 ASSERT_VK_SUCCESS(err);
14067
14068 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14069 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014070 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014071 ASSERT_VK_SUCCESS(err);
14072
14073 BeginCommandBuffer();
14074 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014075 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14076 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014077 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014078 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014079 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014080 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014081 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014082 resolveRegion.srcOffset.x = 0;
14083 resolveRegion.srcOffset.y = 0;
14084 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014085 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014086 resolveRegion.dstSubresource.mipLevel = 0;
14087 resolveRegion.dstSubresource.baseArrayLayer = 0;
14088 resolveRegion.dstSubresource.layerCount = 0;
14089 resolveRegion.dstOffset.x = 0;
14090 resolveRegion.dstOffset.y = 0;
14091 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014092 resolveRegion.extent.width = 1;
14093 resolveRegion.extent.height = 1;
14094 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014095 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14096 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014097 EndCommandBuffer();
14098
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014099 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014100
Chia-I Wuf7458c52015-10-26 21:10:41 +080014101 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014102 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014103 vkFreeMemory(m_device->device(), srcMem, NULL);
14104 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014105}
14106
Karl Schultz6addd812016-02-02 17:17:23 -070014107TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
14108 VkResult err;
14109 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014110
Karl Schultz6addd812016-02-02 17:17:23 -070014111 m_errorMonitor->SetDesiredFailureMsg(
14112 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014113 "vkCmdResolveImage called with dest sample count greater than 1.");
14114
Mike Stroyana3082432015-09-25 13:39:21 -060014115 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014116
Chris Forbesa7530692016-05-08 12:35:39 +120014117 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070014118 VkImage srcImage;
14119 VkImage dstImage;
14120 VkDeviceMemory srcMem;
14121 VkDeviceMemory destMem;
14122 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014123
14124 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014125 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14126 image_create_info.pNext = NULL;
14127 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14128 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14129 image_create_info.extent.width = 32;
14130 image_create_info.extent.height = 1;
14131 image_create_info.extent.depth = 1;
14132 image_create_info.mipLevels = 1;
14133 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120014134 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070014135 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14136 // Note: Some implementations expect color attachment usage for any
14137 // multisample surface
14138 image_create_info.usage =
14139 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14140 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014141
Karl Schultz6addd812016-02-02 17:17:23 -070014142 err =
14143 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014144 ASSERT_VK_SUCCESS(err);
14145
Karl Schultz6addd812016-02-02 17:17:23 -070014146 // Note: Some implementations expect color attachment usage for any
14147 // multisample surface
14148 image_create_info.usage =
14149 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014150
Karl Schultz6addd812016-02-02 17:17:23 -070014151 err =
14152 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014153 ASSERT_VK_SUCCESS(err);
14154
14155 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014156 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014157 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14158 memAlloc.pNext = NULL;
14159 memAlloc.allocationSize = 0;
14160 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014161
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014162 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014163 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014164 pass =
14165 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014166 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014167 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014168 ASSERT_VK_SUCCESS(err);
14169
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014170 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014171 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014172 pass =
14173 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014174 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014175 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014176 ASSERT_VK_SUCCESS(err);
14177
14178 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14179 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014180 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014181 ASSERT_VK_SUCCESS(err);
14182
14183 BeginCommandBuffer();
14184 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014185 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14186 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014187 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014188 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014189 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014190 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014191 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014192 resolveRegion.srcOffset.x = 0;
14193 resolveRegion.srcOffset.y = 0;
14194 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014195 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014196 resolveRegion.dstSubresource.mipLevel = 0;
14197 resolveRegion.dstSubresource.baseArrayLayer = 0;
14198 resolveRegion.dstSubresource.layerCount = 0;
14199 resolveRegion.dstOffset.x = 0;
14200 resolveRegion.dstOffset.y = 0;
14201 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014202 resolveRegion.extent.width = 1;
14203 resolveRegion.extent.height = 1;
14204 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014205 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14206 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014207 EndCommandBuffer();
14208
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014209 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014210
Chia-I Wuf7458c52015-10-26 21:10:41 +080014211 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014212 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014213 vkFreeMemory(m_device->device(), srcMem, NULL);
14214 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014215}
14216
Karl Schultz6addd812016-02-02 17:17:23 -070014217TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
14218 VkResult err;
14219 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014220
Karl Schultz6addd812016-02-02 17:17:23 -070014221 m_errorMonitor->SetDesiredFailureMsg(
14222 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014223 "vkCmdResolveImage called with unmatched source and dest formats.");
14224
Mike Stroyana3082432015-09-25 13:39:21 -060014225 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014226
14227 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014228 VkImage srcImage;
14229 VkImage dstImage;
14230 VkDeviceMemory srcMem;
14231 VkDeviceMemory destMem;
14232 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014233
14234 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014235 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14236 image_create_info.pNext = NULL;
14237 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14238 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14239 image_create_info.extent.width = 32;
14240 image_create_info.extent.height = 1;
14241 image_create_info.extent.depth = 1;
14242 image_create_info.mipLevels = 1;
14243 image_create_info.arrayLayers = 1;
14244 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
14245 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14246 // Note: Some implementations expect color attachment usage for any
14247 // multisample surface
14248 image_create_info.usage =
14249 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14250 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014251
Karl Schultz6addd812016-02-02 17:17:23 -070014252 err =
14253 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014254 ASSERT_VK_SUCCESS(err);
14255
Karl Schultz6addd812016-02-02 17:17:23 -070014256 // Set format to something other than source image
14257 image_create_info.format = VK_FORMAT_R32_SFLOAT;
14258 // Note: Some implementations expect color attachment usage for any
14259 // multisample surface
14260 image_create_info.usage =
14261 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14262 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014263
Karl Schultz6addd812016-02-02 17:17:23 -070014264 err =
14265 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014266 ASSERT_VK_SUCCESS(err);
14267
14268 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014269 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014270 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14271 memAlloc.pNext = NULL;
14272 memAlloc.allocationSize = 0;
14273 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014274
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014275 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014276 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014277 pass =
14278 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014279 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014280 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014281 ASSERT_VK_SUCCESS(err);
14282
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014283 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014284 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014285 pass =
14286 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014287 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014288 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014289 ASSERT_VK_SUCCESS(err);
14290
14291 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14292 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014293 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014294 ASSERT_VK_SUCCESS(err);
14295
14296 BeginCommandBuffer();
14297 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014298 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14299 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014300 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014301 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014302 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014303 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014304 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014305 resolveRegion.srcOffset.x = 0;
14306 resolveRegion.srcOffset.y = 0;
14307 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014308 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014309 resolveRegion.dstSubresource.mipLevel = 0;
14310 resolveRegion.dstSubresource.baseArrayLayer = 0;
14311 resolveRegion.dstSubresource.layerCount = 0;
14312 resolveRegion.dstOffset.x = 0;
14313 resolveRegion.dstOffset.y = 0;
14314 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014315 resolveRegion.extent.width = 1;
14316 resolveRegion.extent.height = 1;
14317 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014318 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14319 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014320 EndCommandBuffer();
14321
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014322 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014323
Chia-I Wuf7458c52015-10-26 21:10:41 +080014324 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014325 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014326 vkFreeMemory(m_device->device(), srcMem, NULL);
14327 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014328}
14329
Karl Schultz6addd812016-02-02 17:17:23 -070014330TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
14331 VkResult err;
14332 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014333
Karl Schultz6addd812016-02-02 17:17:23 -070014334 m_errorMonitor->SetDesiredFailureMsg(
14335 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014336 "vkCmdResolveImage called with unmatched source and dest image types.");
14337
Mike Stroyana3082432015-09-25 13:39:21 -060014338 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014339
14340 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014341 VkImage srcImage;
14342 VkImage dstImage;
14343 VkDeviceMemory srcMem;
14344 VkDeviceMemory destMem;
14345 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014346
14347 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014348 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14349 image_create_info.pNext = NULL;
14350 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14351 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14352 image_create_info.extent.width = 32;
14353 image_create_info.extent.height = 1;
14354 image_create_info.extent.depth = 1;
14355 image_create_info.mipLevels = 1;
14356 image_create_info.arrayLayers = 1;
14357 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
14358 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14359 // Note: Some implementations expect color attachment usage for any
14360 // multisample surface
14361 image_create_info.usage =
14362 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14363 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014364
Karl Schultz6addd812016-02-02 17:17:23 -070014365 err =
14366 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014367 ASSERT_VK_SUCCESS(err);
14368
Karl Schultz6addd812016-02-02 17:17:23 -070014369 image_create_info.imageType = VK_IMAGE_TYPE_1D;
14370 // Note: Some implementations expect color attachment usage for any
14371 // multisample surface
14372 image_create_info.usage =
14373 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14374 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014375
Karl Schultz6addd812016-02-02 17:17:23 -070014376 err =
14377 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014378 ASSERT_VK_SUCCESS(err);
14379
14380 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014381 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014382 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14383 memAlloc.pNext = NULL;
14384 memAlloc.allocationSize = 0;
14385 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014386
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014387 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014388 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014389 pass =
14390 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014391 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014392 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014393 ASSERT_VK_SUCCESS(err);
14394
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014395 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014396 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014397 pass =
14398 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014399 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014400 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014401 ASSERT_VK_SUCCESS(err);
14402
14403 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14404 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014405 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014406 ASSERT_VK_SUCCESS(err);
14407
14408 BeginCommandBuffer();
14409 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014410 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14411 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014412 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014413 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014414 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014415 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014416 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014417 resolveRegion.srcOffset.x = 0;
14418 resolveRegion.srcOffset.y = 0;
14419 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014420 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014421 resolveRegion.dstSubresource.mipLevel = 0;
14422 resolveRegion.dstSubresource.baseArrayLayer = 0;
14423 resolveRegion.dstSubresource.layerCount = 0;
14424 resolveRegion.dstOffset.x = 0;
14425 resolveRegion.dstOffset.y = 0;
14426 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014427 resolveRegion.extent.width = 1;
14428 resolveRegion.extent.height = 1;
14429 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014430 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14431 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014432 EndCommandBuffer();
14433
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014434 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014435
Chia-I Wuf7458c52015-10-26 21:10:41 +080014436 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014437 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014438 vkFreeMemory(m_device->device(), srcMem, NULL);
14439 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014440}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014441
Karl Schultz6addd812016-02-02 17:17:23 -070014442TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014443 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070014444 // to using a DS format, then cause it to hit error due to COLOR_BIT not
14445 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014446 // The image format check comes 2nd in validation so we trigger it first,
14447 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070014448 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014449
Karl Schultz6addd812016-02-02 17:17:23 -070014450 m_errorMonitor->SetDesiredFailureMsg(
14451 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014452 "Combination depth/stencil image formats can have only the ");
14453
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014454 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014455
Chia-I Wu1b99bb22015-10-27 19:25:11 +080014456 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014457 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
14458 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014459
14460 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014461 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14462 ds_pool_ci.pNext = NULL;
14463 ds_pool_ci.maxSets = 1;
14464 ds_pool_ci.poolSizeCount = 1;
14465 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014466
14467 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070014468 err =
14469 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014470 ASSERT_VK_SUCCESS(err);
14471
14472 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014473 dsl_binding.binding = 0;
14474 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
14475 dsl_binding.descriptorCount = 1;
14476 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
14477 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014478
14479 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014480 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14481 ds_layout_ci.pNext = NULL;
14482 ds_layout_ci.bindingCount = 1;
14483 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014484 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070014485 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
14486 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014487 ASSERT_VK_SUCCESS(err);
14488
14489 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014490 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080014491 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070014492 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014493 alloc_info.descriptorPool = ds_pool;
14494 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070014495 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
14496 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014497 ASSERT_VK_SUCCESS(err);
14498
Karl Schultz6addd812016-02-02 17:17:23 -070014499 VkImage image_bad;
14500 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014501 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060014502 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014503 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070014504 const int32_t tex_width = 32;
14505 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014506
14507 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014508 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14509 image_create_info.pNext = NULL;
14510 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14511 image_create_info.format = tex_format_bad;
14512 image_create_info.extent.width = tex_width;
14513 image_create_info.extent.height = tex_height;
14514 image_create_info.extent.depth = 1;
14515 image_create_info.mipLevels = 1;
14516 image_create_info.arrayLayers = 1;
14517 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14518 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14519 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
14520 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
14521 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014522
Karl Schultz6addd812016-02-02 17:17:23 -070014523 err =
14524 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014525 ASSERT_VK_SUCCESS(err);
14526 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070014527 image_create_info.usage =
14528 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14529 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
14530 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014531 ASSERT_VK_SUCCESS(err);
14532
14533 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014534 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14535 image_view_create_info.image = image_bad;
14536 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14537 image_view_create_info.format = tex_format_bad;
14538 image_view_create_info.subresourceRange.baseArrayLayer = 0;
14539 image_view_create_info.subresourceRange.baseMipLevel = 0;
14540 image_view_create_info.subresourceRange.layerCount = 1;
14541 image_view_create_info.subresourceRange.levelCount = 1;
14542 image_view_create_info.subresourceRange.aspectMask =
14543 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014544
14545 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070014546 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
14547 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014548
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014549 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014550
Chia-I Wuf7458c52015-10-26 21:10:41 +080014551 vkDestroyImage(m_device->device(), image_bad, NULL);
14552 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014553 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
14554 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014555}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060014556
14557TEST_F(VkLayerTest, ClearImageErrors) {
14558 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
14559 "ClearDepthStencilImage with a color image.");
14560
14561 ASSERT_NO_FATAL_FAILURE(InitState());
14562 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14563
14564 // Renderpass is started here so end it as Clear cmds can't be in renderpass
14565 BeginCommandBuffer();
14566 m_commandBuffer->EndRenderPass();
14567
14568 // Color image
14569 VkClearColorValue clear_color;
14570 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
14571 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
14572 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
14573 const int32_t img_width = 32;
14574 const int32_t img_height = 32;
14575 VkImageCreateInfo image_create_info = {};
14576 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14577 image_create_info.pNext = NULL;
14578 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14579 image_create_info.format = color_format;
14580 image_create_info.extent.width = img_width;
14581 image_create_info.extent.height = img_height;
14582 image_create_info.extent.depth = 1;
14583 image_create_info.mipLevels = 1;
14584 image_create_info.arrayLayers = 1;
14585 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14586 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14587 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14588
14589 vk_testing::Image color_image;
14590 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info,
14591 reqs);
14592
14593 const VkImageSubresourceRange color_range =
14594 vk_testing::Image::subresource_range(image_create_info,
14595 VK_IMAGE_ASPECT_COLOR_BIT);
14596
14597 // Depth/Stencil image
14598 VkClearDepthStencilValue clear_value = {0};
14599 reqs = 0; // don't need HOST_VISIBLE DS image
14600 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
14601 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
14602 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
14603 ds_image_create_info.extent.width = 64;
14604 ds_image_create_info.extent.height = 64;
14605 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14606 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
14607
14608 vk_testing::Image ds_image;
14609 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info,
14610 reqs);
14611
14612 const VkImageSubresourceRange ds_range =
14613 vk_testing::Image::subresource_range(ds_image_create_info,
14614 VK_IMAGE_ASPECT_DEPTH_BIT);
14615
14616 m_errorMonitor->SetDesiredFailureMsg(
14617 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14618 "vkCmdClearColorImage called with depth/stencil image.");
14619
14620 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
14621 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
14622 &color_range);
14623
14624 m_errorMonitor->VerifyFound();
14625
Tony Barbour26434b92016-06-02 09:43:50 -060014626 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14627 "vkCmdClearColorImage called with "
14628 "image created without "
14629 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
14630
14631 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
14632 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
14633 &color_range);
14634
14635 m_errorMonitor->VerifyFound();
14636
Tobin Ehlis6e23d772016-05-19 11:08:34 -060014637 // Call CmdClearDepthStencilImage with color image
14638 m_errorMonitor->SetDesiredFailureMsg(
14639 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14640 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
14641
14642 vkCmdClearDepthStencilImage(
14643 m_commandBuffer->GetBufferHandle(), color_image.handle(),
14644 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
14645 &ds_range);
14646
14647 m_errorMonitor->VerifyFound();
14648}
Tobin Ehliscde08892015-09-22 10:11:37 -060014649#endif // IMAGE_TESTS
14650
Tony Barbour300a6082015-04-07 13:44:53 -060014651int main(int argc, char **argv) {
14652 int result;
14653
Cody Northrop8e54a402016-03-08 22:25:52 -070014654#ifdef ANDROID
14655 int vulkanSupport = InitVulkan();
14656 if (vulkanSupport == 0)
14657 return 1;
14658#endif
14659
Tony Barbour300a6082015-04-07 13:44:53 -060014660 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060014661 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060014662
14663 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
14664
14665 result = RUN_ALL_TESTS();
14666
Tony Barbour6918cd52015-04-09 12:58:51 -060014667 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060014668 return result;
14669}