blob: deb93cf8a158b0a574e045556a8ccedb19251869 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
20 */
Tony Barbour65c48b32015-11-17 10:02:56 -070021
Cody Northrop8e54a402016-03-08 22:25:52 -070022#ifdef ANDROID
23#include "vulkan_wrapper.h"
24#else
David Pinedo9316d3b2015-11-06 12:54:48 -070025#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070026#endif
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060027#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060028#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060029#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070030#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060031
Mark Lobodzinski3780e142015-05-14 15:08:13 -050032#define GLM_FORCE_RADIANS
33#include "glm/glm.hpp"
34#include <glm/gtc/matrix_transform.hpp>
35
Dustin Gravesffa90fa2016-05-06 11:20:38 -060036#define PARAMETER_VALIDATION_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060037#define MEM_TRACKER_TESTS 1
38#define OBJ_TRACKER_TESTS 1
39#define DRAW_STATE_TESTS 1
40#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120041#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060042#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060043#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060044
Mark Lobodzinski3780e142015-05-14 15:08:13 -050045//--------------------------------------------------------------------------------------
46// Mesh and VertexFormat Data
47//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070048struct Vertex {
49 float posX, posY, posZ, posW; // Position data
50 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050051};
52
Karl Schultz6addd812016-02-02 17:17:23 -070053#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050054
55typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070056 BsoFailNone = 0x00000000,
57 BsoFailLineWidth = 0x00000001,
58 BsoFailDepthBias = 0x00000002,
59 BsoFailViewport = 0x00000004,
60 BsoFailScissor = 0x00000008,
61 BsoFailBlend = 0x00000010,
62 BsoFailDepthBounds = 0x00000020,
63 BsoFailStencilReadMask = 0x00000040,
64 BsoFailStencilWriteMask = 0x00000080,
65 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060066 BsoFailCmdClearAttachments = 0x00000200,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050067} BsoFailSelect;
68
69struct vktriangle_vs_uniform {
70 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070071 float mvp[4][4];
72 float position[3][4];
73 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050074};
75
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050076static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120077 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070078 "vec2 vertices[3];\n"
79 "out gl_PerVertex {\n"
80 " vec4 gl_Position;\n"
81 "};\n"
82 "void main() {\n"
83 " vertices[0] = vec2(-1.0, -1.0);\n"
84 " vertices[1] = vec2( 1.0, -1.0);\n"
85 " vertices[2] = vec2( 0.0, 1.0);\n"
86 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
87 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050088
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050089static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120090 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070091 "\n"
92 "layout(location = 0) out vec4 uFragColor;\n"
93 "void main(){\n"
94 " uFragColor = vec4(0,1,0,1);\n"
95 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050096
Karl Schultz6addd812016-02-02 17:17:23 -070097static VKAPI_ATTR VkBool32 VKAPI_CALL
98myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
99 uint64_t srcObject, size_t location, int32_t msgCode,
100 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -0600101
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600102// ********************************************************
103// ErrorMonitor Usage:
104//
105// Call SetDesiredFailureMsg with a string to be compared against all
106// encountered log messages. Passing NULL will match all log messages.
107// logMsg will return true for skipCall only if msg is matched or NULL.
108//
109// Call DesiredMsgFound to determine if the desired failure message
110// was encountered.
111
Tony Barbour300a6082015-04-07 13:44:53 -0600112class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700113 public:
114 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600115 test_platform_thread_create_mutex(&m_mutex);
116 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700117 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700118 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600119 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600120 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600121
Dustin Graves48458142016-04-29 16:11:55 -0600122 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
123
Karl Schultz6addd812016-02-02 17:17:23 -0700124 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200125 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600126 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600127 m_failureMsg.clear();
128 m_otherMsgs.clear();
129 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700130 m_msgFound = VK_FALSE;
131 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600132 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600133 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600134
Karl Schultz6addd812016-02-02 17:17:23 -0700135 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600136 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600137 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600138 if (m_bailout != NULL) {
139 *m_bailout = true;
140 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600141 string errorString(msgString);
142 if (msgFlags & m_msgFlags) {
143 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200144 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
145 m_otherMsgs.push_back(m_failureMsg);
146 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600147 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700148 m_msgFound = VK_TRUE;
149 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600150 } else {
151 m_otherMsgs.push_back(errorString);
152 }
153 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600154 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600155 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600156 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600157
Karl Schultz6addd812016-02-02 17:17:23 -0700158 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600159
Karl Schultz6addd812016-02-02 17:17:23 -0700160 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600161
Karl Schultz6addd812016-02-02 17:17:23 -0700162 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600163
Karl Schultz6addd812016-02-02 17:17:23 -0700164 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600165
Karl Schultz6addd812016-02-02 17:17:23 -0700166 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600167 vector<string> otherMsgs = GetOtherFailureMsgs();
168 cout << "Other error messages logged for this test were:" << endl;
169 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
170 cout << " " << *iter << endl;
171 }
172 }
173
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200174 /* helpers */
175
176 void ExpectSuccess() {
177 // match anything
178 SetDesiredFailureMsg(~0u, "");
179 }
180
181 void VerifyFound() {
182 // Not seeing the desired message is a failure. /Before/ throwing, dump
183 // any other messages.
184 if (!DesiredMsgFound()) {
185 DumpFailureMsgs();
186 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
187 }
188 }
189
190 void VerifyNotFound() {
191 // ExpectSuccess() configured us to match anything. Any error is a
192 // failure.
193 if (DesiredMsgFound()) {
194 DumpFailureMsgs();
195 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
196 }
197 }
198
Karl Schultz6addd812016-02-02 17:17:23 -0700199 private:
200 VkFlags m_msgFlags;
201 string m_desiredMsg;
202 string m_failureMsg;
203 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600204 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700205 bool *m_bailout;
206 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600207};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500208
Karl Schultz6addd812016-02-02 17:17:23 -0700209static VKAPI_ATTR VkBool32 VKAPI_CALL
210myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
211 uint64_t srcObject, size_t location, int32_t msgCode,
212 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
213 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700214 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700215 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600216 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600217 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600218 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600219 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600220}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500221
Karl Schultz6addd812016-02-02 17:17:23 -0700222class VkLayerTest : public VkRenderFramework {
223 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800224 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
225 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700226 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
227 BsoFailSelect failMask);
228 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
229 VkPipelineObj &pipelineobj,
230 VkDescriptorSetObj &descriptorSet,
231 BsoFailSelect failMask);
232 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
233 VkDescriptorSetObj &descriptorSet,
234 BsoFailSelect failMask) {
235 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
236 failMask);
237 }
Tony Barbour300a6082015-04-07 13:44:53 -0600238
Tony Barbourfe3351b2015-07-28 10:17:20 -0600239 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700240 VkResult BeginCommandBuffer() {
241 return BeginCommandBuffer(*m_commandBuffer);
242 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800243 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700244 void Draw(uint32_t vertexCount, uint32_t instanceCount,
245 uint32_t firstVertex, uint32_t firstInstance) {
246 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
247 firstInstance);
248 }
249 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
250 uint32_t firstIndex, int32_t vertexOffset,
251 uint32_t firstInstance) {
252 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
253 vertexOffset, firstInstance);
254 }
Mark Muellerdfe37552016-07-07 14:47:42 -0600255 void QueueCommandBuffer(bool checkSuccess = true) {
256 m_commandBuffer->QueueCommandBuffer(checkSuccess); }
Karl Schultz6addd812016-02-02 17:17:23 -0700257 void QueueCommandBuffer(const VkFence &fence) {
258 m_commandBuffer->QueueCommandBuffer(fence);
259 }
260 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
261 VkDeviceSize offset, uint32_t binding) {
262 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
263 }
264 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
265 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
266 }
267
268 protected:
269 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600270 bool m_enableWSI;
Tony Barbour300a6082015-04-07 13:44:53 -0600271
272 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600273 std::vector<const char *> instance_layer_names;
274 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600275 std::vector<const char *> instance_extension_names;
276 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600277
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700278 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600279 /*
280 * Since CreateDbgMsgCallback is an instance level extension call
281 * any extension / layer that utilizes that feature also needs
282 * to be enabled at create instance time.
283 */
Karl Schultz6addd812016-02-02 17:17:23 -0700284 // Use Threading layer first to protect others from
285 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700286 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600287 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800288 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700289 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800290 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600291 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700292 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600293
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700294 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600295 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800296 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700297 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800298 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600299 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700300 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600301
Ian Elliott2c1daf52016-05-12 09:41:46 -0600302 if (m_enableWSI) {
303 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
304 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
305#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
306#if defined(VK_USE_PLATFORM_ANDROID_KHR)
307 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
308#endif // VK_USE_PLATFORM_ANDROID_KHR
309#if defined(VK_USE_PLATFORM_MIR_KHR)
310 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
311#endif // VK_USE_PLATFORM_MIR_KHR
312#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
313 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
314#endif // VK_USE_PLATFORM_WAYLAND_KHR
315#if defined(VK_USE_PLATFORM_WIN32_KHR)
316 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
317#endif // VK_USE_PLATFORM_WIN32_KHR
318#endif // NEED_TO_TEST_THIS_ON_PLATFORM
319#if defined(VK_USE_PLATFORM_XCB_KHR)
320 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
321#elif defined(VK_USE_PLATFORM_XLIB_KHR)
322 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
323#endif // VK_USE_PLATFORM_XLIB_KHR
324 }
325
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600326 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600327 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800328 this->app_info.pApplicationName = "layer_tests";
329 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600330 this->app_info.pEngineName = "unittest";
331 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600332 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600333
Tony Barbour15524c32015-04-29 17:34:29 -0600334 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600335 InitFramework(instance_layer_names, device_layer_names,
336 instance_extension_names, device_extension_names,
337 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600338 }
339
340 virtual void TearDown() {
341 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600342 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600343 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600344 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600345
346 VkLayerTest() {
347 m_enableWSI = false;
348 }
Tony Barbour300a6082015-04-07 13:44:53 -0600349};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500350
Karl Schultz6addd812016-02-02 17:17:23 -0700351VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600352 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600353
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800354 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600355
356 /*
357 * For render test all drawing happens in a single render pass
358 * on a single command buffer.
359 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200360 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800361 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600362 }
363
364 return result;
365}
366
Karl Schultz6addd812016-02-02 17:17:23 -0700367VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600368 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600369
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200370 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800371 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200372 }
Tony Barbour300a6082015-04-07 13:44:53 -0600373
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800374 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600375
376 return result;
377}
378
Karl Schultz6addd812016-02-02 17:17:23 -0700379void VkLayerTest::VKTriangleTest(const char *vertShaderText,
380 const char *fragShaderText,
381 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500382 // Create identity matrix
383 int i;
384 struct vktriangle_vs_uniform data;
385
386 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700387 glm::mat4 View = glm::mat4(1.0f);
388 glm::mat4 Model = glm::mat4(1.0f);
389 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500390 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700391 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500392
393 memcpy(&data.mvp, &MVP[0][0], matrixSize);
394
Karl Schultz6addd812016-02-02 17:17:23 -0700395 static const Vertex tri_data[] = {
396 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
397 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
398 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500399 };
400
Karl Schultz6addd812016-02-02 17:17:23 -0700401 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500402 data.position[i][0] = tri_data[i].posX;
403 data.position[i][1] = tri_data[i].posY;
404 data.position[i][2] = tri_data[i].posZ;
405 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700406 data.color[i][0] = tri_data[i].r;
407 data.color[i][1] = tri_data[i].g;
408 data.color[i][2] = tri_data[i].b;
409 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500410 }
411
412 ASSERT_NO_FATAL_FAILURE(InitState());
413 ASSERT_NO_FATAL_FAILURE(InitViewport());
414
Karl Schultz6addd812016-02-02 17:17:23 -0700415 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
416 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500417
Karl Schultz6addd812016-02-02 17:17:23 -0700418 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
419 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
420 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500421
422 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800423 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500424 pipelineobj.AddShader(&vs);
425 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600426 if (failMask & BsoFailLineWidth) {
427 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600428 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
429 ia_state.sType =
430 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
431 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
432 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600433 }
434 if (failMask & BsoFailDepthBias) {
435 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600436 VkPipelineRasterizationStateCreateInfo rs_state = {};
437 rs_state.sType =
438 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
439 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600440 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600441 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600442 }
Karl Schultz6addd812016-02-02 17:17:23 -0700443 // Viewport and scissors must stay in synch or other errors will occur than
444 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600445 if (failMask & BsoFailViewport) {
446 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600447 m_viewports.clear();
448 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600449 }
450 if (failMask & BsoFailScissor) {
451 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600452 m_scissors.clear();
453 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600454 }
455 if (failMask & BsoFailBlend) {
456 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600457 VkPipelineColorBlendAttachmentState att_state = {};
458 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
459 att_state.blendEnable = VK_TRUE;
460 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600461 }
462 if (failMask & BsoFailDepthBounds) {
463 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
464 }
465 if (failMask & BsoFailStencilReadMask) {
466 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
467 }
468 if (failMask & BsoFailStencilWriteMask) {
469 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
470 }
471 if (failMask & BsoFailStencilReference) {
472 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
473 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500474
475 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700476 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
477 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500478
479 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600480 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481
Tony Barbourfe3351b2015-07-28 10:17:20 -0600482 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500483
484 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600485 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500486
Mark Muellerd4914412016-06-13 17:52:06 -0600487 if (failMask & BsoFailCmdClearAttachments) {
488 VkClearAttachment color_attachment = {};
489 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
490 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
491 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
492
493 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
494 &color_attachment, 1, &clear_rect);
495 }
496
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500497 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600498 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500499
Tony Barbourfe3351b2015-07-28 10:17:20 -0600500 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500501}
502
Karl Schultz6addd812016-02-02 17:17:23 -0700503void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
504 VkPipelineObj &pipelineobj,
505 VkDescriptorSetObj &descriptorSet,
506 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500507 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700508 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
509 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500510 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700511 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
512 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500513 }
514
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800515 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700516 // Make sure depthWriteEnable is set so that Depth fail test will work
517 // correctly
518 // Make sure stencilTestEnable is set so that Stencil fail test will work
519 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600520 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800521 stencil.failOp = VK_STENCIL_OP_KEEP;
522 stencil.passOp = VK_STENCIL_OP_KEEP;
523 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
524 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600525
526 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
527 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600528 ds_ci.pNext = NULL;
529 ds_ci.depthTestEnable = VK_FALSE;
530 ds_ci.depthWriteEnable = VK_TRUE;
531 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
532 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600533 if (failMask & BsoFailDepthBounds) {
534 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600535 ds_ci.maxDepthBounds = 0.0f;
536 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600537 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600538 ds_ci.stencilTestEnable = VK_TRUE;
539 ds_ci.front = stencil;
540 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600541
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600542 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600543 pipelineobj.SetViewport(m_viewports);
544 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800545 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700546 VkResult err = pipelineobj.CreateVKPipeline(
547 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600548 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800549 commandBuffer->BindPipeline(pipelineobj);
550 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500551}
552
Ian Elliott2c1daf52016-05-12 09:41:46 -0600553class VkWsiEnabledLayerTest : public VkLayerTest {
554 public:
555protected:
556 VkWsiEnabledLayerTest() {
557 m_enableWSI = true;
558 }
559};
560
Mark Muellerdfe37552016-07-07 14:47:42 -0600561class VkBufferTest {
562public:
563 enum eTestEnFlags {
564 eDoubleDelete,
565 eInvalidDeviceOffset,
566 eInvalidMemoryOffset,
567 eBindNullBuffer,
568 eFreeInvalidHandle,
569 };
570
571 enum eTestConditions {
572 eOffsetAlignment = 1
573 };
574
575 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice,
576 eTestEnFlags aTestFlag,
577 VkBufferUsageFlags aBufferUsage = 0) {
578 if (eInvalidDeviceOffset != aTestFlag &&
579 eInvalidMemoryOffset != aTestFlag) {
580 return true;
581 }
582 VkDeviceSize offset_limit = 0;
583 if (eInvalidMemoryOffset == aTestFlag) {
584 VkBuffer vulkanBuffer;
585 VkBufferCreateInfo buffer_create_info = {};
586 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
587 buffer_create_info.size = 32;
588 buffer_create_info.usage = aBufferUsage;
589
590 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr,
591 &vulkanBuffer);
592 VkMemoryRequirements memory_reqs = {0};
593
594 vkGetBufferMemoryRequirements(aVulkanDevice->device(),
595 vulkanBuffer, &memory_reqs);
596 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
597 offset_limit = memory_reqs.alignment;
598 }
599 else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
600 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
601 offset_limit =
602 aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
603 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
604 offset_limit =
605 aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
606 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
607 offset_limit =
608 aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
609 }
610 if (eOffsetAlignment < offset_limit) {
611 return true;
612 }
613 return false;
614 }
615
616 // A constructor which performs validation tests within construction.
617 VkBufferTest(VkDeviceObj *aVulkanDevice,
618 VkBufferUsageFlags aBufferUsage,
619 eTestEnFlags aTestFlag)
620 : AllocateCurrent(false), BoundCurrent(false),
621 CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
622
623 if (eBindNullBuffer == aTestFlag) {
624 VulkanMemory = 0;
625 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
626 } else {
627 VkBufferCreateInfo buffer_create_info = {};
628 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
629 buffer_create_info.size = 32;
630 buffer_create_info.usage = aBufferUsage;
631
632 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr,
633 &VulkanBuffer);
634
635 CreateCurrent = true;
636
637 VkMemoryRequirements memory_requirements;
638 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer,
639 &memory_requirements);
640
641 VkMemoryAllocateInfo memory_allocate_info = {};
642 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
643 memory_allocate_info.allocationSize = memory_requirements.size;
644 bool pass = aVulkanDevice->phy().
645 set_memory_type(memory_requirements.memoryTypeBits,
646 &memory_allocate_info,
647 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
648 if (!pass) {
649 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
650 return;
651 }
652
653 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL,
654 &VulkanMemory);
655 AllocateCurrent = true;
656 // NB: 1 is intentionally an invalid offset value
657 const bool offset_en = eInvalidDeviceOffset == aTestFlag ||
658 eInvalidMemoryOffset == aTestFlag;
659 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory,
660 offset_en ? eOffsetAlignment : 0);
661 BoundCurrent = true;
662
663 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
664 }
665 }
666
667 ~VkBufferTest() {
668 if (CreateCurrent) {
669 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
670 }
671 if (AllocateCurrent) {
672 if (InvalidDeleteEn) {
673 union {
674 VkDeviceMemory device_memory;
675 unsigned long long index_access;
676 } bad_index;
677
678 bad_index.device_memory = VulkanMemory;
679 bad_index.index_access++;
680
681 vkFreeMemory(VulkanDevice,
682 bad_index.device_memory,
683 nullptr);
684 }
685 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
686 }
687 }
688
689 bool GetBufferCurrent() {
690 return AllocateCurrent && BoundCurrent && CreateCurrent;
691 }
692
693 const VkBuffer &GetBuffer() {
694 return VulkanBuffer;
695 }
696
697 void TestDoubleDestroy() {
698 // Destroy the buffer but leave the flag set, which will cause
699 // the buffer to be destroyed again in the destructor.
700 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
701 }
702
703protected:
704 bool AllocateCurrent;
705 bool BoundCurrent;
706 bool CreateCurrent;
707 bool InvalidDeleteEn;
708
709 VkBuffer VulkanBuffer;
710 VkDevice VulkanDevice;
711 VkDeviceMemory VulkanMemory;
712
713};
714
715class VkVerticesObj {
716public:
717 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount,
718 unsigned aBindingCount, unsigned aByteStride,
719 VkDeviceSize aVertexCount, const float *aVerticies)
720 : BoundCurrent(false),
721 AttributeCount(aAttributeCount),
722 BindingCount(aBindingCount),
723 BindId(BindIdGenerator),
724 PipelineVertexInputStateCreateInfo(),
725 VulkanMemoryBuffer(aVulkanDevice, 1,
726 static_cast<int>(aByteStride * aVertexCount),
727 reinterpret_cast<const void *>(aVerticies),
728 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
729 BindIdGenerator++; // NB: This can wrap w/misuse
730
731 VertexInputAttributeDescription =
732 new VkVertexInputAttributeDescription[AttributeCount];
733 VertexInputBindingDescription =
734 new VkVertexInputBindingDescription[BindingCount];
735
736 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions =
737 VertexInputAttributeDescription;
738 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount =
739 AttributeCount;
740 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions =
741 VertexInputBindingDescription;
742 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount =
743 BindingCount;
744 PipelineVertexInputStateCreateInfo.sType =
745 VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
746
747 unsigned i = 0;
748 do {
749 VertexInputAttributeDescription[i].binding = BindId;
750 VertexInputAttributeDescription[i].location = i;
751 VertexInputAttributeDescription[i].format =
752 VK_FORMAT_R32G32B32_SFLOAT;
753 VertexInputAttributeDescription[i].offset =
754 sizeof(float) * aByteStride;
755 i++;
756 } while (AttributeCount < i);
757
758 i = 0;
759 do {
760 VertexInputBindingDescription[i].binding = BindId;
761 VertexInputBindingDescription[i].stride = aByteStride;
762 VertexInputBindingDescription[i].inputRate =
763 VK_VERTEX_INPUT_RATE_VERTEX;
764 i++;
765 } while (BindingCount < i);
766 }
767
768 ~VkVerticesObj() {
769 if (VertexInputAttributeDescription) {
770 delete[] VertexInputAttributeDescription;
771 }
772 if (VertexInputBindingDescription) {
773 delete[] VertexInputBindingDescription;
774 }
775 }
776
777 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
778 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription,
779 AttributeCount);
780 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription,
781 BindingCount);
782 return true;
783 }
784
785 void BindVertexBuffers(VkCommandBuffer aCommandBuffer,
786 unsigned aOffsetCount = 0,
787 VkDeviceSize *aOffsetList = nullptr) {
788 VkDeviceSize *offsetList;
789 unsigned offsetCount;
790
791 if (aOffsetCount) {
792 offsetList = aOffsetList;
793 offsetCount = aOffsetCount;
794 } else {
795 offsetList = new VkDeviceSize[1]();
796 offsetCount = 1;
797 }
798
799 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount,
800 &VulkanMemoryBuffer.handle(), offsetList);
801 BoundCurrent = true;
802
803 if (!aOffsetCount) {
804 delete [] offsetList;
805 }
806 }
807
808protected:
809 static uint32_t BindIdGenerator;
810
811 bool BoundCurrent;
812 unsigned AttributeCount;
813 unsigned BindingCount;
814 uint32_t BindId;
815
816 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
817 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
818 VkVertexInputBindingDescription *VertexInputBindingDescription;
819 VkConstantBufferObj VulkanMemoryBuffer;
820};
821
822uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500823// ********************************************************************************************************************
824// ********************************************************************************************************************
825// ********************************************************************************************************************
826// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600827#if PARAMETER_VALIDATION_TESTS
828TEST_F(VkLayerTest, RequiredParameter) {
829 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
830 "pointer, array, and array count parameters");
831
832 ASSERT_NO_FATAL_FAILURE(InitState());
833
834 m_errorMonitor->SetDesiredFailureMsg(
835 VK_DEBUG_REPORT_ERROR_BIT_EXT,
836 "required parameter pFeatures specified as NULL");
837 // Specify NULL for a pointer to a handle
838 // Expected to trigger an error with
839 // parameter_validation::validate_required_pointer
840 vkGetPhysicalDeviceFeatures(gpu(), NULL);
841 m_errorMonitor->VerifyFound();
842
843 m_errorMonitor->SetDesiredFailureMsg(
844 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600845 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600846 // Specify NULL for pointer to array count
847 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600848 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600849 m_errorMonitor->VerifyFound();
850
851 m_errorMonitor->SetDesiredFailureMsg(
852 VK_DEBUG_REPORT_ERROR_BIT_EXT,
853 "parameter viewportCount must be greater than 0");
854 // Specify 0 for a required array count
855 // Expected to trigger an error with parameter_validation::validate_array
856 VkViewport view_port = {};
857 m_commandBuffer->SetViewport(0, 0, &view_port);
858 m_errorMonitor->VerifyFound();
859
860 m_errorMonitor->SetDesiredFailureMsg(
861 VK_DEBUG_REPORT_ERROR_BIT_EXT,
862 "required parameter pViewports specified as NULL");
863 // Specify NULL for a required array
864 // Expected to trigger an error with parameter_validation::validate_array
865 m_commandBuffer->SetViewport(0, 1, NULL);
866 m_errorMonitor->VerifyFound();
867
868 m_errorMonitor->SetDesiredFailureMsg(
869 VK_DEBUG_REPORT_ERROR_BIT_EXT,
870 "required parameter memory specified as VK_NULL_HANDLE");
871 // Specify VK_NULL_HANDLE for a required handle
872 // Expected to trigger an error with
873 // parameter_validation::validate_required_handle
874 vkUnmapMemory(device(), VK_NULL_HANDLE);
875 m_errorMonitor->VerifyFound();
876
877 m_errorMonitor->SetDesiredFailureMsg(
878 VK_DEBUG_REPORT_ERROR_BIT_EXT,
879 "required parameter pFences[0] specified as VK_NULL_HANDLE");
880 // Specify VK_NULL_HANDLE for a required handle array entry
881 // Expected to trigger an error with
882 // parameter_validation::validate_required_handle_array
883 VkFence fence = VK_NULL_HANDLE;
884 vkResetFences(device(), 1, &fence);
885 m_errorMonitor->VerifyFound();
886
887 m_errorMonitor->SetDesiredFailureMsg(
888 VK_DEBUG_REPORT_ERROR_BIT_EXT,
889 "required parameter pAllocateInfo specified as NULL");
890 // Specify NULL for a required struct pointer
891 // Expected to trigger an error with
892 // parameter_validation::validate_struct_type
893 VkDeviceMemory memory = VK_NULL_HANDLE;
894 vkAllocateMemory(device(), NULL, NULL, &memory);
895 m_errorMonitor->VerifyFound();
896
897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
898 "value of faceMask must not be 0");
899 // Specify 0 for a required VkFlags parameter
900 // Expected to trigger an error with parameter_validation::validate_flags
901 m_commandBuffer->SetStencilReference(0, 0);
902 m_errorMonitor->VerifyFound();
903
904 m_errorMonitor->SetDesiredFailureMsg(
905 VK_DEBUG_REPORT_ERROR_BIT_EXT,
906 "value of pSubmits[i].pWaitDstStageMask[0] must not be 0");
907 // Specify 0 for a required VkFlags array entry
908 // Expected to trigger an error with
909 // parameter_validation::validate_flags_array
910 VkSemaphore semaphore = VK_NULL_HANDLE;
911 VkPipelineStageFlags stageFlags = 0;
912 VkSubmitInfo submitInfo = {};
913 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
914 submitInfo.waitSemaphoreCount = 1;
915 submitInfo.pWaitSemaphores = &semaphore;
916 submitInfo.pWaitDstStageMask = &stageFlags;
917 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
918 m_errorMonitor->VerifyFound();
919}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600920
Dustin Gravesfce74c02016-05-10 11:42:58 -0600921TEST_F(VkLayerTest, ReservedParameter) {
922 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
923
924 ASSERT_NO_FATAL_FAILURE(InitState());
925
926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
927 " must be 0");
928 // Specify 0 for a reserved VkFlags parameter
929 // Expected to trigger an error with
930 // parameter_validation::validate_reserved_flags
931 VkEvent event_handle = VK_NULL_HANDLE;
932 VkEventCreateInfo event_info = {};
933 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
934 event_info.flags = 1;
935 vkCreateEvent(device(), &event_info, NULL, &event_handle);
936 m_errorMonitor->VerifyFound();
937}
938
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600939TEST_F(VkLayerTest, InvalidStructSType) {
940 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
941 "structure's sType field");
942
943 ASSERT_NO_FATAL_FAILURE(InitState());
944
945 m_errorMonitor->SetDesiredFailureMsg(
946 VK_DEBUG_REPORT_ERROR_BIT_EXT,
947 "parameter pAllocateInfo->sType must be");
948 // Zero struct memory, effectively setting sType to
949 // VK_STRUCTURE_TYPE_APPLICATION_INFO
950 // Expected to trigger an error with
951 // parameter_validation::validate_struct_type
952 VkMemoryAllocateInfo alloc_info = {};
953 VkDeviceMemory memory = VK_NULL_HANDLE;
954 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
955 m_errorMonitor->VerifyFound();
956
957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
958 "parameter pSubmits[0].sType must be");
959 // Zero struct memory, effectively setting sType to
960 // VK_STRUCTURE_TYPE_APPLICATION_INFO
961 // Expected to trigger an error with
962 // parameter_validation::validate_struct_type_array
963 VkSubmitInfo submit_info = {};
964 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
965 m_errorMonitor->VerifyFound();
966}
967
968TEST_F(VkLayerTest, InvalidStructPNext) {
969 TEST_DESCRIPTION(
970 "Specify an invalid value for a Vulkan structure's pNext field");
971
972 ASSERT_NO_FATAL_FAILURE(InitState());
973
974 m_errorMonitor->SetDesiredFailureMsg(
975 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz38b50992016-07-11 16:09:09 -0600976 "value of pCreateInfo->pNext must be NULL");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600977 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be
Karl Schultz38b50992016-07-11 16:09:09 -0600978 // NULL.
979 // Need to pick a function that has no allowed pNext structure types.
980 // Expected to trigger an error with
981 // parameter_validation::validate_struct_pnext
982 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600983 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600984 // Zero-initialization will provide the correct sType
985 VkApplicationInfo app_info = {};
986 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
987 event_alloc_info.pNext = &app_info;
988 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
989 m_errorMonitor->VerifyFound();
990
991 m_errorMonitor->SetDesiredFailureMsg(
992 VK_DEBUG_REPORT_ERROR_BIT_EXT,
993 " chain includes a structure with unexpected VkStructureType ");
994 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
995 // a function that has allowed pNext structure types and specify
996 // a structure type that is not allowed.
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600997 // Expected to trigger an error with
998 // parameter_validation::validate_struct_pnext
999 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -06001000 VkMemoryAllocateInfo memory_alloc_info = {};
1001 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1002 memory_alloc_info.pNext = &app_info;
1003 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -06001004 m_errorMonitor->VerifyFound();
1005
Dustin Graves47b6cba2016-05-10 17:34:38 -06001006 m_errorMonitor->SetDesiredFailureMsg(
1007 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1008 " chain includes a structure with unexpected VkStructureType ");
1009 // Set VkGraphicsPipelineCreateInfo::VkPipelineRasterizationStateCreateInfo::pNext to an invalid structure, when pNext is allowed to be a non-NULL value
1010 // Expected to trigger an error with
1011 // parameter_validation::validate_struct_pnext
1012 VkDescriptorPoolSize ds_type_count = {};
1013 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1014 ds_type_count.descriptorCount = 1;
1015
1016 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1017 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1018 ds_pool_ci.pNext = NULL;
1019 ds_pool_ci.maxSets = 1;
1020 ds_pool_ci.poolSizeCount = 1;
1021 ds_pool_ci.pPoolSizes = &ds_type_count;
1022
1023 VkDescriptorPool ds_pool;
1024 VkResult err =
1025 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
1026 ASSERT_VK_SUCCESS(err);
1027
1028 VkDescriptorSetLayoutBinding dsl_binding = {};
1029 dsl_binding.binding = 0;
1030 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1031 dsl_binding.descriptorCount = 1;
1032 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1033 dsl_binding.pImmutableSamplers = NULL;
1034
1035 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1036 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1037 ds_layout_ci.pNext = NULL;
1038 ds_layout_ci.bindingCount = 1;
1039 ds_layout_ci.pBindings = &dsl_binding;
1040
1041 VkDescriptorSetLayout ds_layout;
1042 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1043 &ds_layout);
1044 ASSERT_VK_SUCCESS(err);
1045
1046 VkDescriptorSet descriptorSet;
1047 VkDescriptorSetAllocateInfo ds_alloc_info = {};
1048 ds_alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1049 ds_alloc_info.descriptorSetCount = 1;
1050 ds_alloc_info.descriptorPool = ds_pool;
1051 ds_alloc_info.pSetLayouts = &ds_layout;
1052 err = vkAllocateDescriptorSets(m_device->device(), &ds_alloc_info,
1053 &descriptorSet);
1054 ASSERT_VK_SUCCESS(err);
1055
1056 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1057 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1058 pipeline_layout_ci.setLayoutCount = 1;
1059 pipeline_layout_ci.pSetLayouts = &ds_layout;
1060
1061 VkPipelineLayout pipeline_layout;
1062 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1063 &pipeline_layout);
1064 ASSERT_VK_SUCCESS(err);
1065
1066 VkViewport vp = {}; // Just need dummy vp to point to
1067 VkRect2D sc = {}; // dummy scissor to point to
1068
1069 VkPipelineViewportStateCreateInfo vp_state_ci = {};
1070 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
1071 vp_state_ci.scissorCount = 1;
1072 vp_state_ci.pScissors = &sc;
1073 vp_state_ci.viewportCount = 1;
1074 vp_state_ci.pViewports = &vp;
1075
1076 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
1077 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1078 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
1079 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
1080 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
1081 rs_state_ci.depthClampEnable = VK_FALSE;
1082 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
1083 rs_state_ci.depthBiasEnable = VK_FALSE;
1084
1085 VkGraphicsPipelineCreateInfo gp_ci = {};
1086 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1087 gp_ci.pViewportState = &vp_state_ci;
1088 gp_ci.pRasterizationState = &rs_state_ci;
1089 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
1090 gp_ci.layout = pipeline_layout;
1091 gp_ci.renderPass = renderPass();
1092
1093 VkPipelineCacheCreateInfo pc_ci = {};
1094 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
1095 pc_ci.initialDataSize = 0;
1096 pc_ci.pInitialData = 0;
1097
1098 VkPipeline pipeline;
1099 VkPipelineCache pipelineCache;
1100
1101 err =
1102 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
1103 ASSERT_VK_SUCCESS(err);
1104
1105 // Set VkPipelineRasterizationStateCreateInfo::pNext to an invalid value
1106 VkApplicationInfo invalid_pnext_struct = {};
1107 rs_state_ci.pNext = &invalid_pnext_struct;
1108
1109 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
1110 &gp_ci, NULL, &pipeline);
1111 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06001112 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
1113 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1114 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1115 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1116
Dustin Gravesc99cf5a2016-05-09 14:40:29 -06001117}
Dustin Graves5d33d532016-05-09 16:21:12 -06001118
1119TEST_F(VkLayerTest, UnrecognizedValue) {
1120 TEST_DESCRIPTION(
1121 "Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
1122
1123 ASSERT_NO_FATAL_FAILURE(InitState());
1124
1125 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1126 "does not fall within the begin..end "
1127 "range of the core VkFormat "
1128 "enumeration tokens");
1129 // Specify an invalid VkFormat value
1130 // Expected to trigger an error with
1131 // parameter_validation::validate_ranged_enum
1132 VkFormatProperties format_properties;
1133 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000),
1134 &format_properties);
1135 m_errorMonitor->VerifyFound();
1136
1137 m_errorMonitor->SetDesiredFailureMsg(
1138 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1139 "contains flag bits that are not recognized members of");
1140 // Specify an invalid VkFlags bitmask value
1141 // Expected to trigger an error with parameter_validation::validate_flags
1142 VkImageFormatProperties image_format_properties;
1143 vkGetPhysicalDeviceImageFormatProperties(
1144 gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D,
1145 VK_IMAGE_TILING_OPTIMAL, static_cast<VkImageUsageFlags>(1 << 25), 0,
1146 &image_format_properties);
1147 m_errorMonitor->VerifyFound();
1148
1149 m_errorMonitor->SetDesiredFailureMsg(
1150 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1151 "contains flag bits that are not recognized members of");
1152 // Specify an invalid VkFlags array entry
1153 // Expected to trigger an error with
1154 // parameter_validation::validate_flags_array
1155 VkSemaphore semaphore = VK_NULL_HANDLE;
1156 VkPipelineStageFlags stage_flags =
1157 static_cast<VkPipelineStageFlags>(1 << 25);
1158 VkSubmitInfo submit_info = {};
1159 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1160 submit_info.waitSemaphoreCount = 1;
1161 submit_info.pWaitSemaphores = &semaphore;
1162 submit_info.pWaitDstStageMask = &stage_flags;
1163 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1164 m_errorMonitor->VerifyFound();
1165
1166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1167 "is neither VK_TRUE nor VK_FALSE");
1168 // Specify an invalid VkBool32 value
1169 // Expected to trigger a warning with
1170 // parameter_validation::validate_bool32
1171 VkSampler sampler = VK_NULL_HANDLE;
1172 VkSamplerCreateInfo sampler_info = {};
1173 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1174 sampler_info.pNext = NULL;
1175 sampler_info.magFilter = VK_FILTER_NEAREST;
1176 sampler_info.minFilter = VK_FILTER_NEAREST;
1177 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1178 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1179 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1180 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1181 sampler_info.mipLodBias = 1.0;
1182 sampler_info.maxAnisotropy = 1;
1183 sampler_info.compareEnable = VK_FALSE;
1184 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1185 sampler_info.minLod = 1.0;
1186 sampler_info.maxLod = 1.0;
1187 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1188 sampler_info.unnormalizedCoordinates = VK_FALSE;
1189 // Not VK_TRUE or VK_FALSE
1190 sampler_info.anisotropyEnable = 3;
1191 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1192 m_errorMonitor->VerifyFound();
1193}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001194
1195TEST_F(VkLayerTest, FailedReturnValue) {
1196 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1197
1198 ASSERT_NO_FATAL_FAILURE(InitState());
1199
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001200 // Find an unsupported image format
1201 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1202 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1203 VkFormat format = static_cast<VkFormat>(f);
1204 VkFormatProperties fProps = m_device->format_properties(format);
1205 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
1206 fProps.optimalTilingFeatures == 0) {
1207 unsupported = format;
1208 break;
1209 }
1210 }
1211
1212 if (unsupported != VK_FORMAT_UNDEFINED) {
1213 m_errorMonitor->SetDesiredFailureMsg(
1214 VK_DEBUG_REPORT_WARNING_BIT_EXT,
1215 "the requested format is not supported on this device");
1216 // Specify an unsupported VkFormat value to generate a
1217 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1218 // Expected to trigger a warning from
1219 // parameter_validation::validate_result
1220 VkImageFormatProperties image_format_properties;
1221 VkResult err = vkGetPhysicalDeviceImageFormatProperties(
1222 gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1223 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
1224 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1225 m_errorMonitor->VerifyFound();
1226 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001227}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001228
1229TEST_F(VkLayerTest, UpdateBufferAlignment) {
1230 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
1231 uint32_t updateData[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
1232
1233 ASSERT_NO_FATAL_FAILURE(InitState());
1234
1235 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1236 vk_testing::Buffer buffer;
1237 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1238
1239 BeginCommandBuffer();
1240 // Introduce failure by using dstOffset that is not multiple of 4
1241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1242 " is not a multiple of 4");
1243 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1244 m_errorMonitor->VerifyFound();
1245
1246 // Introduce failure by using dataSize that is not multiple of 4
1247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1248 " is not a multiple of 4");
1249 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1250 m_errorMonitor->VerifyFound();
1251
1252 // Introduce failure by using dataSize that is < 0
1253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1254 "must be greater than zero and less than or equal to 65536");
1255 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1256 m_errorMonitor->VerifyFound();
1257
1258 // Introduce failure by using dataSize that is > 65536
1259 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1260 "must be greater than zero and less than or equal to 65536");
1261 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1262 m_errorMonitor->VerifyFound();
1263
1264 EndCommandBuffer();
1265}
1266
1267TEST_F(VkLayerTest, FillBufferAlignment) {
1268 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1269
1270 ASSERT_NO_FATAL_FAILURE(InitState());
1271
1272 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1273 vk_testing::Buffer buffer;
1274 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1275
1276 BeginCommandBuffer();
1277
1278 // Introduce failure by using dstOffset that is not multiple of 4
1279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1280 " is not a multiple of 4");
1281 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1282 m_errorMonitor->VerifyFound();
1283
1284 // Introduce failure by using size that is not multiple of 4
1285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1286 " is not a multiple of 4");
1287 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1288 m_errorMonitor->VerifyFound();
1289
1290 // Introduce failure by using size that is zero
1291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1292 "must be greater than zero");
1293 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1294 m_errorMonitor->VerifyFound();
1295
1296 EndCommandBuffer();
1297}
Dustin Graves40f35822016-06-23 11:12:53 -06001298
1299// This is a positive test. No failures are expected.
1300TEST_F(VkLayerTest, IgnoreUnrelatedDescriptor) {
1301 TEST_DESCRIPTION("Ensure that the vkUpdateDescriptorSet validation code "
1302 "is ignoring VkWriteDescriptorSet members that are not "
1303 "related to the descriptor type specified by "
1304 "VkWriteDescriptorSet::descriptorType. Correct "
1305 "validation behavior will result in the test running to "
1306 "completion without validation errors.");
1307
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001308 const uintptr_t invalid_ptr = 0xcdcdcdcd;
1309
Dustin Graves40f35822016-06-23 11:12:53 -06001310 ASSERT_NO_FATAL_FAILURE(InitState());
1311
1312 // Image Case
1313 {
1314 m_errorMonitor->ExpectSuccess();
1315
1316 VkImage image;
1317 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1318 const int32_t tex_width = 32;
1319 const int32_t tex_height = 32;
1320 VkImageCreateInfo image_create_info = {};
1321 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1322 image_create_info.pNext = NULL;
1323 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1324 image_create_info.format = tex_format;
1325 image_create_info.extent.width = tex_width;
1326 image_create_info.extent.height = tex_height;
1327 image_create_info.extent.depth = 1;
1328 image_create_info.mipLevels = 1;
1329 image_create_info.arrayLayers = 1;
1330 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis51cde412016-07-11 16:08:30 -06001331 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Dustin Graves40f35822016-06-23 11:12:53 -06001332 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1333 image_create_info.flags = 0;
1334 VkResult err =
1335 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1336 ASSERT_VK_SUCCESS(err);
1337
1338 VkMemoryRequirements memory_reqs;
1339 VkDeviceMemory image_memory;
1340 bool pass;
1341 VkMemoryAllocateInfo memory_info = {};
1342 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1343 memory_info.pNext = NULL;
1344 memory_info.allocationSize = 0;
1345 memory_info.memoryTypeIndex = 0;
1346 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
1347 memory_info.allocationSize = memory_reqs.size;
1348 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1349 &memory_info, 0);
1350 ASSERT_TRUE(pass);
1351 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1352 &image_memory);
1353 ASSERT_VK_SUCCESS(err);
1354 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
1355 ASSERT_VK_SUCCESS(err);
1356
1357 VkImageViewCreateInfo image_view_create_info = {};
1358 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1359 image_view_create_info.image = image;
1360 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
1361 image_view_create_info.format = tex_format;
1362 image_view_create_info.subresourceRange.layerCount = 1;
1363 image_view_create_info.subresourceRange.baseMipLevel = 0;
1364 image_view_create_info.subresourceRange.levelCount = 1;
1365 image_view_create_info.subresourceRange.aspectMask =
1366 VK_IMAGE_ASPECT_COLOR_BIT;
1367
1368 VkImageView view;
1369 err = vkCreateImageView(m_device->device(), &image_view_create_info,
1370 NULL, &view);
1371 ASSERT_VK_SUCCESS(err);
1372
1373 VkDescriptorPoolSize ds_type_count = {};
1374 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1375 ds_type_count.descriptorCount = 1;
1376
1377 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1378 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1379 ds_pool_ci.pNext = NULL;
1380 ds_pool_ci.maxSets = 1;
1381 ds_pool_ci.poolSizeCount = 1;
1382 ds_pool_ci.pPoolSizes = &ds_type_count;
1383
1384 VkDescriptorPool ds_pool;
1385 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1386 &ds_pool);
1387 ASSERT_VK_SUCCESS(err);
1388
1389 VkDescriptorSetLayoutBinding dsl_binding = {};
1390 dsl_binding.binding = 0;
1391 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1392 dsl_binding.descriptorCount = 1;
1393 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1394 dsl_binding.pImmutableSamplers = NULL;
1395
1396 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1397 ds_layout_ci.sType =
1398 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1399 ds_layout_ci.pNext = NULL;
1400 ds_layout_ci.bindingCount = 1;
1401 ds_layout_ci.pBindings = &dsl_binding;
1402 VkDescriptorSetLayout ds_layout;
1403 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1404 NULL, &ds_layout);
1405 ASSERT_VK_SUCCESS(err);
1406
1407 VkDescriptorSet descriptor_set;
1408 VkDescriptorSetAllocateInfo alloc_info = {};
1409 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1410 alloc_info.descriptorSetCount = 1;
1411 alloc_info.descriptorPool = ds_pool;
1412 alloc_info.pSetLayouts = &ds_layout;
1413 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1414 &descriptor_set);
1415 ASSERT_VK_SUCCESS(err);
1416
1417 VkDescriptorImageInfo image_info = {};
1418 image_info.imageView = view;
1419 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
1420
1421 VkWriteDescriptorSet descriptor_write;
1422 memset(&descriptor_write, 0, sizeof(descriptor_write));
1423 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1424 descriptor_write.dstSet = descriptor_set;
1425 descriptor_write.dstBinding = 0;
1426 descriptor_write.descriptorCount = 1;
1427 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1428 descriptor_write.pImageInfo = &image_info;
1429
1430 // Set pBufferInfo and pTexelBufferView to invalid values, which should
1431 // be
1432 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
1433 // This will most likely produce a crash if the parameter_validation
1434 // layer
1435 // does not correctly ignore pBufferInfo.
1436 descriptor_write.pBufferInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001437 reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001438 descriptor_write.pTexelBufferView =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001439 reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001440
1441 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1442 NULL);
1443
1444 m_errorMonitor->VerifyNotFound();
1445
1446 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1447 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1448 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1449 vkDestroyImageView(m_device->device(), view, NULL);
1450 vkDestroyImage(m_device->device(), image, NULL);
1451 vkFreeMemory(m_device->device(), image_memory, NULL);
1452 }
1453
1454 // Buffer Case
1455 {
1456 m_errorMonitor->ExpectSuccess();
1457
1458 VkBuffer buffer;
1459 uint32_t queue_family_index = 0;
1460 VkBufferCreateInfo buffer_create_info = {};
1461 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1462 buffer_create_info.size = 1024;
1463 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1464 buffer_create_info.queueFamilyIndexCount = 1;
1465 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1466
1467 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1468 NULL, &buffer);
1469 ASSERT_VK_SUCCESS(err);
1470
1471 VkMemoryRequirements memory_reqs;
1472 VkDeviceMemory buffer_memory;
1473 bool pass;
1474 VkMemoryAllocateInfo memory_info = {};
1475 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1476 memory_info.pNext = NULL;
1477 memory_info.allocationSize = 0;
1478 memory_info.memoryTypeIndex = 0;
1479
1480 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1481 memory_info.allocationSize = memory_reqs.size;
1482 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1483 &memory_info, 0);
1484 ASSERT_TRUE(pass);
1485
1486 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1487 &buffer_memory);
1488 ASSERT_VK_SUCCESS(err);
1489 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1490 ASSERT_VK_SUCCESS(err);
1491
1492 VkDescriptorPoolSize ds_type_count = {};
1493 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1494 ds_type_count.descriptorCount = 1;
1495
1496 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1497 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1498 ds_pool_ci.pNext = NULL;
1499 ds_pool_ci.maxSets = 1;
1500 ds_pool_ci.poolSizeCount = 1;
1501 ds_pool_ci.pPoolSizes = &ds_type_count;
1502
1503 VkDescriptorPool ds_pool;
1504 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1505 &ds_pool);
1506 ASSERT_VK_SUCCESS(err);
1507
1508 VkDescriptorSetLayoutBinding dsl_binding = {};
1509 dsl_binding.binding = 0;
1510 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1511 dsl_binding.descriptorCount = 1;
1512 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1513 dsl_binding.pImmutableSamplers = NULL;
1514
1515 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1516 ds_layout_ci.sType =
1517 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1518 ds_layout_ci.pNext = NULL;
1519 ds_layout_ci.bindingCount = 1;
1520 ds_layout_ci.pBindings = &dsl_binding;
1521 VkDescriptorSetLayout ds_layout;
1522 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1523 NULL, &ds_layout);
1524 ASSERT_VK_SUCCESS(err);
1525
1526 VkDescriptorSet descriptor_set;
1527 VkDescriptorSetAllocateInfo alloc_info = {};
1528 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1529 alloc_info.descriptorSetCount = 1;
1530 alloc_info.descriptorPool = ds_pool;
1531 alloc_info.pSetLayouts = &ds_layout;
1532 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1533 &descriptor_set);
1534 ASSERT_VK_SUCCESS(err);
1535
1536 VkDescriptorBufferInfo buffer_info = {};
1537 buffer_info.buffer = buffer;
1538 buffer_info.offset = 0;
1539 buffer_info.range = 1024;
1540
1541 VkWriteDescriptorSet descriptor_write;
1542 memset(&descriptor_write, 0, sizeof(descriptor_write));
1543 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1544 descriptor_write.dstSet = descriptor_set;
1545 descriptor_write.dstBinding = 0;
1546 descriptor_write.descriptorCount = 1;
1547 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1548 descriptor_write.pBufferInfo = &buffer_info;
1549
1550 // Set pImageInfo and pTexelBufferView to invalid values, which should
1551 // be
1552 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
1553 // This will most likely produce a crash if the parameter_validation
1554 // layer
1555 // does not correctly ignore pImageInfo.
1556 descriptor_write.pImageInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001557 reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001558 descriptor_write.pTexelBufferView =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001559 reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001560
1561 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1562 NULL);
1563
1564 m_errorMonitor->VerifyNotFound();
1565
1566 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1567 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1568 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1569 vkDestroyBuffer(m_device->device(), buffer, NULL);
1570 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1571 }
1572
1573 // Texel Buffer Case
1574 {
1575 m_errorMonitor->ExpectSuccess();
1576
1577 VkBuffer buffer;
1578 uint32_t queue_family_index = 0;
1579 VkBufferCreateInfo buffer_create_info = {};
1580 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1581 buffer_create_info.size = 1024;
1582 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
1583 buffer_create_info.queueFamilyIndexCount = 1;
1584 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1585
1586 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1587 NULL, &buffer);
1588 ASSERT_VK_SUCCESS(err);
1589
1590 VkMemoryRequirements memory_reqs;
1591 VkDeviceMemory buffer_memory;
1592 bool pass;
1593 VkMemoryAllocateInfo memory_info = {};
1594 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1595 memory_info.pNext = NULL;
1596 memory_info.allocationSize = 0;
1597 memory_info.memoryTypeIndex = 0;
1598
1599 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1600 memory_info.allocationSize = memory_reqs.size;
1601 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1602 &memory_info, 0);
1603 ASSERT_TRUE(pass);
1604
1605 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1606 &buffer_memory);
1607 ASSERT_VK_SUCCESS(err);
1608 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1609 ASSERT_VK_SUCCESS(err);
1610
1611 VkBufferViewCreateInfo buff_view_ci = {};
1612 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
1613 buff_view_ci.buffer = buffer;
1614 buff_view_ci.format = VK_FORMAT_R8_UNORM;
1615 buff_view_ci.range = VK_WHOLE_SIZE;
1616 VkBufferView buffer_view;
1617 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL,
1618 &buffer_view);
1619
1620 VkDescriptorPoolSize ds_type_count = {};
1621 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1622 ds_type_count.descriptorCount = 1;
1623
1624 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1625 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1626 ds_pool_ci.pNext = NULL;
1627 ds_pool_ci.maxSets = 1;
1628 ds_pool_ci.poolSizeCount = 1;
1629 ds_pool_ci.pPoolSizes = &ds_type_count;
1630
1631 VkDescriptorPool ds_pool;
1632 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1633 &ds_pool);
1634 ASSERT_VK_SUCCESS(err);
1635
1636 VkDescriptorSetLayoutBinding dsl_binding = {};
1637 dsl_binding.binding = 0;
1638 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1639 dsl_binding.descriptorCount = 1;
1640 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1641 dsl_binding.pImmutableSamplers = NULL;
1642
1643 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1644 ds_layout_ci.sType =
1645 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1646 ds_layout_ci.pNext = NULL;
1647 ds_layout_ci.bindingCount = 1;
1648 ds_layout_ci.pBindings = &dsl_binding;
1649 VkDescriptorSetLayout ds_layout;
1650 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1651 NULL, &ds_layout);
1652 ASSERT_VK_SUCCESS(err);
1653
1654 VkDescriptorSet descriptor_set;
1655 VkDescriptorSetAllocateInfo alloc_info = {};
1656 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1657 alloc_info.descriptorSetCount = 1;
1658 alloc_info.descriptorPool = ds_pool;
1659 alloc_info.pSetLayouts = &ds_layout;
1660 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1661 &descriptor_set);
1662 ASSERT_VK_SUCCESS(err);
1663
1664 VkWriteDescriptorSet descriptor_write;
1665 memset(&descriptor_write, 0, sizeof(descriptor_write));
1666 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1667 descriptor_write.dstSet = descriptor_set;
1668 descriptor_write.dstBinding = 0;
1669 descriptor_write.descriptorCount = 1;
1670 descriptor_write.descriptorType =
1671 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1672 descriptor_write.pTexelBufferView = &buffer_view;
1673
1674 // Set pImageInfo and pBufferInfo to invalid values, which should be
1675 // ignored for descriptorType ==
1676 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
1677 // This will most likely produce a crash if the parameter_validation
1678 // layer
1679 // does not correctly ignore pImageInfo and pBufferInfo.
1680 descriptor_write.pImageInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001681 reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001682 descriptor_write.pBufferInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001683 reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001684
1685 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1686 NULL);
1687
1688 m_errorMonitor->VerifyNotFound();
1689
1690 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1691 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1692 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1693 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
1694 vkDestroyBuffer(m_device->device(), buffer, NULL);
1695 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1696 }
1697}
Dustin Gravesffa90fa2016-05-06 11:20:38 -06001698#endif // PARAMETER_VALIDATION_TESTS
1699
Tobin Ehlis0788f522015-05-26 16:11:58 -06001700#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001701#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001702TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001703{
1704 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001705 VkFenceCreateInfo fenceInfo = {};
1706 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1707 fenceInfo.pNext = NULL;
1708 fenceInfo.flags = 0;
1709
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001711
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001712 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001713
1714 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1715 vk_testing::Buffer buffer;
1716 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001717
Tony Barbourfe3351b2015-07-28 10:17:20 -06001718 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001719 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001720 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001721
1722 testFence.init(*m_device, fenceInfo);
1723
1724 // Bypass framework since it does the waits automatically
1725 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001726 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001727 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1728 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001729 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001730 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001731 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001732 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001733 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001734 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001735 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001736
1737 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001738 ASSERT_VK_SUCCESS( err );
1739
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001740 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001741 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001742
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001743 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001744}
1745
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001746TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001747{
1748 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001749 VkFenceCreateInfo fenceInfo = {};
1750 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1751 fenceInfo.pNext = NULL;
1752 fenceInfo.flags = 0;
1753
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001755
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001756 ASSERT_NO_FATAL_FAILURE(InitState());
1757 ASSERT_NO_FATAL_FAILURE(InitViewport());
1758 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1759
Tony Barbourfe3351b2015-07-28 10:17:20 -06001760 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001761 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001762 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001763
1764 testFence.init(*m_device, fenceInfo);
1765
1766 // Bypass framework since it does the waits automatically
1767 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001768 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001769 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1770 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001771 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001772 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001773 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001774 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001775 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001776 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001777 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001778
1779 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001780 ASSERT_VK_SUCCESS( err );
1781
Jon Ashburnf19916e2016-01-11 13:12:43 -07001782 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001783 VkCommandBufferBeginInfo info = {};
1784 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1785 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001786 info.renderPass = VK_NULL_HANDLE;
1787 info.subpass = 0;
1788 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001789 info.occlusionQueryEnable = VK_FALSE;
1790 info.queryFlags = 0;
1791 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001792
1793 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001794 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001795
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001796 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001797}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001798#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001799
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001800// This is a positive test. No failures are expected.
1801TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
1802 VkResult err;
1803 bool pass;
1804
1805 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
1806 "the buffer, create an image, and bind the same memory to "
1807 "it");
1808
1809 m_errorMonitor->ExpectSuccess();
1810
1811 ASSERT_NO_FATAL_FAILURE(InitState());
1812
1813 VkBuffer buffer;
1814 VkImage image;
1815 VkDeviceMemory mem;
1816 VkMemoryRequirements mem_reqs;
1817
1818 VkBufferCreateInfo buf_info = {};
1819 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1820 buf_info.pNext = NULL;
1821 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1822 buf_info.size = 256;
1823 buf_info.queueFamilyIndexCount = 0;
1824 buf_info.pQueueFamilyIndices = NULL;
1825 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1826 buf_info.flags = 0;
1827 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1828 ASSERT_VK_SUCCESS(err);
1829
1830 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1831
1832 VkMemoryAllocateInfo alloc_info = {};
1833 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1834 alloc_info.pNext = NULL;
1835 alloc_info.memoryTypeIndex = 0;
1836
1837 // Ensure memory is big enough for both bindings
1838 alloc_info.allocationSize = 0x10000;
1839
1840 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1841 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1842 if (!pass) {
1843 vkDestroyBuffer(m_device->device(), buffer, NULL);
1844 return;
1845 }
1846
1847 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1848 ASSERT_VK_SUCCESS(err);
1849
1850 uint8_t *pData;
1851 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1852 (void **)&pData);
1853 ASSERT_VK_SUCCESS(err);
1854
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001855 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001856
1857 vkUnmapMemory(m_device->device(), mem);
1858
1859 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1860 ASSERT_VK_SUCCESS(err);
1861
1862 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1863 // memory. In fact, it was never used by the GPU.
1864 // Just be be sure, wait for idle.
1865 vkDestroyBuffer(m_device->device(), buffer, NULL);
1866 vkDeviceWaitIdle(m_device->device());
1867
1868 VkImageCreateInfo image_create_info = {};
1869 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1870 image_create_info.pNext = NULL;
1871 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1872 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1873 image_create_info.extent.width = 64;
1874 image_create_info.extent.height = 64;
1875 image_create_info.extent.depth = 1;
1876 image_create_info.mipLevels = 1;
1877 image_create_info.arrayLayers = 1;
1878 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1879 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1880 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1881 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1882 image_create_info.queueFamilyIndexCount = 0;
1883 image_create_info.pQueueFamilyIndices = NULL;
1884 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1885 image_create_info.flags = 0;
1886
1887 VkMemoryAllocateInfo mem_alloc = {};
1888 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1889 mem_alloc.pNext = NULL;
1890 mem_alloc.allocationSize = 0;
1891 mem_alloc.memoryTypeIndex = 0;
1892
1893 /* Create a mappable image. It will be the texture if linear images are ok
1894 * to be textures or it will be the staging image if they are not.
1895 */
1896 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1897 ASSERT_VK_SUCCESS(err);
1898
1899 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1900
1901 mem_alloc.allocationSize = mem_reqs.size;
1902
1903 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
1904 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1905 if (!pass) {
1906 vkDestroyImage(m_device->device(), image, NULL);
1907 return;
1908 }
1909
Tobin Ehlis077ded32016-05-12 17:39:13 -06001910 // VALIDATION FAILURE:
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001911 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1912 ASSERT_VK_SUCCESS(err);
1913
1914 m_errorMonitor->VerifyNotFound();
1915
Tony Barbourdf4c0042016-06-01 15:55:43 -06001916 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001917 vkDestroyBuffer(m_device->device(), buffer, NULL);
1918 vkDestroyImage(m_device->device(), image, NULL);
1919}
1920
Tobin Ehlisf11be982016-05-11 13:52:53 -06001921TEST_F(VkLayerTest, InvalidMemoryAliasing) {
1922 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
1923 "buffer and image to memory such that they will alias.");
1924 VkResult err;
1925 bool pass;
1926 ASSERT_NO_FATAL_FAILURE(InitState());
1927
Tobin Ehlis077ded32016-05-12 17:39:13 -06001928 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001929 VkImage image;
1930 VkDeviceMemory mem; // buffer will be bound first
1931 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001932 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001933
1934 VkBufferCreateInfo buf_info = {};
1935 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1936 buf_info.pNext = NULL;
1937 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1938 buf_info.size = 256;
1939 buf_info.queueFamilyIndexCount = 0;
1940 buf_info.pQueueFamilyIndices = NULL;
1941 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1942 buf_info.flags = 0;
1943 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1944 ASSERT_VK_SUCCESS(err);
1945
Tobin Ehlis077ded32016-05-12 17:39:13 -06001946 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001947
1948 VkImageCreateInfo image_create_info = {};
1949 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1950 image_create_info.pNext = NULL;
1951 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1952 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1953 image_create_info.extent.width = 64;
1954 image_create_info.extent.height = 64;
1955 image_create_info.extent.depth = 1;
1956 image_create_info.mipLevels = 1;
1957 image_create_info.arrayLayers = 1;
1958 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1959 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1960 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1961 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1962 image_create_info.queueFamilyIndexCount = 0;
1963 image_create_info.pQueueFamilyIndices = NULL;
1964 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1965 image_create_info.flags = 0;
1966
Tobin Ehlisf11be982016-05-11 13:52:53 -06001967 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1968 ASSERT_VK_SUCCESS(err);
1969
Tobin Ehlis077ded32016-05-12 17:39:13 -06001970 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1971
1972 VkMemoryAllocateInfo alloc_info = {};
1973 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1974 alloc_info.pNext = NULL;
1975 alloc_info.memoryTypeIndex = 0;
1976 // Ensure memory is big enough for both bindings
1977 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
1978 pass = m_device->phy().set_memory_type(
1979 buff_mem_reqs.memoryTypeBits | img_mem_reqs.memoryTypeBits, &alloc_info,
1980 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001981 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001982 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001983 vkDestroyImage(m_device->device(), image, NULL);
1984 return;
1985 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001986 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1987 ASSERT_VK_SUCCESS(err);
1988 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1989 ASSERT_VK_SUCCESS(err);
1990
Tobin Ehlisf11be982016-05-11 13:52:53 -06001991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1992 " is aliased with buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001993 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001994 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1995 m_errorMonitor->VerifyFound();
1996
1997 // Now correctly bind image to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001998 // aliasing buffer2
1999 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
2000 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002001 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
2002 ASSERT_VK_SUCCESS(err);
2003 err = vkBindImageMemory(m_device->device(), image, mem_img, 0);
2004 ASSERT_VK_SUCCESS(err);
2005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2006 " is aliased with image 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06002007 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002008 m_errorMonitor->VerifyFound();
2009
2010 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06002011 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002012 vkDestroyImage(m_device->device(), image, NULL);
2013 vkFreeMemory(m_device->device(), mem, NULL);
2014 vkFreeMemory(m_device->device(), mem_img, NULL);
2015}
2016
Tobin Ehlis35372522016-05-12 08:32:31 -06002017TEST_F(VkLayerTest, InvalidMemoryMapping) {
2018 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
2019 VkResult err;
2020 bool pass;
2021 ASSERT_NO_FATAL_FAILURE(InitState());
2022
2023 VkBuffer buffer;
2024 VkDeviceMemory mem;
2025 VkMemoryRequirements mem_reqs;
2026
2027 VkBufferCreateInfo buf_info = {};
2028 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2029 buf_info.pNext = NULL;
2030 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2031 buf_info.size = 256;
2032 buf_info.queueFamilyIndexCount = 0;
2033 buf_info.pQueueFamilyIndices = NULL;
2034 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2035 buf_info.flags = 0;
2036 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
2037 ASSERT_VK_SUCCESS(err);
2038
2039 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
2040 VkMemoryAllocateInfo alloc_info = {};
2041 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2042 alloc_info.pNext = NULL;
2043 alloc_info.memoryTypeIndex = 0;
2044
2045 // Ensure memory is big enough for both bindings
2046 static const VkDeviceSize allocation_size = 0x10000;
2047 alloc_info.allocationSize = allocation_size;
2048 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2049 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2050 if (!pass) {
2051 vkDestroyBuffer(m_device->device(), buffer, NULL);
2052 return;
2053 }
2054 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2055 ASSERT_VK_SUCCESS(err);
2056
2057 uint8_t *pData;
2058 // Attempt to map memory size 0 is invalid
2059 m_errorMonitor->SetDesiredFailureMsg(
2060 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2061 "VkMapMemory: Attempting to map memory range of size zero");
2062 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
2063 m_errorMonitor->VerifyFound();
2064 // Map memory twice
2065 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2066 (void **)&pData);
2067 ASSERT_VK_SUCCESS(err);
2068 m_errorMonitor->SetDesiredFailureMsg(
2069 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2070 "VkMapMemory: Attempting to map memory on an already-mapped object ");
2071 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2072 (void **)&pData);
2073 m_errorMonitor->VerifyFound();
2074
2075 // Unmap the memory to avoid re-map error
2076 vkUnmapMemory(m_device->device(), mem);
2077 // overstep allocation with VK_WHOLE_SIZE
2078 m_errorMonitor->SetDesiredFailureMsg(
2079 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2080 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
2081 err = vkMapMemory(m_device->device(), mem, allocation_size + 1,
2082 VK_WHOLE_SIZE, 0, (void **)&pData);
2083 m_errorMonitor->VerifyFound();
2084 // overstep allocation w/o VK_WHOLE_SIZE
2085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2086 " oversteps total array size 0x");
2087 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0,
2088 (void **)&pData);
2089 m_errorMonitor->VerifyFound();
2090 // Now error due to unmapping memory that's not mapped
2091 m_errorMonitor->SetDesiredFailureMsg(
2092 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2093 "Unmapping Memory without memory being mapped: ");
2094 vkUnmapMemory(m_device->device(), mem);
2095 m_errorMonitor->VerifyFound();
2096 // Now map memory and cause errors due to flushing invalid ranges
2097 err = vkMapMemory(m_device->device(), mem, 16, VK_WHOLE_SIZE, 0,
2098 (void **)&pData);
2099 ASSERT_VK_SUCCESS(err);
2100 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12002101 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06002102 mmr.memory = mem;
2103 mmr.offset = 15; // Error b/c offset less than offset of mapped mem
2104 m_errorMonitor->SetDesiredFailureMsg(
2105 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2106 ") is less than Memory Object's offset (");
2107 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2108 m_errorMonitor->VerifyFound();
2109 // Now flush range that oversteps mapped range
2110 vkUnmapMemory(m_device->device(), mem);
2111 err = vkMapMemory(m_device->device(), mem, 0, 256, 0, (void **)&pData);
2112 ASSERT_VK_SUCCESS(err);
2113 mmr.offset = 16;
2114 mmr.size = 256; // flushing bounds (272) exceed mapped bounds (256)
2115 m_errorMonitor->SetDesiredFailureMsg(
2116 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2117 ") exceeds the Memory Object's upper-bound (");
2118 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2119 m_errorMonitor->VerifyFound();
2120
2121 pass =
2122 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2123 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
2124 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
2125 if (!pass) {
2126 vkFreeMemory(m_device->device(), mem, NULL);
2127 vkDestroyBuffer(m_device->device(), buffer, NULL);
2128 return;
2129 }
2130 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
2131 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
2132
2133 vkDestroyBuffer(m_device->device(), buffer, NULL);
2134 vkFreeMemory(m_device->device(), mem, NULL);
2135}
2136
Ian Elliott1c32c772016-04-28 14:47:13 -06002137TEST_F(VkLayerTest, EnableWsiBeforeUse) {
2138 VkResult err;
2139 bool pass;
2140
Ian Elliott489eec02016-05-05 14:12:44 -06002141// FIXME: After we turn on this code for non-Linux platforms, uncomment the
2142// following declaration (which is temporarily being moved below):
2143// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002144 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2145 VkSwapchainCreateInfoKHR swapchain_create_info = {};
2146 uint32_t swapchain_image_count = 0;
2147// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2148 uint32_t image_index = 0;
2149// VkPresentInfoKHR present_info = {};
2150
2151 ASSERT_NO_FATAL_FAILURE(InitState());
2152
Ian Elliott3f06ce52016-04-29 14:46:21 -06002153#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
2154#if defined(VK_USE_PLATFORM_ANDROID_KHR)
2155 // Use the functions from the VK_KHR_android_surface extension without
2156 // enabling that extension:
2157
2158 // Create a surface:
2159 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002160 m_errorMonitor->SetDesiredFailureMsg(
2161 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2162 "extension was not enabled for this");
2163 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
2164 &surface);
2165 pass = (err != VK_SUCCESS);
2166 ASSERT_TRUE(pass);
2167 m_errorMonitor->VerifyFound();
2168#endif // VK_USE_PLATFORM_ANDROID_KHR
2169
2170
2171#if defined(VK_USE_PLATFORM_MIR_KHR)
2172 // Use the functions from the VK_KHR_mir_surface extension without enabling
2173 // that extension:
2174
2175 // Create a surface:
2176 VkMirSurfaceCreateInfoKHR mir_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002177 m_errorMonitor->SetDesiredFailureMsg(
2178 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2179 "extension was not enabled for this");
2180 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
2181 pass = (err != VK_SUCCESS);
2182 ASSERT_TRUE(pass);
2183 m_errorMonitor->VerifyFound();
2184
2185 // Tell whether an mir_connection supports presentation:
2186 MirConnection *mir_connection = NULL;
2187 m_errorMonitor->SetDesiredFailureMsg(
2188 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2189 "extension was not enabled for this");
2190 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
2191 visual_id);
2192 m_errorMonitor->VerifyFound();
2193#endif // VK_USE_PLATFORM_MIR_KHR
2194
2195
2196#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
2197 // Use the functions from the VK_KHR_wayland_surface extension without
2198 // enabling that extension:
2199
2200 // Create a surface:
2201 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002202 m_errorMonitor->SetDesiredFailureMsg(
2203 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2204 "extension was not enabled for this");
2205 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
2206 &surface);
2207 pass = (err != VK_SUCCESS);
2208 ASSERT_TRUE(pass);
2209 m_errorMonitor->VerifyFound();
2210
2211 // Tell whether an wayland_display supports presentation:
2212 struct wl_display wayland_display = {};
2213 m_errorMonitor->SetDesiredFailureMsg(
2214 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2215 "extension was not enabled for this");
2216 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
2217 &wayland_display);
2218 m_errorMonitor->VerifyFound();
2219#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06002220#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06002221
2222
2223#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002224// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2225// TO NON-LINUX PLATFORMS:
2226VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06002227 // Use the functions from the VK_KHR_win32_surface extension without
2228 // enabling that extension:
2229
2230 // Create a surface:
2231 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002232 m_errorMonitor->SetDesiredFailureMsg(
2233 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2234 "extension was not enabled for this");
2235 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
2236 &surface);
2237 pass = (err != VK_SUCCESS);
2238 ASSERT_TRUE(pass);
2239 m_errorMonitor->VerifyFound();
2240
2241 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002242 m_errorMonitor->SetDesiredFailureMsg(
2243 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2244 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06002245 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002246 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002247// Set this (for now, until all platforms are supported and tested):
2248#define NEED_TO_TEST_THIS_ON_PLATFORM
2249#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06002250
2251
Ian Elliott1c32c772016-04-28 14:47:13 -06002252#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002253// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2254// TO NON-LINUX PLATFORMS:
2255VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002256 // Use the functions from the VK_KHR_xcb_surface extension without enabling
2257 // that extension:
2258
2259 // Create a surface:
2260 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06002261 m_errorMonitor->SetDesiredFailureMsg(
2262 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2263 "extension was not enabled for this");
2264 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2265 pass = (err != VK_SUCCESS);
2266 ASSERT_TRUE(pass);
2267 m_errorMonitor->VerifyFound();
2268
2269 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002270 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002271 xcb_visualid_t visual_id = 0;
2272 m_errorMonitor->SetDesiredFailureMsg(
2273 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2274 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06002275 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06002276 visual_id);
2277 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002278// Set this (for now, until all platforms are supported and tested):
2279#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002280#endif // VK_USE_PLATFORM_XCB_KHR
2281
2282
Ian Elliott12630812016-04-29 14:35:43 -06002283#if defined(VK_USE_PLATFORM_XLIB_KHR)
2284 // Use the functions from the VK_KHR_xlib_surface extension without enabling
2285 // that extension:
2286
2287 // Create a surface:
2288 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
Ian Elliott12630812016-04-29 14:35:43 -06002289 m_errorMonitor->SetDesiredFailureMsg(
2290 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2291 "extension was not enabled for this");
2292 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
2293 pass = (err != VK_SUCCESS);
2294 ASSERT_TRUE(pass);
2295 m_errorMonitor->VerifyFound();
2296
2297 // Tell whether an Xlib VisualID supports presentation:
2298 Display *dpy = NULL;
2299 VisualID visual = 0;
2300 m_errorMonitor->SetDesiredFailureMsg(
2301 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2302 "extension was not enabled for this");
2303 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
2304 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002305// Set this (for now, until all platforms are supported and tested):
2306#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06002307#endif // VK_USE_PLATFORM_XLIB_KHR
2308
2309
Ian Elliott1c32c772016-04-28 14:47:13 -06002310 // Use the functions from the VK_KHR_surface extension without enabling
2311 // that extension:
2312
Ian Elliott489eec02016-05-05 14:12:44 -06002313#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002314 // Destroy a surface:
2315 m_errorMonitor->SetDesiredFailureMsg(
2316 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2317 "extension was not enabled for this");
2318 vkDestroySurfaceKHR(instance(), surface, NULL);
2319 m_errorMonitor->VerifyFound();
2320
2321 // Check if surface supports presentation:
2322 VkBool32 supported = false;
2323 m_errorMonitor->SetDesiredFailureMsg(
2324 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2325 "extension was not enabled for this");
2326 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2327 pass = (err != VK_SUCCESS);
2328 ASSERT_TRUE(pass);
2329 m_errorMonitor->VerifyFound();
2330
2331 // Check surface capabilities:
2332 VkSurfaceCapabilitiesKHR capabilities = {};
2333 m_errorMonitor->SetDesiredFailureMsg(
2334 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2335 "extension was not enabled for this");
2336 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2337 &capabilities);
2338 pass = (err != VK_SUCCESS);
2339 ASSERT_TRUE(pass);
2340 m_errorMonitor->VerifyFound();
2341
2342 // Check surface formats:
2343 uint32_t format_count = 0;
2344 VkSurfaceFormatKHR *formats = NULL;
2345 m_errorMonitor->SetDesiredFailureMsg(
2346 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2347 "extension was not enabled for this");
2348 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2349 &format_count, formats);
2350 pass = (err != VK_SUCCESS);
2351 ASSERT_TRUE(pass);
2352 m_errorMonitor->VerifyFound();
2353
2354 // Check surface present modes:
2355 uint32_t present_mode_count = 0;
2356 VkSurfaceFormatKHR *present_modes = NULL;
2357 m_errorMonitor->SetDesiredFailureMsg(
2358 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2359 "extension was not enabled for this");
2360 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2361 &present_mode_count, present_modes);
2362 pass = (err != VK_SUCCESS);
2363 ASSERT_TRUE(pass);
2364 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002365#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002366
2367
2368 // Use the functions from the VK_KHR_swapchain extension without enabling
2369 // that extension:
2370
2371 // Create a swapchain:
2372 m_errorMonitor->SetDesiredFailureMsg(
2373 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2374 "extension was not enabled for this");
2375 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2376 swapchain_create_info.pNext = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002377 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
2378 NULL, &swapchain);
2379 pass = (err != VK_SUCCESS);
2380 ASSERT_TRUE(pass);
2381 m_errorMonitor->VerifyFound();
2382
2383 // Get the images from the swapchain:
2384 m_errorMonitor->SetDesiredFailureMsg(
2385 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2386 "extension was not enabled for this");
2387 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
2388 &swapchain_image_count, NULL);
2389 pass = (err != VK_SUCCESS);
2390 ASSERT_TRUE(pass);
2391 m_errorMonitor->VerifyFound();
2392
2393 // Try to acquire an image:
2394 m_errorMonitor->SetDesiredFailureMsg(
2395 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2396 "extension was not enabled for this");
2397 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
2398 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
2399 pass = (err != VK_SUCCESS);
2400 ASSERT_TRUE(pass);
2401 m_errorMonitor->VerifyFound();
2402
2403 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002404 //
2405 // NOTE: Currently can't test this because a real swapchain is needed (as
2406 // opposed to the fake one we created) in order for the layer to lookup the
2407 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06002408
2409 // Destroy the swapchain:
2410 m_errorMonitor->SetDesiredFailureMsg(
2411 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2412 "extension was not enabled for this");
2413 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
2414 m_errorMonitor->VerifyFound();
2415}
2416
Ian Elliott2c1daf52016-05-12 09:41:46 -06002417TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
Ian Elliott2c1daf52016-05-12 09:41:46 -06002418
Dustin Graves6c6d8982016-05-17 10:09:21 -06002419#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott2c1daf52016-05-12 09:41:46 -06002420 VkSurfaceKHR surface = VK_NULL_HANDLE;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002421
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002422 VkResult err;
2423 bool pass;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002424 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2425 VkSwapchainCreateInfoKHR swapchain_create_info = {};
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002426 // uint32_t swapchain_image_count = 0;
2427 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2428 // uint32_t image_index = 0;
2429 // VkPresentInfoKHR present_info = {};
Ian Elliott2c1daf52016-05-12 09:41:46 -06002430
2431 ASSERT_NO_FATAL_FAILURE(InitState());
2432
2433 // Use the create function from one of the VK_KHR_*_surface extension in
2434 // order to create a surface, testing all known errors in the process,
2435 // before successfully creating a surface:
2436 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2438 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002439 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
2440 pass = (err != VK_SUCCESS);
2441 ASSERT_TRUE(pass);
2442 m_errorMonitor->VerifyFound();
2443
2444 // Next, try to create a surface with the wrong
2445 // VkXcbSurfaceCreateInfoKHR::sType:
2446 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
2447 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2449 "called with the wrong value for");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002450 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2451 pass = (err != VK_SUCCESS);
2452 ASSERT_TRUE(pass);
2453 m_errorMonitor->VerifyFound();
2454
Ian Elliott2c1daf52016-05-12 09:41:46 -06002455 // Create a native window, and then correctly create a surface:
2456 xcb_connection_t *connection;
2457 xcb_screen_t *screen;
2458 xcb_window_t xcb_window;
2459 xcb_intern_atom_reply_t *atom_wm_delete_window;
2460
2461 const xcb_setup_t *setup;
2462 xcb_screen_iterator_t iter;
2463 int scr;
2464 uint32_t value_mask, value_list[32];
2465 int width = 1;
2466 int height = 1;
2467
2468 connection = xcb_connect(NULL, &scr);
2469 ASSERT_TRUE(connection != NULL);
2470 setup = xcb_get_setup(connection);
2471 iter = xcb_setup_roots_iterator(setup);
2472 while (scr-- > 0)
2473 xcb_screen_next(&iter);
2474 screen = iter.data;
2475
2476 xcb_window = xcb_generate_id(connection);
2477
2478 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
2479 value_list[0] = screen->black_pixel;
2480 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE |
2481 XCB_EVENT_MASK_STRUCTURE_NOTIFY;
2482
2483 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window,
2484 screen->root, 0, 0, width, height, 0,
2485 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual,
2486 value_mask, value_list);
2487
2488 /* Magic code that will send notification when window is destroyed */
2489 xcb_intern_atom_cookie_t cookie =
2490 xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
2491 xcb_intern_atom_reply_t *reply =
2492 xcb_intern_atom_reply(connection, cookie, 0);
2493
2494 xcb_intern_atom_cookie_t cookie2 =
2495 xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002496 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002497 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window,
2498 (*reply).atom, 4, 32, 1,
2499 &(*atom_wm_delete_window).atom);
2500 free(reply);
2501
2502 xcb_map_window(connection, xcb_window);
2503
2504 // Force the x/y coordinates to 100,100 results are identical in consecutive
2505 // runs
2506 const uint32_t coords[] = {100, 100};
2507 xcb_configure_window(connection, xcb_window,
2508 XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
2509
Ian Elliott2c1daf52016-05-12 09:41:46 -06002510 // Finally, try to correctly create a surface:
2511 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
2512 xcb_create_info.pNext = NULL;
2513 xcb_create_info.flags = 0;
2514 xcb_create_info.connection = connection;
2515 xcb_create_info.window = xcb_window;
2516 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2517 pass = (err == VK_SUCCESS);
2518 ASSERT_TRUE(pass);
2519
Ian Elliott2c1daf52016-05-12 09:41:46 -06002520 // Check if surface supports presentation:
2521
2522 // 1st, do so without having queried the queue families:
2523 VkBool32 supported = false;
2524 // TODO: Get the following error to come out:
2525 m_errorMonitor->SetDesiredFailureMsg(
2526 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2527 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
2528 "function");
2529 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2530 pass = (err != VK_SUCCESS);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002531 // ASSERT_TRUE(pass);
2532 // m_errorMonitor->VerifyFound();
Ian Elliott2c1daf52016-05-12 09:41:46 -06002533
2534 // Next, query a queue family index that's too large:
2535 m_errorMonitor->SetDesiredFailureMsg(
2536 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2537 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002538 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface,
2539 &supported);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002540 pass = (err != VK_SUCCESS);
2541 ASSERT_TRUE(pass);
2542 m_errorMonitor->VerifyFound();
2543
2544 // Finally, do so correctly:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002545 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2546 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002547 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2548 pass = (err == VK_SUCCESS);
2549 ASSERT_TRUE(pass);
2550
Ian Elliott2c1daf52016-05-12 09:41:46 -06002551 // Before proceeding, try to create a swapchain without having called
2552 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
2553 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2554 swapchain_create_info.pNext = NULL;
2555 swapchain_create_info.flags = 0;
2556 m_errorMonitor->SetDesiredFailureMsg(
2557 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2558 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002559 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2560 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002561 pass = (err != VK_SUCCESS);
2562 ASSERT_TRUE(pass);
2563 m_errorMonitor->VerifyFound();
2564
Ian Elliott2c1daf52016-05-12 09:41:46 -06002565 // Get the surface capabilities:
2566 VkSurfaceCapabilitiesKHR surface_capabilities;
2567
2568 // Do so correctly (only error logged by this entrypoint is if the
2569 // extension isn't enabled):
2570 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2571 &surface_capabilities);
2572 pass = (err == VK_SUCCESS);
2573 ASSERT_TRUE(pass);
2574
Ian Elliott2c1daf52016-05-12 09:41:46 -06002575 // Get the surface formats:
2576 uint32_t surface_format_count;
2577
2578 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2580 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002581 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
2582 pass = (err == VK_SUCCESS);
2583 ASSERT_TRUE(pass);
2584 m_errorMonitor->VerifyFound();
2585
2586 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
2587 // correctly done a 1st try (to get the count):
2588 m_errorMonitor->SetDesiredFailureMsg(
2589 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2590 "but no prior positive value has been seen for");
2591 surface_format_count = 0;
2592 vkGetPhysicalDeviceSurfaceFormatsKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002593 gpu(), surface, &surface_format_count,
2594 (VkSurfaceFormatKHR *)&surface_format_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002595 pass = (err == VK_SUCCESS);
2596 ASSERT_TRUE(pass);
2597 m_errorMonitor->VerifyFound();
2598
2599 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002600 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2601 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002602 pass = (err == VK_SUCCESS);
2603 ASSERT_TRUE(pass);
2604
2605 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002606 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(
2607 surface_format_count * sizeof(VkSurfaceFormatKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002608
2609 // Next, do a 2nd try with surface_format_count being set too high:
2610 surface_format_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2612 "that is greater than the value");
2613 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002614 surface_formats);
2615 pass = (err == VK_SUCCESS);
2616 ASSERT_TRUE(pass);
2617 m_errorMonitor->VerifyFound();
2618
2619 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002620 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2621 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002622 pass = (err == VK_SUCCESS);
2623 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002624 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002625 surface_formats);
2626 pass = (err == VK_SUCCESS);
2627 ASSERT_TRUE(pass);
2628
Ian Elliott2c1daf52016-05-12 09:41:46 -06002629 // Get the surface present modes:
2630 uint32_t surface_present_mode_count;
2631
2632 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2634 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002635 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
2636 pass = (err == VK_SUCCESS);
2637 ASSERT_TRUE(pass);
2638 m_errorMonitor->VerifyFound();
2639
2640 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
2641 // correctly done a 1st try (to get the count):
2642 m_errorMonitor->SetDesiredFailureMsg(
2643 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2644 "but no prior positive value has been seen for");
2645 surface_present_mode_count = 0;
2646 vkGetPhysicalDeviceSurfacePresentModesKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002647 gpu(), surface, &surface_present_mode_count,
2648 (VkPresentModeKHR *)&surface_present_mode_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002649 pass = (err == VK_SUCCESS);
2650 ASSERT_TRUE(pass);
2651 m_errorMonitor->VerifyFound();
2652
2653 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002654 vkGetPhysicalDeviceSurfacePresentModesKHR(
2655 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002656 pass = (err == VK_SUCCESS);
2657 ASSERT_TRUE(pass);
2658
2659 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002660 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(
2661 surface_present_mode_count * sizeof(VkPresentModeKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002662
2663 // Next, do a 2nd try with surface_format_count being set too high:
2664 surface_present_mode_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2666 "that is greater than the value");
2667 vkGetPhysicalDeviceSurfacePresentModesKHR(
2668 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002669 pass = (err == VK_SUCCESS);
2670 ASSERT_TRUE(pass);
2671 m_errorMonitor->VerifyFound();
2672
2673 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002674 vkGetPhysicalDeviceSurfacePresentModesKHR(
2675 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002676 pass = (err == VK_SUCCESS);
2677 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002678 vkGetPhysicalDeviceSurfacePresentModesKHR(
2679 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002680 pass = (err == VK_SUCCESS);
2681 ASSERT_TRUE(pass);
2682
Ian Elliott2c1daf52016-05-12 09:41:46 -06002683 // Create a swapchain:
2684
2685 // First, try without a pointer to swapchain_create_info:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2687 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002688 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
2689 pass = (err != VK_SUCCESS);
2690 ASSERT_TRUE(pass);
2691 m_errorMonitor->VerifyFound();
2692
2693 // Next, call with a non-NULL swapchain_create_info, that has the wrong
2694 // sType:
2695 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2697 "called with the wrong value for");
2698 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2699 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002700 pass = (err != VK_SUCCESS);
2701 ASSERT_TRUE(pass);
2702 m_errorMonitor->VerifyFound();
2703
2704 // Next, call with a NULL swapchain pointer:
2705 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2706 swapchain_create_info.pNext = NULL;
2707 swapchain_create_info.flags = 0;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2709 "called with NULL pointer");
2710 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2711 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002712 pass = (err != VK_SUCCESS);
2713 ASSERT_TRUE(pass);
2714 m_errorMonitor->VerifyFound();
2715
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002716 // TODO: Enhance swapchain layer so that
2717 // swapchain_create_info.queueFamilyIndexCount is checked against something?
Ian Elliott2c1daf52016-05-12 09:41:46 -06002718
2719 // Next, call with a queue family index that's too large:
2720 uint32_t queueFamilyIndex[2] = {100000, 0};
2721 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2722 swapchain_create_info.queueFamilyIndexCount = 2;
2723 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
2724 m_errorMonitor->SetDesiredFailureMsg(
2725 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2726 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002727 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2728 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002729 pass = (err != VK_SUCCESS);
2730 ASSERT_TRUE(pass);
2731 m_errorMonitor->VerifyFound();
2732
2733 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
2734 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2735 swapchain_create_info.queueFamilyIndexCount = 1;
2736 m_errorMonitor->SetDesiredFailureMsg(
2737 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2738 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
2739 "pCreateInfo->pQueueFamilyIndices).");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002740 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2741 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002742 pass = (err != VK_SUCCESS);
2743 ASSERT_TRUE(pass);
2744 m_errorMonitor->VerifyFound();
2745
2746 // Next, call with an invalid imageSharingMode:
2747 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
2748 swapchain_create_info.queueFamilyIndexCount = 1;
2749 m_errorMonitor->SetDesiredFailureMsg(
2750 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2751 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002752 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2753 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002754 pass = (err != VK_SUCCESS);
2755 ASSERT_TRUE(pass);
2756 m_errorMonitor->VerifyFound();
2757 // Fix for the future:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002758 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2759 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002760 swapchain_create_info.queueFamilyIndexCount = 0;
2761 queueFamilyIndex[0] = 0;
2762 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
2763
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002764 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
Ian Elliott2c1daf52016-05-12 09:41:46 -06002765 // Get the images from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002766 // Acquire an image from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002767 // Present an image to a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002768 // Destroy the swapchain:
2769
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002770 // TODOs:
2771 //
2772 // - Try destroying the device without first destroying the swapchain
2773 //
2774 // - Try destroying the device without first destroying the surface
2775 //
2776 // - Try destroying the surface without first destroying the swapchain
Ian Elliott2c1daf52016-05-12 09:41:46 -06002777
2778 // Destroy the surface:
2779 vkDestroySurfaceKHR(instance(), surface, NULL);
2780
Ian Elliott2c1daf52016-05-12 09:41:46 -06002781 // Tear down the window:
2782 xcb_destroy_window(connection, xcb_window);
2783 xcb_disconnect(connection);
2784
2785#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002786 return;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002787#endif // VK_USE_PLATFORM_XCB_KHR
2788}
2789
Karl Schultz6addd812016-02-02 17:17:23 -07002790TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2791 VkResult err;
2792 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002793
Karl Schultz6addd812016-02-02 17:17:23 -07002794 m_errorMonitor->SetDesiredFailureMsg(
2795 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002796 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
2797
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002798 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002799
2800 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002801 VkImage image;
2802 VkDeviceMemory mem;
2803 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002804
Karl Schultz6addd812016-02-02 17:17:23 -07002805 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2806 const int32_t tex_width = 32;
2807 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002808
Tony Barboureb254902015-07-15 12:50:33 -06002809 VkImageCreateInfo image_create_info = {};
2810 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002811 image_create_info.pNext = NULL;
2812 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2813 image_create_info.format = tex_format;
2814 image_create_info.extent.width = tex_width;
2815 image_create_info.extent.height = tex_height;
2816 image_create_info.extent.depth = 1;
2817 image_create_info.mipLevels = 1;
2818 image_create_info.arrayLayers = 1;
2819 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2820 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2821 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2822 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002823
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002824 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002825 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002826 mem_alloc.pNext = NULL;
2827 mem_alloc.allocationSize = 0;
2828 // Introduce failure, do NOT set memProps to
2829 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
2830 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002831
Chia-I Wuf7458c52015-10-26 21:10:41 +08002832 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002833 ASSERT_VK_SUCCESS(err);
2834
Karl Schultz6addd812016-02-02 17:17:23 -07002835 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002836
Mark Lobodzinski23065352015-05-29 09:32:35 -05002837 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002838
Karl Schultz6addd812016-02-02 17:17:23 -07002839 pass =
2840 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
2841 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2842 if (!pass) { // If we can't find any unmappable memory this test doesn't
2843 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002844 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002845 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002846 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002847
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002848 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002849 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002850 ASSERT_VK_SUCCESS(err);
2851
2852 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002853 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002854 ASSERT_VK_SUCCESS(err);
2855
2856 // Map memory as if to initialize the image
2857 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002858 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
2859 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002860
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002861 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002862
Chia-I Wuf7458c52015-10-26 21:10:41 +08002863 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002864 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002865}
2866
Karl Schultz6addd812016-02-02 17:17:23 -07002867TEST_F(VkLayerTest, RebindMemory) {
2868 VkResult err;
2869 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002870
Karl Schultz6addd812016-02-02 17:17:23 -07002871 m_errorMonitor->SetDesiredFailureMsg(
2872 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002873 "which has already been bound to mem object");
2874
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002875 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002876
2877 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002878 VkImage image;
2879 VkDeviceMemory mem1;
2880 VkDeviceMemory mem2;
2881 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002882
Karl Schultz6addd812016-02-02 17:17:23 -07002883 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2884 const int32_t tex_width = 32;
2885 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002886
Tony Barboureb254902015-07-15 12:50:33 -06002887 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002888 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2889 image_create_info.pNext = NULL;
2890 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2891 image_create_info.format = tex_format;
2892 image_create_info.extent.width = tex_width;
2893 image_create_info.extent.height = tex_height;
2894 image_create_info.extent.depth = 1;
2895 image_create_info.mipLevels = 1;
2896 image_create_info.arrayLayers = 1;
2897 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2898 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2899 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2900 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002901
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002902 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002903 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2904 mem_alloc.pNext = NULL;
2905 mem_alloc.allocationSize = 0;
2906 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002907
Karl Schultz6addd812016-02-02 17:17:23 -07002908 // Introduce failure, do NOT set memProps to
2909 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002910 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002911 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002912 ASSERT_VK_SUCCESS(err);
2913
Karl Schultz6addd812016-02-02 17:17:23 -07002914 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002915
2916 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002917 pass =
2918 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002919 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002920
2921 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002922 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002923 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002924 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002925 ASSERT_VK_SUCCESS(err);
2926
2927 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002928 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002929 ASSERT_VK_SUCCESS(err);
2930
Karl Schultz6addd812016-02-02 17:17:23 -07002931 // Introduce validation failure, try to bind a different memory object to
2932 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002933 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002934
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002935 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002936
Chia-I Wuf7458c52015-10-26 21:10:41 +08002937 vkDestroyImage(m_device->device(), image, NULL);
2938 vkFreeMemory(m_device->device(), mem1, NULL);
2939 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002940}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002941
Karl Schultz6addd812016-02-02 17:17:23 -07002942TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002943 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002944
Karl Schultz6addd812016-02-02 17:17:23 -07002945 m_errorMonitor->SetDesiredFailureMsg(
2946 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
2947 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002948
2949 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002950 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2951 fenceInfo.pNext = NULL;
2952 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002953
Tony Barbour300a6082015-04-07 13:44:53 -06002954 ASSERT_NO_FATAL_FAILURE(InitState());
2955 ASSERT_NO_FATAL_FAILURE(InitViewport());
2956 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2957
Tony Barbourfe3351b2015-07-28 10:17:20 -06002958 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002959 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2960 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06002961 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002962
2963 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002964
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002965 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002966 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2967 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002968 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002969 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002970 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002971 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002972 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002973 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002974 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002975
2976 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002977 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002978
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002979 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002980}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002981// This is a positive test. We used to expect error in this case but spec now
2982// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07002983TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002984 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002985 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002986 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002987 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2988 fenceInfo.pNext = NULL;
2989
Tony Barbour0b4d9562015-04-09 10:48:04 -06002990 ASSERT_NO_FATAL_FAILURE(InitState());
2991 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08002992 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002993 VkResult result = vkResetFences(m_device->device(), 1, fences);
2994 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06002995
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002996 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06002997}
Tobin Ehlis41376e12015-07-03 08:45:14 -06002998
Chris Forbese70b7d32016-06-15 15:49:12 +12002999#if 0
3000TEST_F(VkLayerTest, LongFenceChain)
3001{
3002 m_errorMonitor->ExpectSuccess();
3003
3004 ASSERT_NO_FATAL_FAILURE(InitState());
3005 VkResult err;
3006
3007 std::vector<VkFence> fences;
3008
3009 const int chainLength = 32768;
3010
3011 for (int i = 0; i < chainLength; i++) {
3012 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3013 VkFence fence;
3014 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3015 ASSERT_VK_SUCCESS(err);
3016
3017 fences.push_back(fence);
3018
3019 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3020 0, nullptr, 0, nullptr };
3021 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3022 ASSERT_VK_SUCCESS(err);
3023
3024 }
3025
3026 // BOOM, stack overflow.
3027 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
3028
3029 for (auto fence : fences)
3030 vkDestroyFence(m_device->device(), fence, nullptr);
3031
3032 m_errorMonitor->VerifyNotFound();
3033}
3034#endif
3035
Chris Forbes18127d12016-06-08 16:52:28 +12003036TEST_F(VkLayerTest, CommandBufferSimultaneousUseSync)
3037{
3038 m_errorMonitor->ExpectSuccess();
3039
3040 ASSERT_NO_FATAL_FAILURE(InitState());
3041 VkResult err;
3042
3043 // Record (empty!) command buffer that can be submitted multiple times
3044 // simultaneously.
3045 VkCommandBufferBeginInfo cbbi = {
3046 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
3047 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr
3048 };
3049 m_commandBuffer->BeginCommandBuffer(&cbbi);
3050 m_commandBuffer->EndCommandBuffer();
3051
3052 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3053 VkFence fence;
3054 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3055 ASSERT_VK_SUCCESS(err);
3056
3057 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
3058 VkSemaphore s1, s2;
3059 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
3060 ASSERT_VK_SUCCESS(err);
3061 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
3062 ASSERT_VK_SUCCESS(err);
3063
3064 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
3065 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3066 1, &m_commandBuffer->handle(), 1, &s1 };
3067 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3068 ASSERT_VK_SUCCESS(err);
3069
3070 // Submit CB again, signaling s2.
3071 si.pSignalSemaphores = &s2;
3072 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
3073 ASSERT_VK_SUCCESS(err);
3074
3075 // Wait for fence.
3076 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3077 ASSERT_VK_SUCCESS(err);
3078
3079 // CB is still in flight from second submission, but semaphore s1 is no
3080 // longer in flight. delete it.
3081 vkDestroySemaphore(m_device->device(), s1, nullptr);
3082
3083 m_errorMonitor->VerifyNotFound();
3084
3085 // Force device idle and clean up remaining objects
3086 vkDeviceWaitIdle(m_device->device());
3087 vkDestroySemaphore(m_device->device(), s2, nullptr);
3088 vkDestroyFence(m_device->device(), fence, nullptr);
3089}
3090
Chris Forbes4e44c912016-06-16 10:20:00 +12003091TEST_F(VkLayerTest, FenceCreateSignaledWaitHandling)
3092{
3093 m_errorMonitor->ExpectSuccess();
3094
3095 ASSERT_NO_FATAL_FAILURE(InitState());
3096 VkResult err;
3097
3098 // A fence created signaled
3099 VkFenceCreateInfo fci1 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
3100 VkFence f1;
3101 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
3102 ASSERT_VK_SUCCESS(err);
3103
3104 // A fence created not
3105 VkFenceCreateInfo fci2 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3106 VkFence f2;
3107 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
3108 ASSERT_VK_SUCCESS(err);
3109
3110 // Submit the unsignaled fence
3111 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3112 0, nullptr, 0, nullptr };
3113 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
3114
3115 // Wait on both fences, with signaled first.
3116 VkFence fences[] = { f1, f2 };
3117 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
3118
3119 // Should have both retired!
3120 vkDestroyFence(m_device->device(), f1, nullptr);
3121 vkDestroyFence(m_device->device(), f2, nullptr);
3122
3123 m_errorMonitor->VerifyNotFound();
3124}
3125
Tobin Ehlis41376e12015-07-03 08:45:14 -06003126TEST_F(VkLayerTest, InvalidUsageBits)
3127{
Tony Barbourf92621a2016-05-02 14:28:12 -06003128 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003129 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06003130 "Initialize buffer with wrong usage then perform copy expecting errors "
3131 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003133 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06003134
3135 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06003136 VkImageObj image(m_device);
3137 // Initialize image with USAGE_INPUT_ATTACHMENT
Tobin Ehlis8b313c02016-05-25 15:01:52 -06003138 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003139 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3140 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06003141
Tony Barbourf92621a2016-05-02 14:28:12 -06003142 VkImageView dsv;
3143 VkImageViewCreateInfo dsvci = {};
3144 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3145 dsvci.image = image.handle();
3146 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3147 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
3148 dsvci.subresourceRange.layerCount = 1;
3149 dsvci.subresourceRange.baseMipLevel = 0;
3150 dsvci.subresourceRange.levelCount = 1;
3151 dsvci.subresourceRange.aspectMask =
3152 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06003153
Tony Barbourf92621a2016-05-02 14:28:12 -06003154 // Create a view with depth / stencil aspect for image with different usage
3155 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003156
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003157 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06003158
3159 // Initialize buffer with TRANSFER_DST usage
3160 vk_testing::Buffer buffer;
3161 VkMemoryPropertyFlags reqs = 0;
3162 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3163 VkBufferImageCopy region = {};
3164 region.bufferRowLength = 128;
3165 region.bufferImageHeight = 128;
3166 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3167 region.imageSubresource.layerCount = 1;
3168 region.imageExtent.height = 16;
3169 region.imageExtent.width = 16;
3170 region.imageExtent.depth = 1;
3171
3172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3173 "Invalid usage flag for buffer ");
3174 // Buffer usage not set to TRANSFER_SRC and image usage not set to
3175 // TRANSFER_DST
3176 BeginCommandBuffer();
3177 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3178 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3179 1, &region);
3180 m_errorMonitor->VerifyFound();
3181
3182 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3183 "Invalid usage flag for image ");
3184 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3185 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3186 1, &region);
3187 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06003188}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003189#endif // MEM_TRACKER_TESTS
3190
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06003191#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003192
3193TEST_F(VkLayerTest, LeakAnObject) {
3194 VkResult err;
3195
3196 TEST_DESCRIPTION(
3197 "Create a fence and destroy its device without first destroying the fence.");
3198
3199 // Note that we have to create a new device since destroying the
3200 // framework's device causes Teardown() to fail and just calling Teardown
3201 // will destroy the errorMonitor.
3202
3203 m_errorMonitor->SetDesiredFailureMsg(
3204 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3205 "OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT object");
3206
3207 ASSERT_NO_FATAL_FAILURE(InitState());
3208
3209 const std::vector<VkQueueFamilyProperties> queue_props =
3210 m_device->queue_props;
3211 std::vector<VkDeviceQueueCreateInfo> queue_info;
3212 queue_info.reserve(queue_props.size());
3213 std::vector<std::vector<float>> queue_priorities;
3214 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
3215 VkDeviceQueueCreateInfo qi = {};
3216 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
3217 qi.pNext = NULL;
3218 qi.queueFamilyIndex = i;
3219 qi.queueCount = queue_props[i].queueCount;
3220 queue_priorities.emplace_back(qi.queueCount, 0.0f);
3221 qi.pQueuePriorities = queue_priorities[i].data();
3222 queue_info.push_back(qi);
3223 }
3224
3225 std::vector<const char *> device_layer_names;
3226 std::vector<const char *> device_extension_names;
3227 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
3228 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
3229 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
3230 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003231 device_layer_names.push_back("VK_LAYER_LUNARG_image");
3232 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
3233
3234 // The sacrificial device object
3235 VkDevice testDevice;
3236 VkDeviceCreateInfo device_create_info = {};
3237 auto features = m_device->phy().features();
3238 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
3239 device_create_info.pNext = NULL;
3240 device_create_info.queueCreateInfoCount = queue_info.size();
3241 device_create_info.pQueueCreateInfos = queue_info.data();
3242 device_create_info.enabledLayerCount = device_layer_names.size();
3243 device_create_info.ppEnabledLayerNames = device_layer_names.data();
3244 device_create_info.pEnabledFeatures = &features;
3245 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
3246 ASSERT_VK_SUCCESS(err);
3247
3248 VkFence fence;
3249 VkFenceCreateInfo fence_create_info = {};
3250 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3251 fence_create_info.pNext = NULL;
3252 fence_create_info.flags = 0;
3253 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
3254 ASSERT_VK_SUCCESS(err);
3255
3256 // Induce failure by not calling vkDestroyFence
3257 vkDestroyDevice(testDevice, NULL);
3258 m_errorMonitor->VerifyFound();
3259}
3260
3261TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
3262
3263 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
3264 "attempt to delete them from another.");
3265
3266 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3267 "FreeCommandBuffers is attempting to free Command Buffer");
3268
3269 VkCommandPool command_pool_one;
3270 VkCommandPool command_pool_two;
3271
3272 VkCommandPoolCreateInfo pool_create_info{};
3273 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3274 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3275 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3276
3277 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3278 &command_pool_one);
3279
3280 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3281 &command_pool_two);
3282
3283 VkCommandBuffer command_buffer[9];
3284 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3285 command_buffer_allocate_info.sType =
3286 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3287 command_buffer_allocate_info.commandPool = command_pool_one;
3288 command_buffer_allocate_info.commandBufferCount = 9;
3289 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3290 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3291 command_buffer);
3292
3293 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
3294 &command_buffer[3]);
3295
3296 m_errorMonitor->VerifyFound();
3297
3298 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
3299 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
3300}
3301
3302TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
3303 VkResult err;
3304
3305 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
3306 "attempt to delete them from another.");
3307
3308 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3309 "FreeDescriptorSets is attempting to free descriptorSet");
3310
3311 ASSERT_NO_FATAL_FAILURE(InitState());
3312 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3313
3314 VkDescriptorPoolSize ds_type_count = {};
3315 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3316 ds_type_count.descriptorCount = 1;
3317
3318 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3319 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3320 ds_pool_ci.pNext = NULL;
3321 ds_pool_ci.flags = 0;
3322 ds_pool_ci.maxSets = 1;
3323 ds_pool_ci.poolSizeCount = 1;
3324 ds_pool_ci.pPoolSizes = &ds_type_count;
3325
3326 VkDescriptorPool ds_pool_one;
3327 err =
3328 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
3329 ASSERT_VK_SUCCESS(err);
3330
3331 // Create a second descriptor pool
3332 VkDescriptorPool ds_pool_two;
3333 err =
3334 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
3335 ASSERT_VK_SUCCESS(err);
3336
3337 VkDescriptorSetLayoutBinding dsl_binding = {};
3338 dsl_binding.binding = 0;
3339 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3340 dsl_binding.descriptorCount = 1;
3341 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3342 dsl_binding.pImmutableSamplers = NULL;
3343
3344 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3345 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3346 ds_layout_ci.pNext = NULL;
3347 ds_layout_ci.bindingCount = 1;
3348 ds_layout_ci.pBindings = &dsl_binding;
3349
3350 VkDescriptorSetLayout ds_layout;
3351 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3352 &ds_layout);
3353 ASSERT_VK_SUCCESS(err);
3354
3355 VkDescriptorSet descriptorSet;
3356 VkDescriptorSetAllocateInfo alloc_info = {};
3357 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3358 alloc_info.descriptorSetCount = 1;
3359 alloc_info.descriptorPool = ds_pool_one;
3360 alloc_info.pSetLayouts = &ds_layout;
3361 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3362 &descriptorSet);
3363 ASSERT_VK_SUCCESS(err);
3364
3365 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
3366
3367 m_errorMonitor->VerifyFound();
3368
3369 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3370 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
3371 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
3372}
3373
3374TEST_F(VkLayerTest, CreateUnknownObject) {
3375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3376 "Invalid VkImage Object ");
3377
3378 TEST_DESCRIPTION(
3379 "Pass an invalid image object handle into a Vulkan API call.");
3380
3381 ASSERT_NO_FATAL_FAILURE(InitState());
3382
3383 // Pass bogus handle into GetImageMemoryRequirements
3384 VkMemoryRequirements mem_reqs;
3385 uint64_t fakeImageHandle = 0xCADECADE;
3386 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
3387
3388 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
3389
3390 m_errorMonitor->VerifyFound();
3391}
3392
Karl Schultz6addd812016-02-02 17:17:23 -07003393TEST_F(VkLayerTest, PipelineNotBound) {
3394 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003395
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003396 TEST_DESCRIPTION(
3397 "Pass in an invalid pipeline object handle into a Vulkan API call.");
3398
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003400 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003401
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003402 ASSERT_NO_FATAL_FAILURE(InitState());
3403 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003404
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003405 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003406 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3407 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003408
3409 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003410 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3411 ds_pool_ci.pNext = NULL;
3412 ds_pool_ci.maxSets = 1;
3413 ds_pool_ci.poolSizeCount = 1;
3414 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003415
3416 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003417 err =
3418 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003419 ASSERT_VK_SUCCESS(err);
3420
3421 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003422 dsl_binding.binding = 0;
3423 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3424 dsl_binding.descriptorCount = 1;
3425 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3426 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003427
3428 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003429 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3430 ds_layout_ci.pNext = NULL;
3431 ds_layout_ci.bindingCount = 1;
3432 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003433
3434 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003435 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3436 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003437 ASSERT_VK_SUCCESS(err);
3438
3439 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003440 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003441 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003442 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003443 alloc_info.descriptorPool = ds_pool;
3444 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003445 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3446 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003447 ASSERT_VK_SUCCESS(err);
3448
3449 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003450 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3451 pipeline_layout_ci.pNext = NULL;
3452 pipeline_layout_ci.setLayoutCount = 1;
3453 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003454
3455 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003456 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3457 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003458 ASSERT_VK_SUCCESS(err);
3459
Mark Youngad779052016-01-06 14:26:04 -07003460 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003461
3462 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003463 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3464 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003465
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003466 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003467
Chia-I Wuf7458c52015-10-26 21:10:41 +08003468 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3469 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3470 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003471}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003472
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003473TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
3474 VkResult err;
3475
3476 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
3477 "during bind[Buffer|Image]Memory time");
3478
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003479 ASSERT_NO_FATAL_FAILURE(InitState());
3480
3481 // Create an image, allocate memory, set a bad typeIndex and then try to
3482 // bind it
3483 VkImage image;
3484 VkDeviceMemory mem;
3485 VkMemoryRequirements mem_reqs;
3486 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3487 const int32_t tex_width = 32;
3488 const int32_t tex_height = 32;
3489
3490 VkImageCreateInfo image_create_info = {};
3491 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3492 image_create_info.pNext = NULL;
3493 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3494 image_create_info.format = tex_format;
3495 image_create_info.extent.width = tex_width;
3496 image_create_info.extent.height = tex_height;
3497 image_create_info.extent.depth = 1;
3498 image_create_info.mipLevels = 1;
3499 image_create_info.arrayLayers = 1;
3500 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3501 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3502 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3503 image_create_info.flags = 0;
3504
3505 VkMemoryAllocateInfo mem_alloc = {};
3506 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3507 mem_alloc.pNext = NULL;
3508 mem_alloc.allocationSize = 0;
3509 mem_alloc.memoryTypeIndex = 0;
3510
3511 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3512 ASSERT_VK_SUCCESS(err);
3513
3514 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
3515 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003516
3517 // Introduce Failure, select invalid TypeIndex
3518 VkPhysicalDeviceMemoryProperties memory_info;
3519
3520 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
3521 unsigned int i;
3522 for (i = 0; i < memory_info.memoryTypeCount; i++) {
3523 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
3524 mem_alloc.memoryTypeIndex = i;
3525 break;
3526 }
3527 }
3528 if (i >= memory_info.memoryTypeCount) {
3529 printf("No invalid memory type index could be found; skipped.\n");
3530 vkDestroyImage(m_device->device(), image, NULL);
3531 return;
3532 }
3533
3534 m_errorMonitor->SetDesiredFailureMsg(
3535 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3536 "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003537
3538 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3539 ASSERT_VK_SUCCESS(err);
3540
3541 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3542 (void)err;
3543
3544 m_errorMonitor->VerifyFound();
3545
3546 vkDestroyImage(m_device->device(), image, NULL);
3547 vkFreeMemory(m_device->device(), mem, NULL);
3548}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003549
Karl Schultz6addd812016-02-02 17:17:23 -07003550TEST_F(VkLayerTest, BindInvalidMemory) {
3551 VkResult err;
3552 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003553
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003555 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003556
Tobin Ehlisec598302015-09-15 15:02:17 -06003557 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003558
3559 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07003560 VkImage image;
3561 VkDeviceMemory mem;
3562 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003563
Karl Schultz6addd812016-02-02 17:17:23 -07003564 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3565 const int32_t tex_width = 32;
3566 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003567
3568 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003569 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3570 image_create_info.pNext = NULL;
3571 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3572 image_create_info.format = tex_format;
3573 image_create_info.extent.width = tex_width;
3574 image_create_info.extent.height = tex_height;
3575 image_create_info.extent.depth = 1;
3576 image_create_info.mipLevels = 1;
3577 image_create_info.arrayLayers = 1;
3578 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3579 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3580 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3581 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003582
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003583 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003584 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3585 mem_alloc.pNext = NULL;
3586 mem_alloc.allocationSize = 0;
3587 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003588
Chia-I Wuf7458c52015-10-26 21:10:41 +08003589 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003590 ASSERT_VK_SUCCESS(err);
3591
Karl Schultz6addd812016-02-02 17:17:23 -07003592 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003593
3594 mem_alloc.allocationSize = mem_reqs.size;
3595
Karl Schultz6addd812016-02-02 17:17:23 -07003596 pass =
3597 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003598 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003599
3600 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003601 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003602 ASSERT_VK_SUCCESS(err);
3603
3604 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003605 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003606
3607 // Try to bind free memory that has been freed
3608 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3609 // This may very well return an error.
3610 (void)err;
3611
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003612 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003613
Chia-I Wuf7458c52015-10-26 21:10:41 +08003614 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003615}
3616
Karl Schultz6addd812016-02-02 17:17:23 -07003617TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
3618 VkResult err;
3619 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003620
Karl Schultz6addd812016-02-02 17:17:23 -07003621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3622 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003623
Tobin Ehlisec598302015-09-15 15:02:17 -06003624 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003625
Karl Schultz6addd812016-02-02 17:17:23 -07003626 // Create an image object, allocate memory, destroy the object and then try
3627 // to bind it
3628 VkImage image;
3629 VkDeviceMemory mem;
3630 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003631
Karl Schultz6addd812016-02-02 17:17:23 -07003632 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3633 const int32_t tex_width = 32;
3634 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003635
3636 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003637 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3638 image_create_info.pNext = NULL;
3639 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3640 image_create_info.format = tex_format;
3641 image_create_info.extent.width = tex_width;
3642 image_create_info.extent.height = tex_height;
3643 image_create_info.extent.depth = 1;
3644 image_create_info.mipLevels = 1;
3645 image_create_info.arrayLayers = 1;
3646 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3647 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3648 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3649 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003650
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003651 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003652 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3653 mem_alloc.pNext = NULL;
3654 mem_alloc.allocationSize = 0;
3655 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003656
Chia-I Wuf7458c52015-10-26 21:10:41 +08003657 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003658 ASSERT_VK_SUCCESS(err);
3659
Karl Schultz6addd812016-02-02 17:17:23 -07003660 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003661
3662 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003663 pass =
3664 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003665 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003666
3667 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003668 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003669 ASSERT_VK_SUCCESS(err);
3670
3671 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003672 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003673 ASSERT_VK_SUCCESS(err);
3674
3675 // Now Try to bind memory to this destroyed object
3676 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3677 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003678 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003679
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003680 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003681
Chia-I Wuf7458c52015-10-26 21:10:41 +08003682 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003683}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003684
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003685#endif // OBJ_TRACKER_TESTS
3686
Tobin Ehlis0788f522015-05-26 16:11:58 -06003687#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003688
Chris Forbes48a53902016-06-30 11:46:27 +12003689TEST_F(VkLayerTest, RenderPassInitialLayoutUndefined) {
3690 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
3691 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
3692 "the command buffer has prior knowledge of that "
3693 "attachment's layout.");
3694
3695 m_errorMonitor->ExpectSuccess();
3696
3697 ASSERT_NO_FATAL_FAILURE(InitState());
3698
3699 // A renderpass with one color attachment.
3700 VkAttachmentDescription attachment = {
3701 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3702 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3703 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3704 VK_IMAGE_LAYOUT_UNDEFINED,
3705 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3706 };
3707
3708 VkAttachmentReference att_ref = {
3709 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3710 };
3711
3712 VkSubpassDescription subpass = {
3713 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3714 1, &att_ref, nullptr, nullptr, 0, nullptr
3715 };
3716
3717 VkRenderPassCreateInfo rpci = {
3718 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3719 0, 1, &attachment, 1, &subpass, 0, nullptr
3720 };
3721
3722 VkRenderPass rp;
3723 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3724 ASSERT_VK_SUCCESS(err);
3725
3726 // A compatible framebuffer.
3727 VkImageObj image(m_device);
3728 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3729 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3730 VK_IMAGE_TILING_OPTIMAL, 0);
3731 ASSERT_TRUE(image.initialized());
3732
3733 VkImageViewCreateInfo ivci = {
3734 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3735 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3736 {
3737 VK_COMPONENT_SWIZZLE_IDENTITY,
3738 VK_COMPONENT_SWIZZLE_IDENTITY,
3739 VK_COMPONENT_SWIZZLE_IDENTITY,
3740 VK_COMPONENT_SWIZZLE_IDENTITY
3741 },
3742 {
3743 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3744 },
3745 };
3746 VkImageView view;
3747 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3748 ASSERT_VK_SUCCESS(err);
3749
3750 VkFramebufferCreateInfo fci = {
3751 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3752 0, rp, 1, &view,
3753 32, 32, 1
3754 };
3755 VkFramebuffer fb;
3756 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3757 ASSERT_VK_SUCCESS(err);
3758
3759 // Record a single command buffer which uses this renderpass twice. The
3760 // bug is triggered at the beginning of the second renderpass, when the
3761 // command buffer already has a layout recorded for the attachment.
3762 VkRenderPassBeginInfo rpbi = {
3763 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003764 rp, fb, { { 0, 0 } , { 32, 32 } },
Chris Forbes48a53902016-06-30 11:46:27 +12003765 0, nullptr
3766 };
3767 BeginCommandBuffer();
3768 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3769 VK_SUBPASS_CONTENTS_INLINE);
3770 vkCmdEndRenderPass(m_commandBuffer->handle());
3771 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3772 VK_SUBPASS_CONTENTS_INLINE);
3773
3774 m_errorMonitor->VerifyNotFound();
3775
3776 vkCmdEndRenderPass(m_commandBuffer->handle());
3777 EndCommandBuffer();
3778
3779 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3780 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3781 vkDestroyImageView(m_device->device(), view, nullptr);
3782}
3783
Chris Forbes51bf7c92016-06-30 15:22:08 +12003784TEST_F(VkLayerTest, RenderPassSubpassZeroTransitionsApplied) {
3785 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
3786 "transitions for the first subpass");
3787
3788 m_errorMonitor->ExpectSuccess();
3789
3790 ASSERT_NO_FATAL_FAILURE(InitState());
3791
3792 // A renderpass with one color attachment.
3793 VkAttachmentDescription attachment = {
3794 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3795 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3796 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3797 VK_IMAGE_LAYOUT_UNDEFINED,
3798 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3799 };
3800
3801 VkAttachmentReference att_ref = {
3802 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3803 };
3804
3805 VkSubpassDescription subpass = {
3806 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3807 1, &att_ref, nullptr, nullptr, 0, nullptr
3808 };
3809
3810 VkSubpassDependency dep = {
Chris Forbescb4c7ad2016-07-06 10:28:18 +12003811 0, 0, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3812 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12003813 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3814 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3815 VK_DEPENDENCY_BY_REGION_BIT
3816 };
3817
3818 VkRenderPassCreateInfo rpci = {
3819 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3820 0, 1, &attachment, 1, &subpass, 1, &dep
3821 };
3822
3823 VkResult err;
3824 VkRenderPass rp;
3825 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3826 ASSERT_VK_SUCCESS(err);
3827
3828 // A compatible framebuffer.
3829 VkImageObj image(m_device);
3830 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3831 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3832 VK_IMAGE_TILING_OPTIMAL, 0);
3833 ASSERT_TRUE(image.initialized());
3834
3835 VkImageViewCreateInfo ivci = {
3836 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3837 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3838 {
3839 VK_COMPONENT_SWIZZLE_IDENTITY,
3840 VK_COMPONENT_SWIZZLE_IDENTITY,
3841 VK_COMPONENT_SWIZZLE_IDENTITY,
3842 VK_COMPONENT_SWIZZLE_IDENTITY
3843 },
3844 {
3845 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3846 },
3847 };
3848 VkImageView view;
3849 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3850 ASSERT_VK_SUCCESS(err);
3851
3852 VkFramebufferCreateInfo fci = {
3853 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3854 0, rp, 1, &view,
3855 32, 32, 1
3856 };
3857 VkFramebuffer fb;
3858 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3859 ASSERT_VK_SUCCESS(err);
3860
3861 // Record a single command buffer which issues a pipeline barrier w/
3862 // image memory barrier for the attachment. This detects the previously
3863 // missing tracking of the subpass layout by throwing a validation error
3864 // if it doesn't occur.
3865 VkRenderPassBeginInfo rpbi = {
3866 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003867 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes51bf7c92016-06-30 15:22:08 +12003868 0, nullptr
3869 };
3870 BeginCommandBuffer();
3871 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3872 VK_SUBPASS_CONTENTS_INLINE);
3873
3874 VkImageMemoryBarrier imb = {
3875 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, nullptr,
3876 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3877 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3878 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3879 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3880 VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
3881 image.handle(),
3882 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
3883 };
3884 vkCmdPipelineBarrier(m_commandBuffer->handle(),
Chris Forbescb4c7ad2016-07-06 10:28:18 +12003885 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3886 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12003887 VK_DEPENDENCY_BY_REGION_BIT,
3888 0, nullptr, 0, nullptr, 1, &imb);
3889
3890 vkCmdEndRenderPass(m_commandBuffer->handle());
3891 m_errorMonitor->VerifyNotFound();
3892 EndCommandBuffer();
3893
3894 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3895 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3896 vkDestroyImageView(m_device->device(), view, nullptr);
3897}
3898
Chris Forbes6b3d3f42016-06-30 16:09:47 +12003899TEST_F(VkLayerTest, RenderPassTransitionsAttachmentUnused) {
3900 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
3901 "errors, when an attachment reference is "
3902 "VK_ATTACHMENT_UNUSED");
3903
3904 m_errorMonitor->ExpectSuccess();
3905
3906 ASSERT_NO_FATAL_FAILURE(InitState());
3907
3908 // A renderpass with no attachments
3909 VkAttachmentReference att_ref = {
3910 VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3911 };
3912
3913 VkSubpassDescription subpass = {
3914 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3915 1, &att_ref, nullptr, nullptr, 0, nullptr
3916 };
3917
3918 VkRenderPassCreateInfo rpci = {
3919 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3920 0, 0, nullptr, 1, &subpass, 0, nullptr
3921 };
3922
3923 VkRenderPass rp;
3924 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3925 ASSERT_VK_SUCCESS(err);
3926
3927 // A compatible framebuffer.
3928 VkFramebufferCreateInfo fci = {
3929 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3930 0, rp, 0, nullptr,
3931 32, 32, 1
3932 };
3933 VkFramebuffer fb;
3934 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3935 ASSERT_VK_SUCCESS(err);
3936
3937 // Record a command buffer which just begins and ends the renderpass. The
3938 // bug manifests in BeginRenderPass.
3939 VkRenderPassBeginInfo rpbi = {
3940 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003941 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes6b3d3f42016-06-30 16:09:47 +12003942 0, nullptr
3943 };
3944 BeginCommandBuffer();
3945 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3946 VK_SUBPASS_CONTENTS_INLINE);
3947 vkCmdEndRenderPass(m_commandBuffer->handle());
3948 m_errorMonitor->VerifyNotFound();
3949 EndCommandBuffer();
3950
3951 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3952 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3953}
3954
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06003955// This is a positive test. No errors are expected.
3956TEST_F(VkLayerTest, StencilLoadOp) {
3957 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
3958 "CLEAR. stencil[Load|Store]Op used to be ignored.");
3959 VkResult result = VK_SUCCESS;
3960 VkImageFormatProperties formatProps;
3961 vkGetPhysicalDeviceImageFormatProperties(
3962 gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D,
3963 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
3964 VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
3965 0, &formatProps);
3966 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
3967 return;
3968 }
3969
3970 ASSERT_NO_FATAL_FAILURE(InitState());
3971 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
3972 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
3973 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
3974 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
3975 VkAttachmentDescription att = {};
3976 VkAttachmentReference ref = {};
3977 att.format = depth_stencil_fmt;
3978 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
3979 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
3980 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
3981 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
3982 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3983 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3984
3985 VkClearValue clear;
3986 clear.depthStencil.depth = 1.0;
3987 clear.depthStencil.stencil = 0;
3988 ref.attachment = 0;
3989 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3990
3991 VkSubpassDescription subpass = {};
3992 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
3993 subpass.flags = 0;
3994 subpass.inputAttachmentCount = 0;
3995 subpass.pInputAttachments = NULL;
3996 subpass.colorAttachmentCount = 0;
3997 subpass.pColorAttachments = NULL;
3998 subpass.pResolveAttachments = NULL;
3999 subpass.pDepthStencilAttachment = &ref;
4000 subpass.preserveAttachmentCount = 0;
4001 subpass.pPreserveAttachments = NULL;
4002
4003 VkRenderPass rp;
4004 VkRenderPassCreateInfo rp_info = {};
4005 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4006 rp_info.attachmentCount = 1;
4007 rp_info.pAttachments = &att;
4008 rp_info.subpassCount = 1;
4009 rp_info.pSubpasses = &subpass;
4010 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
4011 ASSERT_VK_SUCCESS(result);
4012
4013 VkImageView *depthView = m_depthStencil->BindInfo();
4014 VkFramebufferCreateInfo fb_info = {};
4015 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4016 fb_info.pNext = NULL;
4017 fb_info.renderPass = rp;
4018 fb_info.attachmentCount = 1;
4019 fb_info.pAttachments = depthView;
4020 fb_info.width = 100;
4021 fb_info.height = 100;
4022 fb_info.layers = 1;
4023 VkFramebuffer fb;
4024 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4025 ASSERT_VK_SUCCESS(result);
4026
4027
4028 VkRenderPassBeginInfo rpbinfo = {};
4029 rpbinfo.clearValueCount = 1;
4030 rpbinfo.pClearValues = &clear;
4031 rpbinfo.pNext = NULL;
4032 rpbinfo.renderPass = rp;
4033 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4034 rpbinfo.renderArea.extent.width = 100;
4035 rpbinfo.renderArea.extent.height = 100;
4036 rpbinfo.renderArea.offset.x = 0;
4037 rpbinfo.renderArea.offset.y = 0;
4038 rpbinfo.framebuffer = fb;
4039
4040 VkFence fence = {};
4041 VkFenceCreateInfo fence_ci = {};
4042 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4043 fence_ci.pNext = nullptr;
4044 fence_ci.flags = 0;
4045 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
4046 ASSERT_VK_SUCCESS(result);
4047
4048
4049 m_commandBuffer->BeginCommandBuffer();
4050 m_commandBuffer->BeginRenderPass(rpbinfo);
4051 m_commandBuffer->EndRenderPass();
4052 m_commandBuffer->EndCommandBuffer();
4053 m_commandBuffer->QueueCommandBuffer(fence);
4054
4055 VkImageObj destImage(m_device);
4056 destImage.init(100, 100, depth_stencil_fmt,
4057 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4058 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4059 VK_IMAGE_TILING_OPTIMAL, 0);
4060 VkImageMemoryBarrier barrier = {};
4061 VkImageSubresourceRange range;
4062 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4063 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4064 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4065 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT |
4066 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
4067 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4068 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
4069 barrier.image = m_depthStencil->handle();
4070 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4071 range.baseMipLevel = 0;
4072 range.levelCount = 1;
4073 range.baseArrayLayer = 0;
4074 range.layerCount = 1;
4075 barrier.subresourceRange = range;
4076 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4077 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
4078 cmdbuf.BeginCommandBuffer();
4079 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4080 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4081 nullptr, 1, &barrier);
4082 barrier.srcAccessMask = 0;
4083 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4084 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
4085 barrier.image = destImage.handle();
4086 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4087 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4088 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4089 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4090 nullptr, 1, &barrier);
4091 VkImageCopy cregion;
4092 cregion.srcSubresource.aspectMask =
4093 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4094 cregion.srcSubresource.mipLevel = 0;
4095 cregion.srcSubresource.baseArrayLayer = 0;
4096 cregion.srcSubresource.layerCount = 1;
4097 cregion.srcOffset.x = 0;
4098 cregion.srcOffset.y = 0;
4099 cregion.srcOffset.z = 0;
4100 cregion.dstSubresource.aspectMask =
4101 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4102 cregion.dstSubresource.mipLevel = 0;
4103 cregion.dstSubresource.baseArrayLayer = 0;
4104 cregion.dstSubresource.layerCount = 1;
4105 cregion.dstOffset.x = 0;
4106 cregion.dstOffset.y = 0;
4107 cregion.dstOffset.z = 0;
4108 cregion.extent.width = 100;
4109 cregion.extent.height = 100;
4110 cregion.extent.depth = 1;
4111 cmdbuf.CopyImage(m_depthStencil->handle(),
4112 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
4113 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
4114 cmdbuf.EndCommandBuffer();
4115
4116 VkSubmitInfo submit_info;
4117 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4118 submit_info.pNext = NULL;
4119 submit_info.waitSemaphoreCount = 0;
4120 submit_info.pWaitSemaphores = NULL;
4121 submit_info.pWaitDstStageMask = NULL;
4122 submit_info.commandBufferCount = 1;
4123 submit_info.pCommandBuffers = &cmdbuf.handle();
4124 submit_info.signalSemaphoreCount = 0;
4125 submit_info.pSignalSemaphores = NULL;
4126
4127 m_errorMonitor->ExpectSuccess();
4128 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4129 m_errorMonitor->VerifyNotFound();
4130
Mark Lobodzinskid0440da2016-06-17 15:10:03 -06004131 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004132 vkDestroyFence(m_device->device(), fence, nullptr);
4133 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4134 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4135}
4136
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004137TEST_F(VkLayerTest, UnusedPreserveAttachment) {
4138 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
4139 "attachment reference of VK_ATTACHMENT_UNUSED");
4140
4141 ASSERT_NO_FATAL_FAILURE(InitState());
4142 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4143
4144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4145 "must not be VK_ATTACHMENT_UNUSED");
4146
4147 VkAttachmentReference color_attach = {};
4148 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4149 color_attach.attachment = 0;
4150 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
4151 VkSubpassDescription subpass = {};
4152 subpass.colorAttachmentCount = 1;
4153 subpass.pColorAttachments = &color_attach;
4154 subpass.preserveAttachmentCount = 1;
4155 subpass.pPreserveAttachments = &preserve_attachment;
4156
4157 VkRenderPassCreateInfo rpci = {};
4158 rpci.subpassCount = 1;
4159 rpci.pSubpasses = &subpass;
4160 rpci.attachmentCount = 1;
4161 VkAttachmentDescription attach_desc = {};
4162 attach_desc.format = VK_FORMAT_UNDEFINED;
4163 rpci.pAttachments = &attach_desc;
4164 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4165 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004166 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004167
4168 m_errorMonitor->VerifyFound();
4169
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004170 if (result == VK_SUCCESS) {
4171 vkDestroyRenderPass(m_device->device(), rp, NULL);
4172 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004173}
4174
Chris Forbesc5389742016-06-29 11:49:23 +12004175TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004176 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
4177 "when the source of a subpass multisample resolve "
4178 "does not have multiple samples.");
4179
Chris Forbesc5389742016-06-29 11:49:23 +12004180 ASSERT_NO_FATAL_FAILURE(InitState());
4181
4182 m_errorMonitor->SetDesiredFailureMsg(
4183 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbes6655bb32016-07-01 18:27:30 +12004184 "Subpass 0 requests multisample resolve from attachment 0 which has "
4185 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12004186
4187 VkAttachmentDescription attachments[] = {
4188 {
4189 0, VK_FORMAT_R8G8B8A8_UNORM,
4190 VK_SAMPLE_COUNT_1_BIT,
4191 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4192 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4193 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4194 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4195 },
4196 {
4197 0, VK_FORMAT_R8G8B8A8_UNORM,
4198 VK_SAMPLE_COUNT_1_BIT,
4199 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4200 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4201 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4202 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4203 },
4204 };
4205
4206 VkAttachmentReference color = {
4207 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4208 };
4209
4210 VkAttachmentReference resolve = {
4211 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4212 };
4213
4214 VkSubpassDescription subpass = {
4215 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4216 0, nullptr,
4217 1, &color,
4218 &resolve,
4219 nullptr,
4220 0, nullptr
4221 };
4222
4223 VkRenderPassCreateInfo rpci = {
4224 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4225 0, 2, attachments, 1, &subpass, 0, nullptr
4226 };
4227
4228 VkRenderPass rp;
4229 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4230
4231 m_errorMonitor->VerifyFound();
4232
4233 if (err == VK_SUCCESS)
4234 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4235}
4236
4237TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004238 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4239 "when a subpass multisample resolve operation is "
4240 "requested, and the destination of that resolve has "
4241 "multiple samples.");
4242
Chris Forbesc5389742016-06-29 11:49:23 +12004243 ASSERT_NO_FATAL_FAILURE(InitState());
4244
4245 m_errorMonitor->SetDesiredFailureMsg(
4246 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4247 "Subpass 0 requests multisample resolve into attachment 1, which "
4248 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
4249
4250 VkAttachmentDescription attachments[] = {
4251 {
4252 0, VK_FORMAT_R8G8B8A8_UNORM,
4253 VK_SAMPLE_COUNT_4_BIT,
4254 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4255 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4256 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4257 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4258 },
4259 {
4260 0, VK_FORMAT_R8G8B8A8_UNORM,
4261 VK_SAMPLE_COUNT_4_BIT,
4262 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4263 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4264 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4265 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4266 },
4267 };
4268
4269 VkAttachmentReference color = {
4270 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4271 };
4272
4273 VkAttachmentReference resolve = {
4274 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4275 };
4276
4277 VkSubpassDescription subpass = {
4278 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4279 0, nullptr,
4280 1, &color,
4281 &resolve,
4282 nullptr,
4283 0, nullptr
4284 };
4285
4286 VkRenderPassCreateInfo rpci = {
4287 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4288 0, 2, attachments, 1, &subpass, 0, nullptr
4289 };
4290
4291 VkRenderPass rp;
4292 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4293
4294 m_errorMonitor->VerifyFound();
4295
4296 if (err == VK_SUCCESS)
4297 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4298}
4299
Chris Forbes3f128ef2016-06-29 14:58:53 +12004300TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004301 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4302 "when the color and depth attachments used by a subpass "
4303 "have inconsistent sample counts");
4304
Chris Forbes3f128ef2016-06-29 14:58:53 +12004305 ASSERT_NO_FATAL_FAILURE(InitState());
4306
4307 m_errorMonitor->SetDesiredFailureMsg(
4308 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4309 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
4310
4311 VkAttachmentDescription attachments[] = {
4312 {
4313 0, VK_FORMAT_R8G8B8A8_UNORM,
4314 VK_SAMPLE_COUNT_1_BIT,
4315 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4316 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4317 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4318 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4319 },
4320 {
4321 0, VK_FORMAT_R8G8B8A8_UNORM,
4322 VK_SAMPLE_COUNT_4_BIT,
4323 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4324 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4325 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4326 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4327 },
4328 };
4329
4330 VkAttachmentReference color[] = {
4331 {
4332 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4333 },
4334 {
4335 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4336 },
4337 };
4338
4339 VkSubpassDescription subpass = {
4340 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4341 0, nullptr,
4342 2, color,
4343 nullptr,
4344 nullptr,
4345 0, nullptr
4346 };
4347
4348 VkRenderPassCreateInfo rpci = {
4349 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4350 0, 2, attachments, 1, &subpass, 0, nullptr
4351 };
4352
4353 VkRenderPass rp;
4354 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4355
4356 m_errorMonitor->VerifyFound();
4357
4358 if (err == VK_SUCCESS)
4359 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4360}
4361
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004362TEST_F(VkLayerTest, FramebufferCreateErrors) {
4363 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
4364 " 1. Mismatch between fb & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004365 " 2. Use a color image as depthStencil attachment\n"
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004366 " 3. Mismatch fb & renderPass attachment formats\n"
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004367 " 4. Mismatch fb & renderPass attachment #samples\n"
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004368 " 5. FB attachment w/ non-1 mip-levels\n"
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004369 " 6. FB attachment where dimensions don't match\n"
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004370 " 7. FB attachment w/o identity swizzle\n"
4371 " 8. FB dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004372
4373 ASSERT_NO_FATAL_FAILURE(InitState());
4374 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4375
4376 m_errorMonitor->SetDesiredFailureMsg(
4377 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004378 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
4379 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004380
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004381 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004382 VkAttachmentReference attach = {};
4383 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4384 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004385 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004386 VkRenderPassCreateInfo rpci = {};
4387 rpci.subpassCount = 1;
4388 rpci.pSubpasses = &subpass;
4389 rpci.attachmentCount = 1;
4390 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004391 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004392 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004393 rpci.pAttachments = &attach_desc;
4394 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4395 VkRenderPass rp;
4396 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4397 ASSERT_VK_SUCCESS(err);
4398
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004399 VkImageView ivs[2];
4400 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
4401 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004402 VkFramebufferCreateInfo fb_info = {};
4403 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4404 fb_info.pNext = NULL;
4405 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004406 // Set mis-matching attachmentCount
4407 fb_info.attachmentCount = 2;
4408 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004409 fb_info.width = 100;
4410 fb_info.height = 100;
4411 fb_info.layers = 1;
4412
4413 VkFramebuffer fb;
4414 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4415
4416 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004417 if (err == VK_SUCCESS) {
4418 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4419 }
4420 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004421
4422 // Create a renderPass with a depth-stencil attachment created with
4423 // IMAGE_USAGE_COLOR_ATTACHMENT
4424 // Add our color attachment to pDepthStencilAttachment
4425 subpass.pDepthStencilAttachment = &attach;
4426 subpass.pColorAttachments = NULL;
4427 VkRenderPass rp_ds;
4428 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
4429 ASSERT_VK_SUCCESS(err);
4430 // Set correct attachment count, but attachment has COLOR usage bit set
4431 fb_info.attachmentCount = 1;
4432 fb_info.renderPass = rp_ds;
4433
4434 m_errorMonitor->SetDesiredFailureMsg(
4435 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4436 " conflicts with the image's IMAGE_USAGE flags ");
4437 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4438
4439 m_errorMonitor->VerifyFound();
4440 if (err == VK_SUCCESS) {
4441 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4442 }
4443 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004444
4445 // Create new renderpass with alternate attachment format from fb
4446 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
4447 subpass.pDepthStencilAttachment = NULL;
4448 subpass.pColorAttachments = &attach;
4449 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4450 ASSERT_VK_SUCCESS(err);
4451
4452 // Cause error due to mis-matched formats between rp & fb
4453 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
4454 fb_info.renderPass = rp;
4455 m_errorMonitor->SetDesiredFailureMsg(
4456 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4457 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
4458 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4459
4460 m_errorMonitor->VerifyFound();
4461 if (err == VK_SUCCESS) {
4462 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4463 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004464 vkDestroyRenderPass(m_device->device(), rp, NULL);
4465
4466 // Create new renderpass with alternate sample count from fb
4467 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4468 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
4469 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4470 ASSERT_VK_SUCCESS(err);
4471
4472 // Cause error due to mis-matched sample count between rp & fb
4473 fb_info.renderPass = rp;
4474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4475 " has VK_SAMPLE_COUNT_1_BIT samples "
4476 "that do not match the "
4477 "VK_SAMPLE_COUNT_4_BIT ");
4478 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4479
4480 m_errorMonitor->VerifyFound();
4481 if (err == VK_SUCCESS) {
4482 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4483 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004484
4485 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004486
4487 // Create a custom imageView with non-1 mip levels
4488 VkImageObj image(m_device);
4489 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
4490 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4491 ASSERT_TRUE(image.initialized());
4492
4493 VkImageView view;
4494 VkImageViewCreateInfo ivci = {};
4495 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4496 ivci.image = image.handle();
4497 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4498 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4499 ivci.subresourceRange.layerCount = 1;
4500 ivci.subresourceRange.baseMipLevel = 0;
4501 // Set level count 2 (only 1 is allowed for FB attachment)
4502 ivci.subresourceRange.levelCount = 2;
4503 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4504 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4505 ASSERT_VK_SUCCESS(err);
4506 // Re-create renderpass to have matching sample count
4507 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4508 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4509 ASSERT_VK_SUCCESS(err);
4510
4511 fb_info.renderPass = rp;
4512 fb_info.pAttachments = &view;
4513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4514 " has mip levelCount of 2 but only ");
4515 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4516
4517 m_errorMonitor->VerifyFound();
4518 if (err == VK_SUCCESS) {
4519 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4520 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004521 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004522 // Update view to original color buffer and grow FB dimensions too big
4523 fb_info.pAttachments = ivs;
4524 fb_info.height = 1024;
4525 fb_info.width = 1024;
4526 fb_info.layers = 2;
4527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4528 " Attachment dimensions must be at "
4529 "least as large. ");
4530 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4531
4532 m_errorMonitor->VerifyFound();
4533 if (err == VK_SUCCESS) {
4534 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4535 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004536 // Create view attachment with non-identity swizzle
4537 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4538 ivci.image = image.handle();
4539 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4540 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4541 ivci.subresourceRange.layerCount = 1;
4542 ivci.subresourceRange.baseMipLevel = 0;
4543 ivci.subresourceRange.levelCount = 1;
4544 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4545 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4546 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4547 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4548 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4549 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4550 ASSERT_VK_SUCCESS(err);
4551
4552 fb_info.pAttachments = &view;
4553 fb_info.height = 100;
4554 fb_info.width = 100;
4555 fb_info.layers = 1;
4556 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4557 " has non-identy swizzle. All "
4558 "framebuffer attachments must have "
4559 "been created with the identity "
4560 "swizzle. ");
4561 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4562
4563 m_errorMonitor->VerifyFound();
4564 if (err == VK_SUCCESS) {
4565 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4566 }
4567 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004568 // Request fb that exceeds max dimensions
4569 // reset attachment to color attachment
4570 fb_info.pAttachments = ivs;
4571 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
4572 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
4573 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
4574 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4575 " Requested VkFramebufferCreateInfo "
4576 "dimensions exceed physical device "
4577 "limits. ");
4578 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4579
4580 m_errorMonitor->VerifyFound();
4581 if (err == VK_SUCCESS) {
4582 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4583 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004584
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004585 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004586}
4587
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004588// This is a positive test. No errors should be generated.
Michael Lentine860b0fe2016-05-20 10:14:00 -05004589TEST_F(VkLayerTest, WaitEventThenSet) {
4590 TEST_DESCRIPTION(
4591 "Wait on a event then set it after the wait has been submitted.");
4592
Michael Lentine860b0fe2016-05-20 10:14:00 -05004593 m_errorMonitor->ExpectSuccess();
4594
4595 VkEvent event;
4596 VkEventCreateInfo event_create_info{};
4597 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4598 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
4599
4600 VkCommandPool command_pool;
4601 VkCommandPoolCreateInfo pool_create_info{};
4602 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4603 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4604 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4605 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4606 &command_pool);
4607
4608 VkCommandBuffer command_buffer;
4609 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4610 command_buffer_allocate_info.sType =
4611 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4612 command_buffer_allocate_info.commandPool = command_pool;
4613 command_buffer_allocate_info.commandBufferCount = 1;
4614 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4615 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4616 &command_buffer);
4617
4618 VkQueue queue = VK_NULL_HANDLE;
4619 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06004620 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05004621
4622 {
4623 VkCommandBufferBeginInfo begin_info{};
4624 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4625 vkBeginCommandBuffer(command_buffer, &begin_info);
4626
4627 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT,
4628 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
4629 nullptr, 0, nullptr);
4630 vkCmdResetEvent(command_buffer, event,
4631 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
4632 vkEndCommandBuffer(command_buffer);
4633 }
4634 {
4635 VkSubmitInfo submit_info{};
4636 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4637 submit_info.commandBufferCount = 1;
4638 submit_info.pCommandBuffers = &command_buffer;
4639 submit_info.signalSemaphoreCount = 0;
4640 submit_info.pSignalSemaphores = nullptr;
4641 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4642 }
4643 { vkSetEvent(m_device->device(), event); }
4644
4645 vkQueueWaitIdle(queue);
4646
4647 vkDestroyEvent(m_device->device(), event, nullptr);
4648 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
4649 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4650
4651 m_errorMonitor->VerifyNotFound();
4652}
Michael Lentine5627e692016-05-20 17:45:02 -05004653// This is a positive test. No errors should be generated.
4654TEST_F(VkLayerTest, QueryAndCopyMultipleCommandBuffers) {
4655 TEST_DESCRIPTION(
4656 "Issue a query and copy from it on a second command buffer.");
4657
4658 if ((m_device->queue_props.empty()) ||
4659 (m_device->queue_props[0].queueCount < 2))
4660 return;
4661
4662 m_errorMonitor->ExpectSuccess();
4663
4664 VkQueryPool query_pool;
4665 VkQueryPoolCreateInfo query_pool_create_info{};
4666 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
4667 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
4668 query_pool_create_info.queryCount = 1;
4669 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
4670 &query_pool);
4671
4672 VkCommandPool command_pool;
4673 VkCommandPoolCreateInfo pool_create_info{};
4674 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4675 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4676 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4677 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4678 &command_pool);
4679
4680 VkCommandBuffer command_buffer[2];
4681 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4682 command_buffer_allocate_info.sType =
4683 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4684 command_buffer_allocate_info.commandPool = command_pool;
4685 command_buffer_allocate_info.commandBufferCount = 2;
4686 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4687 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4688 command_buffer);
4689
4690 VkQueue queue = VK_NULL_HANDLE;
4691 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4692 1, &queue);
4693
4694 uint32_t qfi = 0;
4695 VkBufferCreateInfo buff_create_info = {};
4696 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4697 buff_create_info.size = 1024;
4698 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
4699 buff_create_info.queueFamilyIndexCount = 1;
4700 buff_create_info.pQueueFamilyIndices = &qfi;
4701
4702 VkResult err;
4703 VkBuffer buffer;
4704 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
4705 ASSERT_VK_SUCCESS(err);
4706 VkMemoryAllocateInfo mem_alloc = {};
4707 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4708 mem_alloc.pNext = NULL;
4709 mem_alloc.allocationSize = 1024;
4710 mem_alloc.memoryTypeIndex = 0;
4711
4712 VkMemoryRequirements memReqs;
4713 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
4714 bool pass =
4715 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
4716 if (!pass) {
4717 vkDestroyBuffer(m_device->device(), buffer, NULL);
4718 return;
4719 }
4720
4721 VkDeviceMemory mem;
4722 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
4723 ASSERT_VK_SUCCESS(err);
4724 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4725 ASSERT_VK_SUCCESS(err);
4726
4727 {
4728 VkCommandBufferBeginInfo begin_info{};
4729 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4730 vkBeginCommandBuffer(command_buffer[0], &begin_info);
4731
4732 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
4733 vkCmdWriteTimestamp(command_buffer[0],
4734 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
4735
4736 vkEndCommandBuffer(command_buffer[0]);
4737
4738 vkBeginCommandBuffer(command_buffer[1], &begin_info);
4739
4740 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer,
4741 0, 0, 0);
4742
4743 vkEndCommandBuffer(command_buffer[1]);
4744 }
4745 {
4746 VkSubmitInfo submit_info{};
4747 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4748 submit_info.commandBufferCount = 2;
4749 submit_info.pCommandBuffers = command_buffer;
4750 submit_info.signalSemaphoreCount = 0;
4751 submit_info.pSignalSemaphores = nullptr;
4752 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4753 }
4754
4755 vkQueueWaitIdle(queue);
4756
4757 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
4758 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
4759 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06004760 vkDestroyBuffer(m_device->device(), buffer, NULL);
4761 vkFreeMemory(m_device->device(), mem, NULL);
Michael Lentine5627e692016-05-20 17:45:02 -05004762
4763 m_errorMonitor->VerifyNotFound();
4764}
Michael Lentine860b0fe2016-05-20 10:14:00 -05004765
4766TEST_F(VkLayerTest, ResetEventThenSet) {
4767 TEST_DESCRIPTION(
4768 "Reset an event then set it after the reset has been submitted.");
4769
Michael Lentine860b0fe2016-05-20 10:14:00 -05004770 m_errorMonitor->ExpectSuccess();
4771
4772 VkEvent event;
4773 VkEventCreateInfo event_create_info{};
4774 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4775 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
4776
4777 VkCommandPool command_pool;
4778 VkCommandPoolCreateInfo pool_create_info{};
4779 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4780 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4781 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4782 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4783 &command_pool);
4784
4785 VkCommandBuffer command_buffer;
4786 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4787 command_buffer_allocate_info.sType =
4788 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4789 command_buffer_allocate_info.commandPool = command_pool;
4790 command_buffer_allocate_info.commandBufferCount = 1;
4791 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4792 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4793 &command_buffer);
4794
4795 VkQueue queue = VK_NULL_HANDLE;
4796 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06004797 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05004798
4799 {
4800 VkCommandBufferBeginInfo begin_info{};
4801 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4802 vkBeginCommandBuffer(command_buffer, &begin_info);
4803
4804 vkCmdResetEvent(command_buffer, event,
4805 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
4806 vkCmdWaitEvents(command_buffer, 1, &event,
4807 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4808 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
4809 nullptr, 0, nullptr);
4810 vkEndCommandBuffer(command_buffer);
4811 }
4812 {
4813 VkSubmitInfo submit_info{};
4814 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4815 submit_info.commandBufferCount = 1;
4816 submit_info.pCommandBuffers = &command_buffer;
4817 submit_info.signalSemaphoreCount = 0;
4818 submit_info.pSignalSemaphores = nullptr;
4819 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4820 }
4821 {
4822 m_errorMonitor->SetDesiredFailureMsg(
4823 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkSetEvent() on event "
4824 "0x1 that is already in use by a "
4825 "command buffer.");
4826 vkSetEvent(m_device->device(), event);
4827 m_errorMonitor->VerifyFound();
4828 }
4829
4830 vkQueueWaitIdle(queue);
4831
4832 vkDestroyEvent(m_device->device(), event, nullptr);
4833 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
4834 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4835}
4836
4837// This is a positive test. No errors should be generated.
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004838TEST_F(VkLayerTest, TwoFencesThreeFrames) {
4839 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
4840 "run through a Submit & WaitForFences cycle 3 times. This "
4841 "previously revealed a bug so running this positive test "
4842 "to prevent a regression.");
4843 m_errorMonitor->ExpectSuccess();
4844
4845 ASSERT_NO_FATAL_FAILURE(InitState());
4846 VkQueue queue = VK_NULL_HANDLE;
4847 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4848 0, &queue);
4849
4850 static const uint32_t NUM_OBJECTS = 2;
4851 static const uint32_t NUM_FRAMES = 3;
4852 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
4853 VkFence fences[NUM_OBJECTS] = {};
4854
4855 VkCommandPool cmd_pool;
4856 VkCommandPoolCreateInfo cmd_pool_ci = {};
4857 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4858 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
4859 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4860 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci,
4861 nullptr, &cmd_pool);
4862 ASSERT_VK_SUCCESS(err);
4863
4864 VkCommandBufferAllocateInfo cmd_buf_info = {};
4865 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4866 cmd_buf_info.commandPool = cmd_pool;
4867 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4868 cmd_buf_info.commandBufferCount = 1;
4869
4870 VkFenceCreateInfo fence_ci = {};
4871 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4872 fence_ci.pNext = nullptr;
4873 fence_ci.flags = 0;
4874
4875 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
4876 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info,
4877 &cmd_buffers[i]);
4878 ASSERT_VK_SUCCESS(err);
4879 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
4880 ASSERT_VK_SUCCESS(err);
4881 }
4882
4883 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
Tobin Ehlisf9025162016-05-26 06:55:21 -06004884 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
4885 // Create empty cmd buffer
4886 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
4887 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004888
Tobin Ehlisf9025162016-05-26 06:55:21 -06004889 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
4890 ASSERT_VK_SUCCESS(err);
4891 err = vkEndCommandBuffer(cmd_buffers[obj]);
4892 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004893
Tobin Ehlisf9025162016-05-26 06:55:21 -06004894 VkSubmitInfo submit_info = {};
4895 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4896 submit_info.commandBufferCount = 1;
4897 submit_info.pCommandBuffers = &cmd_buffers[obj];
4898 // Submit cmd buffer and wait for fence
4899 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
4900 ASSERT_VK_SUCCESS(err);
4901 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE,
4902 UINT64_MAX);
4903 ASSERT_VK_SUCCESS(err);
4904 err = vkResetFences(m_device->device(), 1, &fences[obj]);
4905 ASSERT_VK_SUCCESS(err);
4906 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004907 }
4908 m_errorMonitor->VerifyNotFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06004909 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
4910 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
4911 vkDestroyFence(m_device->device(), fences[i], nullptr);
4912 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004913}
4914// This is a positive test. No errors should be generated.
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004915TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
4916
4917 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
4918 "submitted on separate queues followed by a QueueWaitIdle.");
4919
Dustin Graves48458142016-04-29 16:11:55 -06004920 if ((m_device->queue_props.empty()) ||
4921 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06004922 return;
4923
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004924 m_errorMonitor->ExpectSuccess();
4925
4926 VkSemaphore semaphore;
4927 VkSemaphoreCreateInfo semaphore_create_info{};
4928 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
4929 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
4930 &semaphore);
4931
4932 VkCommandPool command_pool;
4933 VkCommandPoolCreateInfo pool_create_info{};
4934 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4935 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4936 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4937 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4938 &command_pool);
4939
4940 VkCommandBuffer command_buffer[2];
4941 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4942 command_buffer_allocate_info.sType =
4943 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4944 command_buffer_allocate_info.commandPool = command_pool;
4945 command_buffer_allocate_info.commandBufferCount = 2;
4946 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4947 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4948 command_buffer);
4949
4950 VkQueue queue = VK_NULL_HANDLE;
4951 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4952 1, &queue);
4953
4954 {
4955 VkCommandBufferBeginInfo begin_info{};
4956 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4957 vkBeginCommandBuffer(command_buffer[0], &begin_info);
4958
4959 vkCmdPipelineBarrier(command_buffer[0],
4960 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4961 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
4962 0, nullptr, 0, nullptr);
4963
4964 VkViewport viewport{};
4965 viewport.maxDepth = 1.0f;
4966 viewport.minDepth = 0.0f;
4967 viewport.width = 512;
4968 viewport.height = 512;
4969 viewport.x = 0;
4970 viewport.y = 0;
4971 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
4972 vkEndCommandBuffer(command_buffer[0]);
4973 }
4974 {
4975 VkCommandBufferBeginInfo begin_info{};
4976 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4977 vkBeginCommandBuffer(command_buffer[1], &begin_info);
4978
4979 VkViewport viewport{};
4980 viewport.maxDepth = 1.0f;
4981 viewport.minDepth = 0.0f;
4982 viewport.width = 512;
4983 viewport.height = 512;
4984 viewport.x = 0;
4985 viewport.y = 0;
4986 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
4987 vkEndCommandBuffer(command_buffer[1]);
4988 }
4989 {
4990 VkSubmitInfo submit_info{};
4991 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4992 submit_info.commandBufferCount = 1;
4993 submit_info.pCommandBuffers = &command_buffer[0];
4994 submit_info.signalSemaphoreCount = 1;
4995 submit_info.pSignalSemaphores = &semaphore;
4996 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4997 }
4998 {
4999 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5000 VkSubmitInfo submit_info{};
5001 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5002 submit_info.commandBufferCount = 1;
5003 submit_info.pCommandBuffers = &command_buffer[1];
5004 submit_info.waitSemaphoreCount = 1;
5005 submit_info.pWaitSemaphores = &semaphore;
5006 submit_info.pWaitDstStageMask = flags;
5007 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5008 }
5009
5010 vkQueueWaitIdle(m_device->m_queue);
5011
5012 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5013 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5014 &command_buffer[0]);
5015 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5016
5017 m_errorMonitor->VerifyNotFound();
5018}
5019
5020// This is a positive test. No errors should be generated.
5021TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
5022
5023 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5024 "submitted on separate queues, the second having a fence"
5025 "followed by a QueueWaitIdle.");
5026
Dustin Graves48458142016-04-29 16:11:55 -06005027 if ((m_device->queue_props.empty()) ||
5028 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005029 return;
5030
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005031 m_errorMonitor->ExpectSuccess();
5032
5033 VkFence fence;
5034 VkFenceCreateInfo fence_create_info{};
5035 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5036 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5037
5038 VkSemaphore semaphore;
5039 VkSemaphoreCreateInfo semaphore_create_info{};
5040 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5041 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5042 &semaphore);
5043
5044 VkCommandPool command_pool;
5045 VkCommandPoolCreateInfo pool_create_info{};
5046 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5047 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5048 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5049 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5050 &command_pool);
5051
5052 VkCommandBuffer command_buffer[2];
5053 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5054 command_buffer_allocate_info.sType =
5055 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5056 command_buffer_allocate_info.commandPool = command_pool;
5057 command_buffer_allocate_info.commandBufferCount = 2;
5058 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5059 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5060 command_buffer);
5061
5062 VkQueue queue = VK_NULL_HANDLE;
5063 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5064 1, &queue);
5065
5066 {
5067 VkCommandBufferBeginInfo begin_info{};
5068 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5069 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5070
5071 vkCmdPipelineBarrier(command_buffer[0],
5072 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5073 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5074 0, nullptr, 0, nullptr);
5075
5076 VkViewport viewport{};
5077 viewport.maxDepth = 1.0f;
5078 viewport.minDepth = 0.0f;
5079 viewport.width = 512;
5080 viewport.height = 512;
5081 viewport.x = 0;
5082 viewport.y = 0;
5083 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5084 vkEndCommandBuffer(command_buffer[0]);
5085 }
5086 {
5087 VkCommandBufferBeginInfo begin_info{};
5088 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5089 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5090
5091 VkViewport viewport{};
5092 viewport.maxDepth = 1.0f;
5093 viewport.minDepth = 0.0f;
5094 viewport.width = 512;
5095 viewport.height = 512;
5096 viewport.x = 0;
5097 viewport.y = 0;
5098 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5099 vkEndCommandBuffer(command_buffer[1]);
5100 }
5101 {
5102 VkSubmitInfo submit_info{};
5103 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5104 submit_info.commandBufferCount = 1;
5105 submit_info.pCommandBuffers = &command_buffer[0];
5106 submit_info.signalSemaphoreCount = 1;
5107 submit_info.pSignalSemaphores = &semaphore;
5108 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5109 }
5110 {
5111 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5112 VkSubmitInfo submit_info{};
5113 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5114 submit_info.commandBufferCount = 1;
5115 submit_info.pCommandBuffers = &command_buffer[1];
5116 submit_info.waitSemaphoreCount = 1;
5117 submit_info.pWaitSemaphores = &semaphore;
5118 submit_info.pWaitDstStageMask = flags;
5119 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5120 }
5121
5122 vkQueueWaitIdle(m_device->m_queue);
5123
5124 vkDestroyFence(m_device->device(), fence, nullptr);
5125 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5126 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5127 &command_buffer[0]);
5128 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5129
5130 m_errorMonitor->VerifyNotFound();
5131}
5132
5133// This is a positive test. No errors should be generated.
5134TEST_F(VkLayerTest,
5135 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
5136
5137 TEST_DESCRIPTION(
5138 "Two command buffers, each in a separate QueueSubmit call "
5139 "submitted on separate queues, the second having a fence"
5140 "followed by two consecutive WaitForFences calls on the same fence.");
5141
Dustin Graves48458142016-04-29 16:11:55 -06005142 if ((m_device->queue_props.empty()) ||
5143 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005144 return;
5145
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005146 m_errorMonitor->ExpectSuccess();
5147
5148 VkFence fence;
5149 VkFenceCreateInfo fence_create_info{};
5150 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5151 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5152
5153 VkSemaphore semaphore;
5154 VkSemaphoreCreateInfo semaphore_create_info{};
5155 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5156 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5157 &semaphore);
5158
5159 VkCommandPool command_pool;
5160 VkCommandPoolCreateInfo pool_create_info{};
5161 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5162 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5163 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5164 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5165 &command_pool);
5166
5167 VkCommandBuffer command_buffer[2];
5168 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5169 command_buffer_allocate_info.sType =
5170 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5171 command_buffer_allocate_info.commandPool = command_pool;
5172 command_buffer_allocate_info.commandBufferCount = 2;
5173 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5174 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5175 command_buffer);
5176
5177 VkQueue queue = VK_NULL_HANDLE;
5178 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5179 1, &queue);
5180
5181 {
5182 VkCommandBufferBeginInfo begin_info{};
5183 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5184 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5185
5186 vkCmdPipelineBarrier(command_buffer[0],
5187 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5188 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5189 0, nullptr, 0, nullptr);
5190
5191 VkViewport viewport{};
5192 viewport.maxDepth = 1.0f;
5193 viewport.minDepth = 0.0f;
5194 viewport.width = 512;
5195 viewport.height = 512;
5196 viewport.x = 0;
5197 viewport.y = 0;
5198 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5199 vkEndCommandBuffer(command_buffer[0]);
5200 }
5201 {
5202 VkCommandBufferBeginInfo begin_info{};
5203 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5204 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5205
5206 VkViewport viewport{};
5207 viewport.maxDepth = 1.0f;
5208 viewport.minDepth = 0.0f;
5209 viewport.width = 512;
5210 viewport.height = 512;
5211 viewport.x = 0;
5212 viewport.y = 0;
5213 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5214 vkEndCommandBuffer(command_buffer[1]);
5215 }
5216 {
5217 VkSubmitInfo submit_info{};
5218 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5219 submit_info.commandBufferCount = 1;
5220 submit_info.pCommandBuffers = &command_buffer[0];
5221 submit_info.signalSemaphoreCount = 1;
5222 submit_info.pSignalSemaphores = &semaphore;
5223 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5224 }
5225 {
5226 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5227 VkSubmitInfo submit_info{};
5228 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5229 submit_info.commandBufferCount = 1;
5230 submit_info.pCommandBuffers = &command_buffer[1];
5231 submit_info.waitSemaphoreCount = 1;
5232 submit_info.pWaitSemaphores = &semaphore;
5233 submit_info.pWaitDstStageMask = flags;
5234 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5235 }
5236
5237 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5238 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5239
5240 vkDestroyFence(m_device->device(), fence, nullptr);
5241 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5242 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5243 &command_buffer[0]);
5244 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5245
5246 m_errorMonitor->VerifyNotFound();
5247}
5248
Chris Forbes0f8126b2016-06-20 17:48:22 +12005249#if 0
5250TEST_F(VkLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
5251 if ((m_device->queue_props.empty()) ||
5252 (m_device->queue_props[0].queueCount < 2)) {
5253 printf("Test requires two queues, skipping\n");
5254 return;
5255 }
5256
5257 VkResult err;
5258
5259 m_errorMonitor->ExpectSuccess();
5260
5261 VkQueue q0 = m_device->m_queue;
5262 VkQueue q1 = nullptr;
5263 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
5264 ASSERT_NE(q1, nullptr);
5265
5266 // An (empty) command buffer. We must have work in the first submission --
5267 // the layer treats unfenced work differently from fenced work.
5268 VkCommandPoolCreateInfo cpci = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0 };
5269 VkCommandPool pool;
5270 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
5271 ASSERT_VK_SUCCESS(err);
5272 VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr,
5273 pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1
5274 };
5275 VkCommandBuffer cb;
5276 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
5277 ASSERT_VK_SUCCESS(err);
5278 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
5279 0, nullptr
5280 };
5281 err = vkBeginCommandBuffer(cb, &cbbi);
5282 ASSERT_VK_SUCCESS(err);
5283 err = vkEndCommandBuffer(cb);
5284 ASSERT_VK_SUCCESS(err);
5285
5286 // A semaphore
5287 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
5288 VkSemaphore s;
5289 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
5290 ASSERT_VK_SUCCESS(err);
5291
5292 // First submission, to q0
5293 VkSubmitInfo s0 = {
5294 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5295 0, nullptr, nullptr,
5296 1, &cb,
5297 1, &s
5298 };
5299
5300 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
5301 ASSERT_VK_SUCCESS(err);
5302
5303 // Second submission, to q1, waiting on s
5304 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
5305 VkSubmitInfo s1 = {
5306 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5307 1, &s, &waitmask,
5308 0, nullptr,
5309 0, nullptr
5310 };
5311
5312 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
5313 ASSERT_VK_SUCCESS(err);
5314
5315 // Wait for q0 idle
5316 err = vkQueueWaitIdle(q0);
5317 ASSERT_VK_SUCCESS(err);
5318
5319 // Command buffer should have been completed (it was on q0); reset the pool.
5320 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
5321
5322 m_errorMonitor->VerifyNotFound();
5323
5324 // Force device completely idle and clean up resources
5325 vkDeviceWaitIdle(m_device->device());
5326 vkDestroyCommandPool(m_device->device(), pool, nullptr);
5327 vkDestroySemaphore(m_device->device(), s, nullptr);
5328}
5329#endif
5330
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005331// This is a positive test. No errors should be generated.
5332TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
5333
5334 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5335 "submitted on separate queues, the second having a fence, "
5336 "followed by a WaitForFences call.");
5337
Dustin Graves48458142016-04-29 16:11:55 -06005338 if ((m_device->queue_props.empty()) ||
5339 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005340 return;
5341
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005342 m_errorMonitor->ExpectSuccess();
5343
5344 VkFence fence;
5345 VkFenceCreateInfo fence_create_info{};
5346 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5347 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5348
5349 VkSemaphore semaphore;
5350 VkSemaphoreCreateInfo semaphore_create_info{};
5351 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5352 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5353 &semaphore);
5354
5355 VkCommandPool command_pool;
5356 VkCommandPoolCreateInfo pool_create_info{};
5357 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5358 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5359 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5360 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5361 &command_pool);
5362
5363 VkCommandBuffer command_buffer[2];
5364 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5365 command_buffer_allocate_info.sType =
5366 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5367 command_buffer_allocate_info.commandPool = command_pool;
5368 command_buffer_allocate_info.commandBufferCount = 2;
5369 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5370 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5371 command_buffer);
5372
5373 VkQueue queue = VK_NULL_HANDLE;
5374 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5375 1, &queue);
5376
5377
5378 {
5379 VkCommandBufferBeginInfo begin_info{};
5380 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5381 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5382
5383 vkCmdPipelineBarrier(command_buffer[0],
5384 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5385 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5386 0, nullptr, 0, nullptr);
5387
5388 VkViewport viewport{};
5389 viewport.maxDepth = 1.0f;
5390 viewport.minDepth = 0.0f;
5391 viewport.width = 512;
5392 viewport.height = 512;
5393 viewport.x = 0;
5394 viewport.y = 0;
5395 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5396 vkEndCommandBuffer(command_buffer[0]);
5397 }
5398 {
5399 VkCommandBufferBeginInfo begin_info{};
5400 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5401 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5402
5403 VkViewport viewport{};
5404 viewport.maxDepth = 1.0f;
5405 viewport.minDepth = 0.0f;
5406 viewport.width = 512;
5407 viewport.height = 512;
5408 viewport.x = 0;
5409 viewport.y = 0;
5410 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5411 vkEndCommandBuffer(command_buffer[1]);
5412 }
5413 {
5414 VkSubmitInfo submit_info{};
5415 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5416 submit_info.commandBufferCount = 1;
5417 submit_info.pCommandBuffers = &command_buffer[0];
5418 submit_info.signalSemaphoreCount = 1;
5419 submit_info.pSignalSemaphores = &semaphore;
5420 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5421 }
5422 {
5423 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5424 VkSubmitInfo submit_info{};
5425 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5426 submit_info.commandBufferCount = 1;
5427 submit_info.pCommandBuffers = &command_buffer[1];
5428 submit_info.waitSemaphoreCount = 1;
5429 submit_info.pWaitSemaphores = &semaphore;
5430 submit_info.pWaitDstStageMask = flags;
5431 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5432 }
5433
5434 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5435
5436 vkDestroyFence(m_device->device(), fence, nullptr);
5437 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5438 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5439 &command_buffer[0]);
5440 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5441
5442 m_errorMonitor->VerifyNotFound();
5443}
5444
5445// This is a positive test. No errors should be generated.
5446TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
5447
5448 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5449 "on the same queue, sharing a signal/wait semaphore, the "
5450 "second having a fence, "
5451 "followed by a WaitForFences call.");
5452
5453 m_errorMonitor->ExpectSuccess();
5454
5455 VkFence fence;
5456 VkFenceCreateInfo fence_create_info{};
5457 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5458 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5459
5460 VkSemaphore semaphore;
5461 VkSemaphoreCreateInfo semaphore_create_info{};
5462 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5463 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5464 &semaphore);
5465
5466 VkCommandPool command_pool;
5467 VkCommandPoolCreateInfo pool_create_info{};
5468 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5469 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5470 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5471 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5472 &command_pool);
5473
5474 VkCommandBuffer command_buffer[2];
5475 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5476 command_buffer_allocate_info.sType =
5477 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5478 command_buffer_allocate_info.commandPool = command_pool;
5479 command_buffer_allocate_info.commandBufferCount = 2;
5480 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5481 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5482 command_buffer);
5483
5484 {
5485 VkCommandBufferBeginInfo begin_info{};
5486 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5487 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5488
5489 vkCmdPipelineBarrier(command_buffer[0],
5490 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5491 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5492 0, nullptr, 0, nullptr);
5493
5494 VkViewport viewport{};
5495 viewport.maxDepth = 1.0f;
5496 viewport.minDepth = 0.0f;
5497 viewport.width = 512;
5498 viewport.height = 512;
5499 viewport.x = 0;
5500 viewport.y = 0;
5501 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5502 vkEndCommandBuffer(command_buffer[0]);
5503 }
5504 {
5505 VkCommandBufferBeginInfo begin_info{};
5506 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5507 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5508
5509 VkViewport viewport{};
5510 viewport.maxDepth = 1.0f;
5511 viewport.minDepth = 0.0f;
5512 viewport.width = 512;
5513 viewport.height = 512;
5514 viewport.x = 0;
5515 viewport.y = 0;
5516 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5517 vkEndCommandBuffer(command_buffer[1]);
5518 }
5519 {
5520 VkSubmitInfo submit_info{};
5521 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5522 submit_info.commandBufferCount = 1;
5523 submit_info.pCommandBuffers = &command_buffer[0];
5524 submit_info.signalSemaphoreCount = 1;
5525 submit_info.pSignalSemaphores = &semaphore;
5526 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5527 }
5528 {
5529 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5530 VkSubmitInfo submit_info{};
5531 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5532 submit_info.commandBufferCount = 1;
5533 submit_info.pCommandBuffers = &command_buffer[1];
5534 submit_info.waitSemaphoreCount = 1;
5535 submit_info.pWaitSemaphores = &semaphore;
5536 submit_info.pWaitDstStageMask = flags;
5537 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5538 }
5539
5540 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5541
5542 vkDestroyFence(m_device->device(), fence, nullptr);
5543 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5544 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5545 &command_buffer[0]);
5546 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5547
5548 m_errorMonitor->VerifyNotFound();
5549}
5550
5551// This is a positive test. No errors should be generated.
5552TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
5553
5554 TEST_DESCRIPTION(
5555 "Two command buffers, each in a separate QueueSubmit call "
5556 "on the same queue, no fences, followed by a third QueueSubmit with NO "
5557 "SubmitInfos but with a fence, followed by a WaitForFences call.");
5558
5559 m_errorMonitor->ExpectSuccess();
5560
5561 VkFence fence;
5562 VkFenceCreateInfo fence_create_info{};
5563 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5564 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5565
5566 VkCommandPool command_pool;
5567 VkCommandPoolCreateInfo pool_create_info{};
5568 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5569 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5570 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5571 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5572 &command_pool);
5573
5574 VkCommandBuffer command_buffer[2];
5575 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5576 command_buffer_allocate_info.sType =
5577 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5578 command_buffer_allocate_info.commandPool = command_pool;
5579 command_buffer_allocate_info.commandBufferCount = 2;
5580 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5581 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5582 command_buffer);
5583
5584 {
5585 VkCommandBufferBeginInfo begin_info{};
5586 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5587 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5588
5589 vkCmdPipelineBarrier(command_buffer[0],
5590 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5591 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5592 0, nullptr, 0, nullptr);
5593
5594 VkViewport viewport{};
5595 viewport.maxDepth = 1.0f;
5596 viewport.minDepth = 0.0f;
5597 viewport.width = 512;
5598 viewport.height = 512;
5599 viewport.x = 0;
5600 viewport.y = 0;
5601 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5602 vkEndCommandBuffer(command_buffer[0]);
5603 }
5604 {
5605 VkCommandBufferBeginInfo begin_info{};
5606 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5607 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5608
5609 VkViewport viewport{};
5610 viewport.maxDepth = 1.0f;
5611 viewport.minDepth = 0.0f;
5612 viewport.width = 512;
5613 viewport.height = 512;
5614 viewport.x = 0;
5615 viewport.y = 0;
5616 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5617 vkEndCommandBuffer(command_buffer[1]);
5618 }
5619 {
5620 VkSubmitInfo submit_info{};
5621 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5622 submit_info.commandBufferCount = 1;
5623 submit_info.pCommandBuffers = &command_buffer[0];
5624 submit_info.signalSemaphoreCount = 0;
5625 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
5626 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5627 }
5628 {
5629 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5630 VkSubmitInfo submit_info{};
5631 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5632 submit_info.commandBufferCount = 1;
5633 submit_info.pCommandBuffers = &command_buffer[1];
5634 submit_info.waitSemaphoreCount = 0;
5635 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
5636 submit_info.pWaitDstStageMask = flags;
5637 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5638 }
5639
5640 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
5641
Mike Stroyancd1c3e52016-06-21 09:20:01 -06005642 VkResult err =
5643 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5644 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005645
5646 vkDestroyFence(m_device->device(), fence, nullptr);
5647 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5648 &command_buffer[0]);
5649 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5650
5651 m_errorMonitor->VerifyNotFound();
5652}
5653
5654// This is a positive test. No errors should be generated.
5655TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
5656
5657 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5658 "on the same queue, the second having a fence, followed "
5659 "by a WaitForFences call.");
5660
5661 m_errorMonitor->ExpectSuccess();
5662
5663 VkFence fence;
5664 VkFenceCreateInfo fence_create_info{};
5665 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5666 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5667
5668 VkCommandPool command_pool;
5669 VkCommandPoolCreateInfo pool_create_info{};
5670 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5671 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5672 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5673 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5674 &command_pool);
5675
5676 VkCommandBuffer command_buffer[2];
5677 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5678 command_buffer_allocate_info.sType =
5679 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5680 command_buffer_allocate_info.commandPool = command_pool;
5681 command_buffer_allocate_info.commandBufferCount = 2;
5682 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5683 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5684 command_buffer);
5685
5686 {
5687 VkCommandBufferBeginInfo begin_info{};
5688 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5689 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5690
5691 vkCmdPipelineBarrier(command_buffer[0],
5692 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5693 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5694 0, nullptr, 0, nullptr);
5695
5696 VkViewport viewport{};
5697 viewport.maxDepth = 1.0f;
5698 viewport.minDepth = 0.0f;
5699 viewport.width = 512;
5700 viewport.height = 512;
5701 viewport.x = 0;
5702 viewport.y = 0;
5703 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5704 vkEndCommandBuffer(command_buffer[0]);
5705 }
5706 {
5707 VkCommandBufferBeginInfo begin_info{};
5708 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5709 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5710
5711 VkViewport viewport{};
5712 viewport.maxDepth = 1.0f;
5713 viewport.minDepth = 0.0f;
5714 viewport.width = 512;
5715 viewport.height = 512;
5716 viewport.x = 0;
5717 viewport.y = 0;
5718 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5719 vkEndCommandBuffer(command_buffer[1]);
5720 }
5721 {
5722 VkSubmitInfo submit_info{};
5723 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5724 submit_info.commandBufferCount = 1;
5725 submit_info.pCommandBuffers = &command_buffer[0];
5726 submit_info.signalSemaphoreCount = 0;
5727 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
5728 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5729 }
5730 {
5731 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5732 VkSubmitInfo submit_info{};
5733 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5734 submit_info.commandBufferCount = 1;
5735 submit_info.pCommandBuffers = &command_buffer[1];
5736 submit_info.waitSemaphoreCount = 0;
5737 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
5738 submit_info.pWaitDstStageMask = flags;
5739 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5740 }
5741
5742 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5743
5744 vkDestroyFence(m_device->device(), fence, nullptr);
5745 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5746 &command_buffer[0]);
5747 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5748
5749 m_errorMonitor->VerifyNotFound();
5750}
5751
5752// This is a positive test. No errors should be generated.
5753TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
5754
5755 TEST_DESCRIPTION(
5756 "Two command buffers each in a separate SubmitInfo sent in a single "
5757 "QueueSubmit call followed by a WaitForFences call.");
5758
5759 m_errorMonitor->ExpectSuccess();
5760
5761 VkFence fence;
5762 VkFenceCreateInfo fence_create_info{};
5763 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5764 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5765
5766 VkSemaphore semaphore;
5767 VkSemaphoreCreateInfo semaphore_create_info{};
5768 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5769 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5770 &semaphore);
5771
5772 VkCommandPool command_pool;
5773 VkCommandPoolCreateInfo pool_create_info{};
5774 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5775 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5776 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5777 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5778 &command_pool);
5779
5780 VkCommandBuffer command_buffer[2];
5781 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5782 command_buffer_allocate_info.sType =
5783 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5784 command_buffer_allocate_info.commandPool = command_pool;
5785 command_buffer_allocate_info.commandBufferCount = 2;
5786 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5787 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5788 command_buffer);
5789
5790 {
5791 VkCommandBufferBeginInfo begin_info{};
5792 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5793 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5794
5795 vkCmdPipelineBarrier(command_buffer[0],
5796 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5797 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5798 0, nullptr, 0, nullptr);
5799
5800 VkViewport viewport{};
5801 viewport.maxDepth = 1.0f;
5802 viewport.minDepth = 0.0f;
5803 viewport.width = 512;
5804 viewport.height = 512;
5805 viewport.x = 0;
5806 viewport.y = 0;
5807 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5808 vkEndCommandBuffer(command_buffer[0]);
5809 }
5810 {
5811 VkCommandBufferBeginInfo begin_info{};
5812 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5813 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5814
5815 VkViewport viewport{};
5816 viewport.maxDepth = 1.0f;
5817 viewport.minDepth = 0.0f;
5818 viewport.width = 512;
5819 viewport.height = 512;
5820 viewport.x = 0;
5821 viewport.y = 0;
5822 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5823 vkEndCommandBuffer(command_buffer[1]);
5824 }
5825 {
5826 VkSubmitInfo submit_info[2];
5827 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5828
5829 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5830 submit_info[0].pNext = NULL;
5831 submit_info[0].commandBufferCount = 1;
5832 submit_info[0].pCommandBuffers = &command_buffer[0];
5833 submit_info[0].signalSemaphoreCount = 1;
5834 submit_info[0].pSignalSemaphores = &semaphore;
5835 submit_info[0].waitSemaphoreCount = 0;
5836 submit_info[0].pWaitSemaphores = NULL;
5837 submit_info[0].pWaitDstStageMask = 0;
5838
5839 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5840 submit_info[1].pNext = NULL;
5841 submit_info[1].commandBufferCount = 1;
5842 submit_info[1].pCommandBuffers = &command_buffer[1];
5843 submit_info[1].waitSemaphoreCount = 1;
5844 submit_info[1].pWaitSemaphores = &semaphore;
5845 submit_info[1].pWaitDstStageMask = flags;
5846 submit_info[1].signalSemaphoreCount = 0;
5847 submit_info[1].pSignalSemaphores = NULL;
5848 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
5849 }
5850
5851 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5852
5853 vkDestroyFence(m_device->device(), fence, nullptr);
5854 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5855 &command_buffer[0]);
5856 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06005857 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005858
5859 m_errorMonitor->VerifyNotFound();
5860}
5861
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005862TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005863 TEST_DESCRIPTION(
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005864 "Run a simple draw calls to validate failure when Depth Bias dynamic "
5865 "state is required but not correctly bound.");
5866
5867 // Dynamic depth bias
5868 m_errorMonitor->SetDesiredFailureMsg(
5869 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5870 "Dynamic depth bias state not set for this command buffer");
5871 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5872 BsoFailDepthBias);
5873 m_errorMonitor->VerifyFound();
5874}
5875
5876TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
5877 TEST_DESCRIPTION(
5878 "Run a simple draw calls to validate failure when Line Width dynamic "
5879 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005880
5881 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07005882 m_errorMonitor->SetDesiredFailureMsg(
5883 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005884 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005885 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5886 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005887 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005888}
5889
5890TEST_F(VkLayerTest, DynamicViewportNotBound) {
5891 TEST_DESCRIPTION(
5892 "Run a simple draw calls to validate failure when Viewport dynamic "
5893 "state is required but not correctly bound.");
5894
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005895 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07005896 m_errorMonitor->SetDesiredFailureMsg(
5897 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005898 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005899 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5900 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005901 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005902}
5903
5904TEST_F(VkLayerTest, DynamicScissorNotBound) {
5905 TEST_DESCRIPTION(
5906 "Run a simple draw calls to validate failure when Scissor dynamic "
5907 "state is required but not correctly bound.");
5908
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005909 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07005910 m_errorMonitor->SetDesiredFailureMsg(
5911 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005912 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005913 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5914 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005915 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005916}
5917
Tobin Ehlis21c88352016-05-26 06:15:45 -06005918TEST_F(VkLayerTest, DynamiBlendConstantsNotBound) {
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005919 TEST_DESCRIPTION(
Tobin Ehlis21c88352016-05-26 06:15:45 -06005920 "Run a simple draw calls to validate failure when Blend Constants "
5921 "dynamic state is required but not correctly bound.");
5922 // Dynamic blend constant state
5923 m_errorMonitor->SetDesiredFailureMsg(
5924 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5925 "Dynamic blend constants state not set for this command buffer");
5926 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5927 BsoFailBlend);
5928 m_errorMonitor->VerifyFound();
5929}
5930
5931TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
5932 TEST_DESCRIPTION(
5933 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005934 "state is required but not correctly bound.");
Tobin Ehlis21c88352016-05-26 06:15:45 -06005935 if (!m_device->phy().features().depthBounds) {
5936 printf("Device does not support depthBounds test; skipped.\n");
5937 return;
5938 }
5939 // Dynamic depth bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005940 m_errorMonitor->SetDesiredFailureMsg(
5941 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005942 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005943 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5944 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005945 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005946}
5947
5948TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
5949 TEST_DESCRIPTION(
5950 "Run a simple draw calls to validate failure when Stencil Read dynamic "
5951 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005952 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07005953 m_errorMonitor->SetDesiredFailureMsg(
5954 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005955 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005956 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5957 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005958 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005959}
5960
5961TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
5962 TEST_DESCRIPTION(
5963 "Run a simple draw calls to validate failure when Stencil Write dynamic"
5964 " state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005965 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07005966 m_errorMonitor->SetDesiredFailureMsg(
5967 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005968 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005969 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5970 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005971 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005972}
5973
5974TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
5975 TEST_DESCRIPTION(
5976 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
5977 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005978 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07005979 m_errorMonitor->SetDesiredFailureMsg(
5980 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005981 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005982 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5983 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005984 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06005985}
5986
Karl Schultz6addd812016-02-02 17:17:23 -07005987TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Karl Schultz6addd812016-02-02 17:17:23 -07005988 m_errorMonitor->SetDesiredFailureMsg(
5989 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5990 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
5991 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06005992
Tobin Ehlis59278bf2015-08-18 07:10:58 -06005993 ASSERT_NO_FATAL_FAILURE(InitState());
5994 ASSERT_NO_FATAL_FAILURE(InitViewport());
5995 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5996
Karl Schultz6addd812016-02-02 17:17:23 -07005997 // We luck out b/c by default the framework creates CB w/ the
5998 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06005999 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006000 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
6001 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006002 EndCommandBuffer();
6003
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006004 // Bypass framework since it does the waits automatically
6005 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006006 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08006007 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6008 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006009 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006010 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07006011 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006012 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006013 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08006014 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006015 submit_info.pSignalSemaphores = NULL;
6016
Chris Forbes40028e22016-06-13 09:59:34 +12006017 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07006018 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006019
Karl Schultz6addd812016-02-02 17:17:23 -07006020 // Cause validation error by re-submitting cmd buffer that should only be
6021 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12006022 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006023
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006024 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006025}
6026
Karl Schultz6addd812016-02-02 17:17:23 -07006027TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006028 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07006029 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006030
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006032 "Unable to allocate 1 descriptors of "
6033 "type "
6034 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006035
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006036 ASSERT_NO_FATAL_FAILURE(InitState());
6037 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006038
Karl Schultz6addd812016-02-02 17:17:23 -07006039 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
6040 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006041 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006042 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6043 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006044
6045 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006046 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6047 ds_pool_ci.pNext = NULL;
6048 ds_pool_ci.flags = 0;
6049 ds_pool_ci.maxSets = 1;
6050 ds_pool_ci.poolSizeCount = 1;
6051 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006052
6053 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006054 err =
6055 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006056 ASSERT_VK_SUCCESS(err);
6057
6058 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006059 dsl_binding.binding = 0;
6060 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6061 dsl_binding.descriptorCount = 1;
6062 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6063 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006064
6065 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006066 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6067 ds_layout_ci.pNext = NULL;
6068 ds_layout_ci.bindingCount = 1;
6069 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006070
6071 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006072 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6073 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006074 ASSERT_VK_SUCCESS(err);
6075
6076 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006077 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006078 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006079 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006080 alloc_info.descriptorPool = ds_pool;
6081 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006082 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6083 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006084
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006085 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006086
Chia-I Wuf7458c52015-10-26 21:10:41 +08006087 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6088 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006089}
6090
Karl Schultz6addd812016-02-02 17:17:23 -07006091TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
6092 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06006093
Karl Schultz6addd812016-02-02 17:17:23 -07006094 m_errorMonitor->SetDesiredFailureMsg(
6095 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6096 "It is invalid to call vkFreeDescriptorSets() with a pool created "
6097 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006098
Tobin Ehlise735c692015-10-08 13:13:50 -06006099 ASSERT_NO_FATAL_FAILURE(InitState());
6100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06006101
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006102 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006103 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6104 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06006105
6106 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006107 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6108 ds_pool_ci.pNext = NULL;
6109 ds_pool_ci.maxSets = 1;
6110 ds_pool_ci.poolSizeCount = 1;
6111 ds_pool_ci.flags = 0;
6112 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
6113 // app can only call vkResetDescriptorPool on this pool.;
6114 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06006115
6116 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006117 err =
6118 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06006119 ASSERT_VK_SUCCESS(err);
6120
6121 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006122 dsl_binding.binding = 0;
6123 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6124 dsl_binding.descriptorCount = 1;
6125 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6126 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06006127
6128 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006129 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6130 ds_layout_ci.pNext = NULL;
6131 ds_layout_ci.bindingCount = 1;
6132 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06006133
6134 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006135 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6136 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06006137 ASSERT_VK_SUCCESS(err);
6138
6139 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006140 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006141 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006142 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006143 alloc_info.descriptorPool = ds_pool;
6144 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006145 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6146 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06006147 ASSERT_VK_SUCCESS(err);
6148
6149 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006150 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06006151
Chia-I Wuf7458c52015-10-26 21:10:41 +08006152 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6153 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06006154}
6155
Karl Schultz6addd812016-02-02 17:17:23 -07006156TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006157 // Attempt to clear Descriptor Pool with bad object.
6158 // ObjectTracker should catch this.
6159 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6160 "Invalid VkDescriptorPool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006161 uint64_t fake_pool_handle = 0xbaad6001;
6162 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
6163 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06006164 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006165}
6166
Karl Schultz6addd812016-02-02 17:17:23 -07006167TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006168 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
6169 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006170 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06006171 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006172
6173 uint64_t fake_set_handle = 0xbaad6001;
6174 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006175 VkResult err;
6176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6177 "Invalid VkDescriptorSet Object 0xbaad6001");
6178
6179 ASSERT_NO_FATAL_FAILURE(InitState());
6180
6181 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
6182 layout_bindings[0].binding = 0;
6183 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6184 layout_bindings[0].descriptorCount = 1;
6185 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
6186 layout_bindings[0].pImmutableSamplers = NULL;
6187
6188 VkDescriptorSetLayout descriptor_set_layout;
6189 VkDescriptorSetLayoutCreateInfo dslci = {};
6190 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6191 dslci.pNext = NULL;
6192 dslci.bindingCount = 1;
6193 dslci.pBindings = layout_bindings;
6194 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006195 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006196
6197 VkPipelineLayout pipeline_layout;
6198 VkPipelineLayoutCreateInfo plci = {};
6199 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6200 plci.pNext = NULL;
6201 plci.setLayoutCount = 1;
6202 plci.pSetLayouts = &descriptor_set_layout;
6203 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006204 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006205
6206 BeginCommandBuffer();
6207 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006208 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06006209 m_errorMonitor->VerifyFound();
6210 EndCommandBuffer();
6211 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
6212 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006213}
6214
Karl Schultz6addd812016-02-02 17:17:23 -07006215TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006216 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
6217 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006218 uint64_t fake_layout_handle = 0xbaad6001;
6219 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6221 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
6222
6223 VkPipelineLayout pipeline_layout;
6224 VkPipelineLayoutCreateInfo plci = {};
6225 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6226 plci.pNext = NULL;
6227 plci.setLayoutCount = 1;
6228 plci.pSetLayouts = &bad_layout;
6229 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
6230
6231 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006232}
6233
Mark Muellerd4914412016-06-13 17:52:06 -06006234TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
6235 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
6236 "1) A uniform buffer update must have a valid buffer index."
6237 "2) When using an array of descriptors in a single WriteDescriptor,"
6238 " the descriptor types and stageflags must all be the same."
6239 "3) Immutable Sampler state must match across descriptors");
6240
6241 const char *invalid_BufferInfo_ErrorMessage =
6242 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
6243 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
6244 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
6245 const char *stateFlag_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006246 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006247 const char *immutable_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006248 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006249
Mark Muellerd4914412016-06-13 17:52:06 -06006250 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
6251
6252 ASSERT_NO_FATAL_FAILURE(InitState());
6253 VkDescriptorPoolSize ds_type_count[4] = {};
6254 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6255 ds_type_count[0].descriptorCount = 1;
6256 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6257 ds_type_count[1].descriptorCount = 1;
6258 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6259 ds_type_count[2].descriptorCount = 1;
6260 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6261 ds_type_count[3].descriptorCount = 1;
6262
6263 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6264 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6265 ds_pool_ci.maxSets = 1;
6266 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
6267 ds_pool_ci.pPoolSizes = ds_type_count;
6268
6269 VkDescriptorPool ds_pool;
6270 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6271 ASSERT_VK_SUCCESS(err);
6272
Mark Muellerb9896722016-06-16 09:54:29 -06006273 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006274 layout_binding[0].binding = 0;
6275 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6276 layout_binding[0].descriptorCount = 1;
6277 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6278 layout_binding[0].pImmutableSamplers = NULL;
6279
6280 layout_binding[1].binding = 1;
6281 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6282 layout_binding[1].descriptorCount = 1;
6283 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6284 layout_binding[1].pImmutableSamplers = NULL;
6285
6286 VkSamplerCreateInfo sampler_ci = {};
6287 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6288 sampler_ci.pNext = NULL;
6289 sampler_ci.magFilter = VK_FILTER_NEAREST;
6290 sampler_ci.minFilter = VK_FILTER_NEAREST;
6291 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6292 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6293 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6294 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6295 sampler_ci.mipLodBias = 1.0;
6296 sampler_ci.anisotropyEnable = VK_FALSE;
6297 sampler_ci.maxAnisotropy = 1;
6298 sampler_ci.compareEnable = VK_FALSE;
6299 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6300 sampler_ci.minLod = 1.0;
6301 sampler_ci.maxLod = 1.0;
6302 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6303 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6304 VkSampler sampler;
6305
6306 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6307 ASSERT_VK_SUCCESS(err);
6308
6309 layout_binding[2].binding = 2;
6310 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6311 layout_binding[2].descriptorCount = 1;
6312 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6313 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
6314
Mark Muellerd4914412016-06-13 17:52:06 -06006315 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6316 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6317 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
6318 ds_layout_ci.pBindings = layout_binding;
6319 VkDescriptorSetLayout ds_layout;
6320 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6321 ASSERT_VK_SUCCESS(err);
6322
6323 VkDescriptorSetAllocateInfo alloc_info = {};
6324 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6325 alloc_info.descriptorSetCount = 1;
6326 alloc_info.descriptorPool = ds_pool;
6327 alloc_info.pSetLayouts = &ds_layout;
6328 VkDescriptorSet descriptorSet;
6329 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6330 ASSERT_VK_SUCCESS(err);
6331
6332 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6333 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6334 pipeline_layout_ci.pNext = NULL;
6335 pipeline_layout_ci.setLayoutCount = 1;
6336 pipeline_layout_ci.pSetLayouts = &ds_layout;
6337
6338 VkPipelineLayout pipeline_layout;
6339 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6340 ASSERT_VK_SUCCESS(err);
6341
Mark Mueller5c838ce2016-06-16 09:54:29 -06006342 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006343 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6344 descriptor_write.dstSet = descriptorSet;
6345 descriptor_write.dstBinding = 0;
6346 descriptor_write.descriptorCount = 1;
6347 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6348
Mark Mueller5c838ce2016-06-16 09:54:29 -06006349 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06006350 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6351 m_errorMonitor->VerifyFound();
6352
6353 // Create a buffer to update the descriptor with
6354 uint32_t qfi = 0;
6355 VkBufferCreateInfo buffCI = {};
6356 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6357 buffCI.size = 1024;
6358 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6359 buffCI.queueFamilyIndexCount = 1;
6360 buffCI.pQueueFamilyIndices = &qfi;
6361
6362 VkBuffer dyub;
6363 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6364 ASSERT_VK_SUCCESS(err);
6365 VkDescriptorBufferInfo buffInfo = {};
6366 buffInfo.buffer = dyub;
6367 buffInfo.offset = 0;
6368 buffInfo.range = 1024;
6369
6370 descriptor_write.pBufferInfo = &buffInfo;
6371 descriptor_write.descriptorCount = 2;
6372
Mark Mueller5c838ce2016-06-16 09:54:29 -06006373 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06006374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
6375 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6376 m_errorMonitor->VerifyFound();
6377
Mark Mueller5c838ce2016-06-16 09:54:29 -06006378 // 3) The second descriptor has a null_ptr pImmutableSamplers and
6379 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06006380 descriptor_write.dstBinding = 1;
6381 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06006382
6383
6384 // Make pImageInfo index non-null to avoid complaints of it missing
6385 VkDescriptorImageInfo imageInfo = {};
6386 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6387 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06006388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
6389 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6390 m_errorMonitor->VerifyFound();
6391
Mark Muellerd4914412016-06-13 17:52:06 -06006392 vkDestroyBuffer(m_device->device(), dyub, NULL);
6393 vkDestroySampler(m_device->device(), sampler, NULL);
6394 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6395 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6396 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6397}
6398
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06006399TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
6400 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6401 "due to a buffer dependency being destroyed.");
6402 ASSERT_NO_FATAL_FAILURE(InitState());
6403
6404 VkImageObj image(m_device);
6405 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6406 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
6407 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
6408 VK_IMAGE_TILING_OPTIMAL, 0);
6409 ASSERT_TRUE(image.initialized());
6410
6411 VkBuffer buffer;
6412 VkDeviceMemory mem;
6413 VkMemoryRequirements mem_reqs;
6414
6415 VkBufferCreateInfo buf_info = {};
6416 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6417 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6418 buf_info.size = 256;
6419 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6420 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
6421 ASSERT_VK_SUCCESS(err);
6422
6423 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
6424
6425 VkMemoryAllocateInfo alloc_info = {};
6426 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6427 alloc_info.allocationSize = 256;
6428 bool pass = false;
6429 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
6430 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6431 if (!pass) {
6432 vkDestroyBuffer(m_device->device(), buffer, NULL);
6433 return;
6434 }
6435 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
6436 ASSERT_VK_SUCCESS(err);
6437
6438 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
6439 ASSERT_VK_SUCCESS(err);
6440
6441 VkBufferImageCopy region = {};
6442 region.bufferRowLength = 128;
6443 region.bufferImageHeight = 128;
6444 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6445
6446 region.imageSubresource.layerCount = 1;
6447 region.imageExtent.height = 4;
6448 region.imageExtent.width = 4;
6449 region.imageExtent.depth = 1;
6450 m_commandBuffer->BeginCommandBuffer();
6451 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
6452 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
6453 1, &region);
6454 m_commandBuffer->EndCommandBuffer();
6455
6456 m_errorMonitor->SetDesiredFailureMsg(
6457 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6458 " that is invalid because bound buffer ");
6459 // Destroy buffer dependency prior to submit to cause ERROR
6460 vkDestroyBuffer(m_device->device(), buffer, NULL);
6461
6462 VkSubmitInfo submit_info = {};
6463 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6464 submit_info.commandBufferCount = 1;
6465 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6466 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6467
6468 m_errorMonitor->VerifyFound();
6469 vkFreeMemory(m_device->handle(), mem, NULL);
6470}
6471
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006472TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
6473 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6474 "due to an image dependency being destroyed.");
6475 ASSERT_NO_FATAL_FAILURE(InitState());
6476
6477 VkImage image;
6478 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6479 VkImageCreateInfo image_create_info = {};
6480 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6481 image_create_info.pNext = NULL;
6482 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6483 image_create_info.format = tex_format;
6484 image_create_info.extent.width = 32;
6485 image_create_info.extent.height = 32;
6486 image_create_info.extent.depth = 1;
6487 image_create_info.mipLevels = 1;
6488 image_create_info.arrayLayers = 1;
6489 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6490 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6491 image_create_info.usage =
6492 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6493 image_create_info.flags = 0;
6494 VkResult err =
6495 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6496 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006497 // Have to bind memory to image before recording cmd in cmd buffer using it
6498 VkMemoryRequirements mem_reqs;
6499 VkDeviceMemory image_mem;
6500 bool pass;
6501 VkMemoryAllocateInfo mem_alloc = {};
6502 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6503 mem_alloc.pNext = NULL;
6504 mem_alloc.memoryTypeIndex = 0;
6505 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
6506 mem_alloc.allocationSize = mem_reqs.size;
6507 pass =
6508 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
6509 ASSERT_TRUE(pass);
6510 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
6511 ASSERT_VK_SUCCESS(err);
6512 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
6513 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006514
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006515 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06006516 VkClearColorValue ccv;
6517 ccv.float32[0] = 1.0f;
6518 ccv.float32[1] = 1.0f;
6519 ccv.float32[2] = 1.0f;
6520 ccv.float32[3] = 1.0f;
6521 VkImageSubresourceRange isr = {};
6522 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006523 isr.baseArrayLayer = 0;
6524 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06006525 isr.layerCount = 1;
6526 isr.levelCount = 1;
6527 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
6528 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006529 m_commandBuffer->EndCommandBuffer();
6530
6531 m_errorMonitor->SetDesiredFailureMsg(
6532 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
6533 // Destroy image dependency prior to submit to cause ERROR
6534 vkDestroyImage(m_device->device(), image, NULL);
6535
6536 VkSubmitInfo submit_info = {};
6537 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6538 submit_info.commandBufferCount = 1;
6539 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6540 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6541
6542 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006543 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006544}
6545
Tobin Ehlis85940f52016-07-07 16:57:21 -06006546TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
6547 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6548 "due to an event dependency being destroyed.");
6549 ASSERT_NO_FATAL_FAILURE(InitState());
6550
6551 VkEvent event;
6552 VkEventCreateInfo evci = {};
6553 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6554 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
6555 ASSERT_VK_SUCCESS(result);
6556
6557 m_commandBuffer->BeginCommandBuffer();
6558 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event,
6559 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
6560 m_commandBuffer->EndCommandBuffer();
6561
6562 m_errorMonitor->SetDesiredFailureMsg(
6563 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
6564 // Destroy event dependency prior to submit to cause ERROR
6565 vkDestroyEvent(m_device->device(), event, NULL);
6566
6567 VkSubmitInfo submit_info = {};
6568 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6569 submit_info.commandBufferCount = 1;
6570 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6571 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6572
6573 m_errorMonitor->VerifyFound();
6574}
6575
Tobin Ehlisdbea7552016-07-08 14:33:31 -06006576TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
6577 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6578 "due to a query pool dependency being destroyed.");
6579 ASSERT_NO_FATAL_FAILURE(InitState());
6580
6581 VkQueryPool query_pool;
6582 VkQueryPoolCreateInfo qpci{};
6583 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
6584 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
6585 qpci.queryCount = 1;
6586 VkResult result =
6587 vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
6588 ASSERT_VK_SUCCESS(result);
6589
6590 m_commandBuffer->BeginCommandBuffer();
6591 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
6592 m_commandBuffer->EndCommandBuffer();
6593
6594 m_errorMonitor->SetDesiredFailureMsg(
6595 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6596 " that is invalid because bound query pool ");
6597 // Destroy query pool dependency prior to submit to cause ERROR
6598 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
6599
6600 VkSubmitInfo submit_info = {};
6601 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6602 submit_info.commandBufferCount = 1;
6603 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6604 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6605
6606 m_errorMonitor->VerifyFound();
6607}
6608
Karl Schultz6addd812016-02-02 17:17:23 -07006609TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006610 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6611 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006612 // Create a valid cmd buffer
6613 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006614 uint64_t fake_pipeline_handle = 0xbaad6001;
6615 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6617 "Invalid VkPipeline Object 0xbaad6001");
6618 ASSERT_NO_FATAL_FAILURE(InitState());
6619 BeginCommandBuffer();
6620 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6621 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
6622 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006623 // Now issue a draw call with no pipeline bound
6624 m_errorMonitor->SetDesiredFailureMsg(
6625 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6626 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tony Barbourdf4c0042016-06-01 15:55:43 -06006627
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006628 BeginCommandBuffer();
6629 Draw(1, 0, 0, 0);
6630 m_errorMonitor->VerifyFound();
6631 // Finally same check once more but with Dispatch/Compute
6632 m_errorMonitor->SetDesiredFailureMsg(
6633 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6634 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006635 BeginCommandBuffer();
6636 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6637 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006638}
6639
Karl Schultz6addd812016-02-02 17:17:23 -07006640TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
6641 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
6642 // CommandBuffer
6643 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006644
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006646 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006647
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006648 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006649 ASSERT_NO_FATAL_FAILURE(InitViewport());
6650 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006651 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006652 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6653 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006654
6655 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006656 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6657 ds_pool_ci.pNext = NULL;
6658 ds_pool_ci.maxSets = 1;
6659 ds_pool_ci.poolSizeCount = 1;
6660 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006661
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006662 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006663 err =
6664 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006665 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006666
Tony Barboureb254902015-07-15 12:50:33 -06006667 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006668 dsl_binding.binding = 0;
6669 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6670 dsl_binding.descriptorCount = 1;
6671 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6672 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006673
Tony Barboureb254902015-07-15 12:50:33 -06006674 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006675 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6676 ds_layout_ci.pNext = NULL;
6677 ds_layout_ci.bindingCount = 1;
6678 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006679 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006680 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6681 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006682 ASSERT_VK_SUCCESS(err);
6683
6684 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006685 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006686 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006687 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006688 alloc_info.descriptorPool = ds_pool;
6689 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006690 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6691 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006692 ASSERT_VK_SUCCESS(err);
6693
Tony Barboureb254902015-07-15 12:50:33 -06006694 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006695 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6696 pipeline_layout_ci.pNext = NULL;
6697 pipeline_layout_ci.setLayoutCount = 1;
6698 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006699
6700 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006701 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6702 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006703 ASSERT_VK_SUCCESS(err);
6704
Karl Schultz6addd812016-02-02 17:17:23 -07006705 VkShaderObj vs(m_device, bindStateVertShaderText,
6706 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006707 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006708 // on more devices
6709 VkShaderObj fs(m_device, bindStateFragShaderText,
6710 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006711
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006712 VkPipelineObj pipe(m_device);
6713 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006714 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006715 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006716 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006717
6718 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006719 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6720 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6721 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6722 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
6723 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006724
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006725 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006726
Chia-I Wuf7458c52015-10-26 21:10:41 +08006727 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6728 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6729 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006730}
6731
Karl Schultz6addd812016-02-02 17:17:23 -07006732TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006733 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006734 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006735
Karl Schultz6addd812016-02-02 17:17:23 -07006736 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006737 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
6738 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006739
6740 ASSERT_NO_FATAL_FAILURE(InitState());
6741 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006742 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6743 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006744
6745 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006746 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6747 ds_pool_ci.pNext = NULL;
6748 ds_pool_ci.maxSets = 1;
6749 ds_pool_ci.poolSizeCount = 1;
6750 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006751
6752 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006753 err =
6754 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006755 ASSERT_VK_SUCCESS(err);
6756
6757 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006758 dsl_binding.binding = 0;
6759 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6760 dsl_binding.descriptorCount = 1;
6761 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6762 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006763
6764 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006765 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6766 ds_layout_ci.pNext = NULL;
6767 ds_layout_ci.bindingCount = 1;
6768 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006769 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006770 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6771 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006772 ASSERT_VK_SUCCESS(err);
6773
6774 VkDescriptorSet descriptorSet;
6775 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006776 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006777 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006778 alloc_info.descriptorPool = ds_pool;
6779 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006780 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6781 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006782 ASSERT_VK_SUCCESS(err);
6783
Karl Schultz6addd812016-02-02 17:17:23 -07006784 VkBufferView view =
6785 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006786 VkWriteDescriptorSet descriptor_write;
6787 memset(&descriptor_write, 0, sizeof(descriptor_write));
6788 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6789 descriptor_write.dstSet = descriptorSet;
6790 descriptor_write.dstBinding = 0;
6791 descriptor_write.descriptorCount = 1;
6792 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6793 descriptor_write.pTexelBufferView = &view;
6794
6795 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6796
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006797 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006798
6799 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6800 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6801}
6802
Mark Youngd339ba32016-05-30 13:28:35 -06006803TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
6804 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has"
6805 " no memory bound to it.");
6806
6807 VkResult err;
6808 m_errorMonitor->SetDesiredFailureMsg(
6809 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6810 "vkCreateBufferView called with invalid memory ");
6811
6812 ASSERT_NO_FATAL_FAILURE(InitState());
6813
6814 // Create a buffer with no bound memory and then attempt to create
6815 // a buffer view.
6816 VkBufferCreateInfo buff_ci = {};
6817 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6818 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6819 buff_ci.size = 256;
6820 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6821 VkBuffer buffer;
6822 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6823 ASSERT_VK_SUCCESS(err);
6824
6825 VkBufferViewCreateInfo buff_view_ci = {};
6826 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6827 buff_view_ci.buffer = buffer;
6828 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6829 buff_view_ci.range = VK_WHOLE_SIZE;
6830 VkBufferView buff_view;
6831 err =
6832 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
6833
6834 m_errorMonitor->VerifyFound();
6835 vkDestroyBuffer(m_device->device(), buffer, NULL);
6836 // If last error is success, it still created the view, so delete it.
6837 if (err == VK_SUCCESS) {
6838 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6839 }
6840}
6841
Karl Schultz6addd812016-02-02 17:17:23 -07006842TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6843 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6844 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006845 // 1. No dynamicOffset supplied
6846 // 2. Too many dynamicOffsets supplied
6847 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006848 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006849 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006850 " requires 1 dynamicOffsets, but only "
6851 "0 dynamicOffsets are left in "
6852 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006853
6854 ASSERT_NO_FATAL_FAILURE(InitState());
6855 ASSERT_NO_FATAL_FAILURE(InitViewport());
6856 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6857
6858 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006859 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6860 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006861
6862 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006863 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6864 ds_pool_ci.pNext = NULL;
6865 ds_pool_ci.maxSets = 1;
6866 ds_pool_ci.poolSizeCount = 1;
6867 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006868
6869 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006870 err =
6871 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006872 ASSERT_VK_SUCCESS(err);
6873
6874 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006875 dsl_binding.binding = 0;
6876 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6877 dsl_binding.descriptorCount = 1;
6878 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6879 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006880
6881 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006882 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6883 ds_layout_ci.pNext = NULL;
6884 ds_layout_ci.bindingCount = 1;
6885 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006886 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006887 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6888 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006889 ASSERT_VK_SUCCESS(err);
6890
6891 VkDescriptorSet descriptorSet;
6892 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006893 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006894 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006895 alloc_info.descriptorPool = ds_pool;
6896 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006897 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6898 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006899 ASSERT_VK_SUCCESS(err);
6900
6901 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006902 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6903 pipeline_layout_ci.pNext = NULL;
6904 pipeline_layout_ci.setLayoutCount = 1;
6905 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006906
6907 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006908 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6909 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006910 ASSERT_VK_SUCCESS(err);
6911
6912 // Create a buffer to update the descriptor with
6913 uint32_t qfi = 0;
6914 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006915 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6916 buffCI.size = 1024;
6917 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6918 buffCI.queueFamilyIndexCount = 1;
6919 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006920
6921 VkBuffer dyub;
6922 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6923 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006924 // Allocate memory and bind to buffer so we can make it to the appropriate
6925 // error
6926 VkMemoryAllocateInfo mem_alloc = {};
6927 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6928 mem_alloc.pNext = NULL;
6929 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006930 mem_alloc.memoryTypeIndex = 0;
6931
6932 VkMemoryRequirements memReqs;
6933 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
6934 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
6935 0);
6936 if (!pass) {
6937 vkDestroyBuffer(m_device->device(), dyub, NULL);
6938 return;
6939 }
6940
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006941 VkDeviceMemory mem;
6942 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6943 ASSERT_VK_SUCCESS(err);
6944 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6945 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006946 // Correctly update descriptor to avoid "NOT_UPDATED" error
6947 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006948 buffInfo.buffer = dyub;
6949 buffInfo.offset = 0;
6950 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006951
6952 VkWriteDescriptorSet descriptor_write;
6953 memset(&descriptor_write, 0, sizeof(descriptor_write));
6954 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6955 descriptor_write.dstSet = descriptorSet;
6956 descriptor_write.dstBinding = 0;
6957 descriptor_write.descriptorCount = 1;
6958 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6959 descriptor_write.pBufferInfo = &buffInfo;
6960
6961 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6962
6963 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006964 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6965 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
6966 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006967 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006968 uint32_t pDynOff[2] = {512, 756};
6969 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07006970 m_errorMonitor->SetDesiredFailureMsg(
6971 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07006972 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07006973 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6974 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
6975 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006976 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006977 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6979 " dynamic offset 512 combined with "
6980 "offset 0 and range 1024 that "
6981 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006982 // Create PSO to be used for draw-time errors below
6983 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12006984 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07006985 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006986 "out gl_PerVertex { \n"
6987 " vec4 gl_Position;\n"
6988 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07006989 "void main(){\n"
6990 " gl_Position = vec4(1);\n"
6991 "}\n";
6992 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12006993 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07006994 "\n"
6995 "layout(location=0) out vec4 x;\n"
6996 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6997 "void main(){\n"
6998 " x = vec4(bar.y);\n"
6999 "}\n";
7000 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7001 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7002 VkPipelineObj pipe(m_device);
7003 pipe.AddShader(&vs);
7004 pipe.AddShader(&fs);
7005 pipe.AddColorAttachment();
7006 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7007
Karl Schultz6addd812016-02-02 17:17:23 -07007008 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7009 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7010 // This update should succeed, but offset size of 512 will overstep buffer
7011 // /w range 1024 & size 1024
7012 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7013 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7014 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07007015 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007016 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007017
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007018 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06007019 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007020
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007021 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007022 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007023 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7024}
7025
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007026TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007027 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007028 ASSERT_NO_FATAL_FAILURE(InitState());
7029 ASSERT_NO_FATAL_FAILURE(InitViewport());
7030 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7031
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007032 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007033 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007034 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7035 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7036 pipeline_layout_ci.pushConstantRangeCount = 1;
7037 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7038
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007039 //
7040 // Check for invalid push constant ranges in pipeline layouts.
7041 //
7042 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007043 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007044 char const *msg;
7045 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007046
Karl Schultzc81037d2016-05-12 08:11:23 -06007047 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7048 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7049 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7050 "vkCreatePipelineLayout() call has push constants index 0 with "
7051 "size 0."},
7052 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7053 "vkCreatePipelineLayout() call has push constants index 0 with "
7054 "size 1."},
7055 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7056 "vkCreatePipelineLayout() call has push constants index 0 with "
7057 "size 1."},
7058 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7059 "vkCreatePipelineLayout() call has push constants index 0 with "
7060 "size 0."},
7061 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7062 "vkCreatePipelineLayout() call has push constants index 0 with "
7063 "offset 1. Offset must"},
7064 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7065 "vkCreatePipelineLayout() call has push constants index 0 "
7066 "with offset "},
7067 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7068 "vkCreatePipelineLayout() call has push constants "
7069 "index 0 with offset "},
7070 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
7071 "vkCreatePipelineLayout() call has push constants index 0 "
7072 "with offset "},
7073 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7074 "vkCreatePipelineLayout() call has push "
7075 "constants index 0 with offset "},
7076 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7077 "vkCreatePipelineLayout() call has push "
7078 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007079 }};
7080
7081 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007082 for (const auto &iter : range_tests) {
7083 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007084 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7085 iter.msg);
7086 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7087 NULL, &pipeline_layout);
7088 m_errorMonitor->VerifyFound();
7089 if (VK_SUCCESS == err) {
7090 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7091 }
7092 }
7093
7094 // Check for invalid stage flag
7095 pc_range.offset = 0;
7096 pc_range.size = 16;
7097 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007098 m_errorMonitor->SetDesiredFailureMsg(
7099 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007100 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007101 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7102 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007103 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007104 if (VK_SUCCESS == err) {
7105 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7106 }
7107
7108 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06007109 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007110 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007111 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007112 char const *msg;
7113 };
7114
Karl Schultzc81037d2016-05-12 08:11:23 -06007115 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007116 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7117 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7118 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7119 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7120 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7121 "vkCreatePipelineLayout() call has push constants with overlapping "
7122 "ranges: 0:[0, 4), 1:[0, 4)"},
7123 {
7124 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7125 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7126 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7127 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7128 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7129 "vkCreatePipelineLayout() call has push constants with "
7130 "overlapping "
7131 "ranges: 3:[12, 20), 4:[16, 20)",
7132 },
7133 {
7134 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7135 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7136 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7137 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7138 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7139 "vkCreatePipelineLayout() call has push constants with "
7140 "overlapping "
7141 "ranges: 0:[16, 20), 1:[12, 20)",
7142 },
7143 {
7144 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7145 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7146 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7147 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7148 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7149 "vkCreatePipelineLayout() call has push constants with "
7150 "overlapping "
7151 "ranges: 0:[16, 20), 3:[12, 20)",
7152 },
7153 {
7154 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7155 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
7156 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
7157 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
7158 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
7159 "vkCreatePipelineLayout() call has push constants with "
7160 "overlapping "
7161 "ranges: 0:[16, 20), 2:[4, 100)",
7162 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007163
Karl Schultzc81037d2016-05-12 08:11:23 -06007164 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007165 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007166 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
7167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007168 iter.msg);
7169 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7170 NULL, &pipeline_layout);
7171 m_errorMonitor->VerifyFound();
7172 if (VK_SUCCESS == err) {
7173 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7174 }
7175 }
7176
7177 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06007178 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
7179 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7180 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7181 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7182 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
7183 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7184 ""},
7185 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
7186 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
7187 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
7188 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
7189 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7190 ""}}};
7191 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007192 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
7193 m_errorMonitor->ExpectSuccess();
7194 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7195 NULL, &pipeline_layout);
7196 m_errorMonitor->VerifyNotFound();
7197 if (VK_SUCCESS == err) {
7198 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7199 }
7200 }
7201
7202 //
7203 // CmdPushConstants tests
7204 //
Karl Schultzc81037d2016-05-12 08:11:23 -06007205 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007206
7207 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06007208 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
7209 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7210 "vkCmdPushConstants() call has push constants with size 0. Size "
7211 "must be greater than zero and a multiple of 4."},
7212 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7213 "vkCmdPushConstants() call has push constants with size 1. Size "
7214 "must be greater than zero and a multiple of 4."},
7215 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7216 "vkCmdPushConstants() call has push constants with size 1. Size "
7217 "must be greater than zero and a multiple of 4."},
7218 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7219 "vkCmdPushConstants() call has push constants with offset 1. "
7220 "Offset must be a multiple of 4."},
7221 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7222 "vkCmdPushConstants() call has push constants with offset 1. "
7223 "Offset must be a multiple of 4."},
7224 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
7225 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
7226 "0x1 not within flag-matching ranges in pipeline layout"},
7227 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
7228 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
7229 "0x1 not within flag-matching ranges in pipeline layout"},
7230 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
7231 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
7232 "0x1 not within flag-matching ranges in pipeline layout"},
7233 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
7234 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
7235 "0x1 not within flag-matching ranges in pipeline layout"},
7236 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7237 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
7238 "any of the ranges in pipeline layout"},
7239 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7240 0, 16},
7241 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
7242 "any of the ranges in pipeline layout"},
7243 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007244 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007245 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007246 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007247 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007248 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007249 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007250 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007251 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007252 "vkCmdPushConstants() call has push constants with offset "},
7253 }};
7254
7255 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06007256 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007257 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06007258 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007259 };
Karl Schultzc81037d2016-05-12 08:11:23 -06007260 pipeline_layout_ci.pushConstantRangeCount =
7261 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007262 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007263 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7264 &pipeline_layout);
7265 ASSERT_VK_SUCCESS(err);
7266 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06007267 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7269 iter.msg);
7270 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06007271 iter.range.stageFlags, iter.range.offset,
7272 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007273 m_errorMonitor->VerifyFound();
7274 }
7275
7276 // Check for invalid stage flag
7277 m_errorMonitor->SetDesiredFailureMsg(
7278 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7279 "vkCmdPushConstants() call has no stageFlags set.");
7280 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06007281 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007282 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06007283 EndCommandBuffer();
7284 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
7285 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007286
Karl Schultzc81037d2016-05-12 08:11:23 -06007287 // overlapping range tests with cmd
7288 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
7289 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
7290 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
7291 "0x1 not within flag-matching ranges in pipeline layout"},
7292 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7293 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
7294 "0x1 not within flag-matching ranges in pipeline layout"},
7295 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
7296 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
7297 "0x1 not within flag-matching ranges in pipeline layout"},
7298 }};
7299 const VkPushConstantRange pc_range3[] = {
7300 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
7301 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7302 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7303 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
7304 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
7305 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
7306 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
7307 };
7308 pipeline_layout_ci.pushConstantRangeCount =
7309 sizeof(pc_range3) / sizeof(VkPushConstantRange);
7310 pipeline_layout_ci.pPushConstantRanges = pc_range3;
7311 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7312 &pipeline_layout);
7313 ASSERT_VK_SUCCESS(err);
7314 BeginCommandBuffer();
7315 for (const auto &iter : cmd_overlap_tests) {
7316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7317 iter.msg);
7318 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
7319 iter.range.stageFlags, iter.range.offset,
7320 iter.range.size, dummy_values);
7321 m_errorMonitor->VerifyFound();
7322 }
7323 EndCommandBuffer();
7324 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
7325 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7326
7327 // positive overlapping range tests with cmd
7328 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
7329 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
7330 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
7331 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
7332 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
7333 }};
7334 const VkPushConstantRange pc_range4[] = {
7335 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
7336 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
7337 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7338 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7339 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
7340 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
7341 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
7342 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
7343 };
7344 pipeline_layout_ci.pushConstantRangeCount =
7345 sizeof(pc_range4) / sizeof(VkPushConstantRange);
7346 pipeline_layout_ci.pPushConstantRanges = pc_range4;
7347 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7348 &pipeline_layout);
7349 ASSERT_VK_SUCCESS(err);
7350 BeginCommandBuffer();
7351 for (const auto &iter : cmd_overlap_tests_pos) {
7352 m_errorMonitor->ExpectSuccess();
7353 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
7354 iter.range.stageFlags, iter.range.offset,
7355 iter.range.size, dummy_values);
7356 m_errorMonitor->VerifyNotFound();
7357 }
7358 EndCommandBuffer();
7359 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007360 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7361}
7362
Karl Schultz6addd812016-02-02 17:17:23 -07007363TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007364 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007365 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007366
7367 ASSERT_NO_FATAL_FAILURE(InitState());
7368 ASSERT_NO_FATAL_FAILURE(InitViewport());
7369 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7370
Mike Stroyanb8a61002016-06-20 16:00:28 -06007371 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
7372 VkImageTiling tiling;
7373 VkFormatProperties format_properties;
7374 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
7375 if (format_properties.linearTilingFeatures &
7376 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
7377 tiling = VK_IMAGE_TILING_LINEAR;
7378 } else if (format_properties.optimalTilingFeatures &
7379 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
7380 tiling = VK_IMAGE_TILING_OPTIMAL;
7381 } else {
7382 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
7383 "skipped.\n");
7384 return;
7385 }
7386
Tobin Ehlis559c6382015-11-05 09:52:49 -07007387 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7388 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007389 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7390 ds_type_count[0].descriptorCount = 10;
7391 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7392 ds_type_count[1].descriptorCount = 2;
7393 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7394 ds_type_count[2].descriptorCount = 2;
7395 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7396 ds_type_count[3].descriptorCount = 5;
7397 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7398 // type
7399 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7400 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7401 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007402
7403 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007404 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7405 ds_pool_ci.pNext = NULL;
7406 ds_pool_ci.maxSets = 5;
7407 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7408 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007409
7410 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007411 err =
7412 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007413 ASSERT_VK_SUCCESS(err);
7414
7415 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7416 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007417 dsl_binding[0].binding = 0;
7418 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7419 dsl_binding[0].descriptorCount = 5;
7420 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7421 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007422
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007423 // Create layout identical to set0 layout but w/ different stageFlags
7424 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007425 dsl_fs_stage_only.binding = 0;
7426 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7427 dsl_fs_stage_only.descriptorCount = 5;
7428 dsl_fs_stage_only.stageFlags =
7429 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7430 // bind time
7431 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007432 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007433 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7434 ds_layout_ci.pNext = NULL;
7435 ds_layout_ci.bindingCount = 1;
7436 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007437 static const uint32_t NUM_LAYOUTS = 4;
7438 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007439 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007440 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7441 // layout for error case
7442 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7443 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007444 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007445 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007446 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7447 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007448 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007449 dsl_binding[0].binding = 0;
7450 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007451 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007452 dsl_binding[1].binding = 1;
7453 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7454 dsl_binding[1].descriptorCount = 2;
7455 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7456 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007457 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007458 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07007459 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7460 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007461 ASSERT_VK_SUCCESS(err);
7462 dsl_binding[0].binding = 0;
7463 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007464 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007465 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007466 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7467 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007468 ASSERT_VK_SUCCESS(err);
7469 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007470 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07007471 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7472 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007473 ASSERT_VK_SUCCESS(err);
7474
7475 static const uint32_t NUM_SETS = 4;
7476 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7477 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007478 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007479 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007480 alloc_info.descriptorPool = ds_pool;
7481 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007482 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7483 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007484 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007485 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007486 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007487 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007488 err =
7489 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007490 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007491
7492 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007493 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7494 pipeline_layout_ci.pNext = NULL;
7495 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7496 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007497
7498 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007499 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7500 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007501 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007502 // Create pipelineLayout with only one setLayout
7503 pipeline_layout_ci.setLayoutCount = 1;
7504 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007505 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7506 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007507 ASSERT_VK_SUCCESS(err);
7508 // Create pipelineLayout with 2 descriptor setLayout at index 0
7509 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7510 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07007511 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7512 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007513 ASSERT_VK_SUCCESS(err);
7514 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7515 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7516 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07007517 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7518 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007519 ASSERT_VK_SUCCESS(err);
7520 // Create pipelineLayout with UB type, but stageFlags for FS only
7521 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7522 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007523 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7524 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007525 ASSERT_VK_SUCCESS(err);
7526 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7527 VkDescriptorSetLayout pl_bad_s0[2] = {};
7528 pl_bad_s0[0] = ds_layout_fs_only;
7529 pl_bad_s0[1] = ds_layout[1];
7530 pipeline_layout_ci.setLayoutCount = 2;
7531 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7532 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07007533 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7534 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007535 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007536
7537 // Create a buffer to update the descriptor with
7538 uint32_t qfi = 0;
7539 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007540 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7541 buffCI.size = 1024;
7542 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7543 buffCI.queueFamilyIndexCount = 1;
7544 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007545
7546 VkBuffer dyub;
7547 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7548 ASSERT_VK_SUCCESS(err);
7549 // Correctly update descriptor to avoid "NOT_UPDATED" error
7550 static const uint32_t NUM_BUFFS = 5;
7551 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007552 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007553 buffInfo[i].buffer = dyub;
7554 buffInfo[i].offset = 0;
7555 buffInfo[i].range = 1024;
7556 }
Karl Schultz6addd812016-02-02 17:17:23 -07007557 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07007558 const int32_t tex_width = 32;
7559 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007560 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007561 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7562 image_create_info.pNext = NULL;
7563 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7564 image_create_info.format = tex_format;
7565 image_create_info.extent.width = tex_width;
7566 image_create_info.extent.height = tex_height;
7567 image_create_info.extent.depth = 1;
7568 image_create_info.mipLevels = 1;
7569 image_create_info.arrayLayers = 1;
7570 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06007571 image_create_info.tiling = tiling;
7572 image_create_info.usage =
7573 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07007574 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007575 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7576 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007577
Karl Schultz6addd812016-02-02 17:17:23 -07007578 VkMemoryRequirements memReqs;
7579 VkDeviceMemory imageMem;
7580 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007581 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007582 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7583 memAlloc.pNext = NULL;
7584 memAlloc.allocationSize = 0;
7585 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007586 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
7587 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007588 pass =
7589 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007590 ASSERT_TRUE(pass);
7591 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
7592 ASSERT_VK_SUCCESS(err);
7593 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
7594 ASSERT_VK_SUCCESS(err);
7595
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007596 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007597 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
7598 image_view_create_info.image = image;
7599 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7600 image_view_create_info.format = tex_format;
7601 image_view_create_info.subresourceRange.layerCount = 1;
7602 image_view_create_info.subresourceRange.baseMipLevel = 0;
7603 image_view_create_info.subresourceRange.levelCount = 1;
7604 image_view_create_info.subresourceRange.aspectMask =
7605 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007606
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007607 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007608 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7609 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007610 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007611 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007612 imageInfo[0].imageView = view;
7613 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
7614 imageInfo[1].imageView = view;
7615 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007616 imageInfo[2].imageView = view;
7617 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
7618 imageInfo[3].imageView = view;
7619 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007620
7621 static const uint32_t NUM_SET_UPDATES = 3;
7622 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
7623 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7624 descriptor_write[0].dstSet = descriptorSet[0];
7625 descriptor_write[0].dstBinding = 0;
7626 descriptor_write[0].descriptorCount = 5;
7627 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7628 descriptor_write[0].pBufferInfo = buffInfo;
7629 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7630 descriptor_write[1].dstSet = descriptorSet[1];
7631 descriptor_write[1].dstBinding = 0;
7632 descriptor_write[1].descriptorCount = 2;
7633 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7634 descriptor_write[1].pImageInfo = imageInfo;
7635 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7636 descriptor_write[2].dstSet = descriptorSet[1];
7637 descriptor_write[2].dstBinding = 1;
7638 descriptor_write[2].descriptorCount = 2;
7639 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007640 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007641
7642 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007643
Tobin Ehlis88452832015-12-03 09:40:56 -07007644 // Create PSO to be used for draw-time errors below
7645 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007646 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007647 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007648 "out gl_PerVertex {\n"
7649 " vec4 gl_Position;\n"
7650 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007651 "void main(){\n"
7652 " gl_Position = vec4(1);\n"
7653 "}\n";
7654 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007655 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007656 "\n"
7657 "layout(location=0) out vec4 x;\n"
7658 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7659 "void main(){\n"
7660 " x = vec4(bar.y);\n"
7661 "}\n";
7662 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7663 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007664 VkPipelineObj pipe(m_device);
7665 pipe.AddShader(&vs);
7666 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007667 pipe.AddColorAttachment();
7668 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007669
7670 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07007671
Karl Schultz6addd812016-02-02 17:17:23 -07007672 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7673 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7674 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7675 // of PSO
7676 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7677 // cmd_pipeline.c
7678 // due to the fact that cmd_alloc_dset_data() has not been called in
7679 // cmd_bind_graphics_pipeline()
7680 // TODO : Want to cause various binding incompatibility issues here to test
7681 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007682 // First cause various verify_layout_compatibility() fails
7683 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007684 // verify_set_layout_compatibility fail cases:
7685 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07007686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis10fad692016-07-07 12:00:36 -06007687 "Invalid VkPipelineLayout Object ");
Karl Schultz6addd812016-02-02 17:17:23 -07007688 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7689 VK_PIPELINE_BIND_POINT_GRAPHICS,
7690 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
7691 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007692 m_errorMonitor->VerifyFound();
7693
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007694 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07007695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7696 " attempting to bind set to index 1");
7697 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7698 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
7699 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007700 m_errorMonitor->VerifyFound();
7701
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007702 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007703 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7704 // descriptors
7705 m_errorMonitor->SetDesiredFailureMsg(
7706 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06007707 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07007708 vkCmdBindDescriptorSets(
7709 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7710 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007711 m_errorMonitor->VerifyFound();
7712
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007713 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7714 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07007715 m_errorMonitor->SetDesiredFailureMsg(
7716 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06007717 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07007718 vkCmdBindDescriptorSets(
7719 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7720 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007721 m_errorMonitor->VerifyFound();
7722
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007723 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7724 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07007725 m_errorMonitor->SetDesiredFailureMsg(
7726 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06007727 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07007728 vkCmdBindDescriptorSets(
7729 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7730 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007731 m_errorMonitor->VerifyFound();
7732
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007733 // Cause INFO messages due to disturbing previously bound Sets
7734 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07007735 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7736 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7737 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007738 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07007739 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007740 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007741 " previously bound as set #0 was disturbed ");
7742 vkCmdBindDescriptorSets(
7743 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7744 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007745 m_errorMonitor->VerifyFound();
7746
Karl Schultz6addd812016-02-02 17:17:23 -07007747 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7748 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7749 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007750 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007751 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007752 " newly bound as set #0 so set #1 and "
7753 "any subsequent sets were disturbed ");
7754 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7755 VK_PIPELINE_BIND_POINT_GRAPHICS,
7756 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007757 m_errorMonitor->VerifyFound();
7758
Tobin Ehlis10fad692016-07-07 12:00:36 -06007759 // Now that we're done actively using the pipelineLayout that gfx pipeline
7760 // was created with, we should be able to delete it. Do that now to verify
7761 // that validation obeys pipelineLayout lifetime
7762 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7763
Tobin Ehlis88452832015-12-03 09:40:56 -07007764 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007765 // 1. Error due to not binding required set (we actually use same code as
7766 // above to disturb set0)
7767 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7768 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7769 2, &descriptorSet[0], 0, NULL);
7770 vkCmdBindDescriptorSets(
7771 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7772 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
7773 m_errorMonitor->SetDesiredFailureMsg(
7774 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7775 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07007776 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007777 m_errorMonitor->VerifyFound();
7778
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007779 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007780 // 2. Error due to bound set not being compatible with PSO's
7781 // VkPipelineLayout (diff stageFlags in this case)
7782 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7783 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7784 2, &descriptorSet[0], 0, NULL);
7785 m_errorMonitor->SetDesiredFailureMsg(
7786 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7787 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007788 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007789 m_errorMonitor->VerifyFound();
7790
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007791 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007792 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007793 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7794 }
7795 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06007796 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
7797 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007798 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007799 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7800 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007801 vkFreeMemory(m_device->device(), imageMem, NULL);
7802 vkDestroyImage(m_device->device(), image, NULL);
7803 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007804}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007805
Karl Schultz6addd812016-02-02 17:17:23 -07007806TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007807
Karl Schultz6addd812016-02-02 17:17:23 -07007808 m_errorMonitor->SetDesiredFailureMsg(
7809 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007810 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007811
7812 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007813 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007814 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007815 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007816
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007817 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007818}
7819
Karl Schultz6addd812016-02-02 17:17:23 -07007820TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7821 VkResult err;
7822 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007823
Karl Schultz6addd812016-02-02 17:17:23 -07007824 m_errorMonitor->SetDesiredFailureMsg(
7825 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07007826 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007827
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007828 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007829
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007830 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007831 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007832 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007833 cmd.commandPool = m_commandPool;
7834 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007835 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007836
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007837 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007838 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007839
7840 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007841 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007842 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007843 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007844 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007845 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
7846 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007847 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007848
7849 // The error should be caught by validation of the BeginCommandBuffer call
7850 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7851
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007852 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007853 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007854}
7855
Karl Schultz6addd812016-02-02 17:17:23 -07007856TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007857 // Cause error due to Begin while recording CB
7858 // Then cause 2 errors for attempting to reset CB w/o having
7859 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7860 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007862 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007863
7864 ASSERT_NO_FATAL_FAILURE(InitState());
7865
7866 // Calls AllocateCommandBuffers
7867 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7868
Karl Schultz6addd812016-02-02 17:17:23 -07007869 // Force the failure by setting the Renderpass and Framebuffer fields with
7870 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007871 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007872 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007873 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7874 cmd_buf_info.pNext = NULL;
7875 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007876 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007877
7878 // Begin CB to transition to recording state
7879 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7880 // Can't re-begin. This should trigger error
7881 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007882 m_errorMonitor->VerifyFound();
7883
Karl Schultz6addd812016-02-02 17:17:23 -07007884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7885 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007886 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
7887 // Reset attempt will trigger error due to incorrect CommandPool state
7888 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007889 m_errorMonitor->VerifyFound();
7890
Karl Schultz6addd812016-02-02 17:17:23 -07007891 m_errorMonitor->SetDesiredFailureMsg(
7892 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7893 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007894 // Transition CB to RECORDED state
7895 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7896 // Now attempting to Begin will implicitly reset, which triggers error
7897 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007898 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007899}
7900
Karl Schultz6addd812016-02-02 17:17:23 -07007901TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007902 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007903 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007904
Karl Schultz6addd812016-02-02 17:17:23 -07007905 m_errorMonitor->SetDesiredFailureMsg(
7906 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007907 "Invalid Pipeline CreateInfo State: Vtx Shader required");
7908
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007909 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007910 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007911
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007912 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007913 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7914 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007915
7916 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007917 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7918 ds_pool_ci.pNext = NULL;
7919 ds_pool_ci.maxSets = 1;
7920 ds_pool_ci.poolSizeCount = 1;
7921 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007922
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007923 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007924 err =
7925 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007926 ASSERT_VK_SUCCESS(err);
7927
Tony Barboureb254902015-07-15 12:50:33 -06007928 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007929 dsl_binding.binding = 0;
7930 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7931 dsl_binding.descriptorCount = 1;
7932 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7933 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007934
Tony Barboureb254902015-07-15 12:50:33 -06007935 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007936 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7937 ds_layout_ci.pNext = NULL;
7938 ds_layout_ci.bindingCount = 1;
7939 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007940
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007941 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007942 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7943 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007944 ASSERT_VK_SUCCESS(err);
7945
7946 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007947 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007948 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007949 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007950 alloc_info.descriptorPool = ds_pool;
7951 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007952 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7953 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007954 ASSERT_VK_SUCCESS(err);
7955
Tony Barboureb254902015-07-15 12:50:33 -06007956 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007957 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7958 pipeline_layout_ci.setLayoutCount = 1;
7959 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007960
7961 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007962 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7963 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007964 ASSERT_VK_SUCCESS(err);
7965
Tobin Ehlise68360f2015-10-01 11:15:13 -06007966 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07007967 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007968
7969 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007970 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7971 vp_state_ci.scissorCount = 1;
7972 vp_state_ci.pScissors = &sc;
7973 vp_state_ci.viewportCount = 1;
7974 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007975
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007976 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7977 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7978 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7979 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7980 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7981 rs_state_ci.depthClampEnable = VK_FALSE;
7982 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7983 rs_state_ci.depthBiasEnable = VK_FALSE;
7984
Tony Barboureb254902015-07-15 12:50:33 -06007985 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007986 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7987 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007988 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007989 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7990 gp_ci.layout = pipeline_layout;
7991 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06007992
7993 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007994 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7995 pc_ci.initialDataSize = 0;
7996 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007997
7998 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007999 VkPipelineCache pipelineCache;
8000
Karl Schultz6addd812016-02-02 17:17:23 -07008001 err =
8002 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06008003 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008004 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8005 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008006
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008007 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008008
Chia-I Wuf7458c52015-10-26 21:10:41 +08008009 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8010 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8011 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8012 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008013}
Tobin Ehlis912df022015-09-17 08:46:18 -06008014/*// TODO : This test should be good, but needs Tess support in compiler to run
8015TEST_F(VkLayerTest, InvalidPatchControlPoints)
8016{
8017 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06008018 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008019
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008020 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008021 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
8022primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008023
Tobin Ehlis912df022015-09-17 08:46:18 -06008024 ASSERT_NO_FATAL_FAILURE(InitState());
8025 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06008026
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008027 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06008028 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008029 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008030
8031 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8032 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8033 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008034 ds_pool_ci.poolSizeCount = 1;
8035 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06008036
8037 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008038 err = vkCreateDescriptorPool(m_device->device(),
8039VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06008040 ASSERT_VK_SUCCESS(err);
8041
8042 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08008043 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06008044 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08008045 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008046 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8047 dsl_binding.pImmutableSamplers = NULL;
8048
8049 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008050 ds_layout_ci.sType =
8051VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008052 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008053 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008054 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06008055
8056 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008057 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8058&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008059 ASSERT_VK_SUCCESS(err);
8060
8061 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07008062 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
8063VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06008064 ASSERT_VK_SUCCESS(err);
8065
8066 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008067 pipeline_layout_ci.sType =
8068VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008069 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008070 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008071 pipeline_layout_ci.pSetLayouts = &ds_layout;
8072
8073 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008074 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8075&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008076 ASSERT_VK_SUCCESS(err);
8077
8078 VkPipelineShaderStageCreateInfo shaderStages[3];
8079 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
8080
Karl Schultz6addd812016-02-02 17:17:23 -07008081 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
8082this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008083 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07008084 VkShaderObj
8085tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
8086this);
8087 VkShaderObj
8088te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
8089this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008090
Karl Schultz6addd812016-02-02 17:17:23 -07008091 shaderStages[0].sType =
8092VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008093 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008094 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008095 shaderStages[1].sType =
8096VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008097 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008098 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008099 shaderStages[2].sType =
8100VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008101 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008102 shaderStages[2].shader = te.handle();
8103
8104 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008105 iaCI.sType =
8106VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08008107 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06008108
8109 VkPipelineTessellationStateCreateInfo tsCI = {};
8110 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
8111 tsCI.patchControlPoints = 0; // This will cause an error
8112
8113 VkGraphicsPipelineCreateInfo gp_ci = {};
8114 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8115 gp_ci.pNext = NULL;
8116 gp_ci.stageCount = 3;
8117 gp_ci.pStages = shaderStages;
8118 gp_ci.pVertexInputState = NULL;
8119 gp_ci.pInputAssemblyState = &iaCI;
8120 gp_ci.pTessellationState = &tsCI;
8121 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008122 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06008123 gp_ci.pMultisampleState = NULL;
8124 gp_ci.pDepthStencilState = NULL;
8125 gp_ci.pColorBlendState = NULL;
8126 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8127 gp_ci.layout = pipeline_layout;
8128 gp_ci.renderPass = renderPass();
8129
8130 VkPipelineCacheCreateInfo pc_ci = {};
8131 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8132 pc_ci.pNext = NULL;
8133 pc_ci.initialSize = 0;
8134 pc_ci.initialData = 0;
8135 pc_ci.maxSize = 0;
8136
8137 VkPipeline pipeline;
8138 VkPipelineCache pipelineCache;
8139
Karl Schultz6addd812016-02-02 17:17:23 -07008140 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
8141&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06008142 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008143 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8144&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06008145
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008146 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008147
Chia-I Wuf7458c52015-10-26 21:10:41 +08008148 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8149 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8150 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8151 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06008152}
8153*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06008154// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07008155TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008156 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008157
Karl Schultz6addd812016-02-02 17:17:23 -07008158 m_errorMonitor->SetDesiredFailureMsg(
8159 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008160 "Gfx Pipeline viewport count (1) must match scissor count (0).");
8161
Tobin Ehlise68360f2015-10-01 11:15:13 -06008162 ASSERT_NO_FATAL_FAILURE(InitState());
8163 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008164
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008165 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008166 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8167 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008168
8169 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008170 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8171 ds_pool_ci.maxSets = 1;
8172 ds_pool_ci.poolSizeCount = 1;
8173 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008174
8175 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008176 err =
8177 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008178 ASSERT_VK_SUCCESS(err);
8179
8180 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008181 dsl_binding.binding = 0;
8182 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8183 dsl_binding.descriptorCount = 1;
8184 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008185
8186 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008187 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8188 ds_layout_ci.bindingCount = 1;
8189 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008190
8191 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008192 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8193 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008194 ASSERT_VK_SUCCESS(err);
8195
8196 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008197 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008198 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008199 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008200 alloc_info.descriptorPool = ds_pool;
8201 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008202 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8203 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008204 ASSERT_VK_SUCCESS(err);
8205
8206 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008207 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8208 pipeline_layout_ci.setLayoutCount = 1;
8209 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008210
8211 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008212 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8213 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008214 ASSERT_VK_SUCCESS(err);
8215
8216 VkViewport vp = {}; // Just need dummy vp to point to
8217
8218 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008219 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8220 vp_state_ci.scissorCount = 0;
8221 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
8222 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008223
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008224 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8225 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8226 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8227 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8228 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8229 rs_state_ci.depthClampEnable = VK_FALSE;
8230 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8231 rs_state_ci.depthBiasEnable = VK_FALSE;
8232
Cody Northropeb3a6c12015-10-05 14:44:45 -06008233 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008234 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008235
Karl Schultz6addd812016-02-02 17:17:23 -07008236 VkShaderObj vs(m_device, bindStateVertShaderText,
8237 VK_SHADER_STAGE_VERTEX_BIT, this);
8238 VkShaderObj fs(m_device, bindStateFragShaderText,
8239 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008240 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008241 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008242 shaderStages[0] = vs.GetStageCreateInfo();
8243 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008244
8245 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008246 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8247 gp_ci.stageCount = 2;
8248 gp_ci.pStages = shaderStages;
8249 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008250 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008251 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8252 gp_ci.layout = pipeline_layout;
8253 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008254
8255 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008256 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008257
8258 VkPipeline pipeline;
8259 VkPipelineCache pipelineCache;
8260
Karl Schultz6addd812016-02-02 17:17:23 -07008261 err =
8262 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008263 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008264 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8265 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008266
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008267 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008268
Chia-I Wuf7458c52015-10-26 21:10:41 +08008269 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8270 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8271 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8272 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008273}
Karl Schultz6addd812016-02-02 17:17:23 -07008274// Don't set viewport state in PSO. This is an error b/c we always need this
8275// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06008276// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008277TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06008278 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008279 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008280
Karl Schultz6addd812016-02-02 17:17:23 -07008281 m_errorMonitor->SetDesiredFailureMsg(
8282 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008283 "Gfx Pipeline pViewportState is null. Even if ");
8284
Tobin Ehlise68360f2015-10-01 11:15:13 -06008285 ASSERT_NO_FATAL_FAILURE(InitState());
8286 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008287
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008288 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008289 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8290 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008291
8292 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008293 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8294 ds_pool_ci.maxSets = 1;
8295 ds_pool_ci.poolSizeCount = 1;
8296 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008297
8298 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008299 err =
8300 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008301 ASSERT_VK_SUCCESS(err);
8302
8303 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008304 dsl_binding.binding = 0;
8305 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8306 dsl_binding.descriptorCount = 1;
8307 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008308
8309 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008310 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8311 ds_layout_ci.bindingCount = 1;
8312 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008313
8314 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008315 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8316 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008317 ASSERT_VK_SUCCESS(err);
8318
8319 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008320 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008321 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008322 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008323 alloc_info.descriptorPool = ds_pool;
8324 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008325 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8326 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008327 ASSERT_VK_SUCCESS(err);
8328
8329 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008330 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8331 pipeline_layout_ci.setLayoutCount = 1;
8332 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008333
8334 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008335 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8336 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008337 ASSERT_VK_SUCCESS(err);
8338
8339 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8340 // Set scissor as dynamic to avoid second error
8341 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008342 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8343 dyn_state_ci.dynamicStateCount = 1;
8344 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008345
Cody Northropeb3a6c12015-10-05 14:44:45 -06008346 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008347 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008348
Karl Schultz6addd812016-02-02 17:17:23 -07008349 VkShaderObj vs(m_device, bindStateVertShaderText,
8350 VK_SHADER_STAGE_VERTEX_BIT, this);
8351 VkShaderObj fs(m_device, bindStateFragShaderText,
8352 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008353 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008354 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008355 shaderStages[0] = vs.GetStageCreateInfo();
8356 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008357
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008358
8359 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8360 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8361 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8362 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8363 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8364 rs_state_ci.depthClampEnable = VK_FALSE;
8365 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8366 rs_state_ci.depthBiasEnable = VK_FALSE;
8367
Tobin Ehlise68360f2015-10-01 11:15:13 -06008368 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008369 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8370 gp_ci.stageCount = 2;
8371 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008372 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008373 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
8374 // should cause validation error
8375 gp_ci.pDynamicState = &dyn_state_ci;
8376 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8377 gp_ci.layout = pipeline_layout;
8378 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008379
8380 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008381 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008382
8383 VkPipeline pipeline;
8384 VkPipelineCache pipelineCache;
8385
Karl Schultz6addd812016-02-02 17:17:23 -07008386 err =
8387 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008388 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008389 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8390 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008391
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008392 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008393
Chia-I Wuf7458c52015-10-26 21:10:41 +08008394 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8395 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8396 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8397 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008398}
8399// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07008400// Then run second test where dynamic scissor count doesn't match PSO scissor
8401// count
8402TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8403 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008404
Karl Schultz6addd812016-02-02 17:17:23 -07008405 m_errorMonitor->SetDesiredFailureMsg(
8406 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008407 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
8408
Tobin Ehlise68360f2015-10-01 11:15:13 -06008409 ASSERT_NO_FATAL_FAILURE(InitState());
8410 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008411
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008412 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008413 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8414 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008415
8416 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008417 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8418 ds_pool_ci.maxSets = 1;
8419 ds_pool_ci.poolSizeCount = 1;
8420 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008421
8422 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008423 err =
8424 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008425 ASSERT_VK_SUCCESS(err);
8426
8427 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008428 dsl_binding.binding = 0;
8429 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8430 dsl_binding.descriptorCount = 1;
8431 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008432
8433 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008434 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8435 ds_layout_ci.bindingCount = 1;
8436 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008437
8438 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008439 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8440 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008441 ASSERT_VK_SUCCESS(err);
8442
8443 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008444 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008445 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008446 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008447 alloc_info.descriptorPool = ds_pool;
8448 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008449 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8450 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008451 ASSERT_VK_SUCCESS(err);
8452
8453 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008454 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8455 pipeline_layout_ci.setLayoutCount = 1;
8456 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008457
8458 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008459 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8460 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008461 ASSERT_VK_SUCCESS(err);
8462
8463 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008464 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8465 vp_state_ci.viewportCount = 1;
8466 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
8467 vp_state_ci.scissorCount = 1;
8468 vp_state_ci.pScissors =
8469 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008470
8471 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8472 // Set scissor as dynamic to avoid that error
8473 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008474 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8475 dyn_state_ci.dynamicStateCount = 1;
8476 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008477
Cody Northropeb3a6c12015-10-05 14:44:45 -06008478 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008479 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008480
Karl Schultz6addd812016-02-02 17:17:23 -07008481 VkShaderObj vs(m_device, bindStateVertShaderText,
8482 VK_SHADER_STAGE_VERTEX_BIT, this);
8483 VkShaderObj fs(m_device, bindStateFragShaderText,
8484 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008485 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008486 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008487 shaderStages[0] = vs.GetStageCreateInfo();
8488 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008489
Cody Northropf6622dc2015-10-06 10:33:21 -06008490 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8491 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8492 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008493 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008494 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008495 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008496 vi_ci.pVertexAttributeDescriptions = nullptr;
8497
8498 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8499 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8500 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8501
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008502 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008503 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06008504 rs_ci.pNext = nullptr;
8505
Mark Youngc89c6312016-03-31 16:03:20 -06008506 VkPipelineColorBlendAttachmentState att = {};
8507 att.blendEnable = VK_FALSE;
8508 att.colorWriteMask = 0xf;
8509
Cody Northropf6622dc2015-10-06 10:33:21 -06008510 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8511 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8512 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008513 cb_ci.attachmentCount = 1;
8514 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008515
Tobin Ehlise68360f2015-10-01 11:15:13 -06008516 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008517 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8518 gp_ci.stageCount = 2;
8519 gp_ci.pStages = shaderStages;
8520 gp_ci.pVertexInputState = &vi_ci;
8521 gp_ci.pInputAssemblyState = &ia_ci;
8522 gp_ci.pViewportState = &vp_state_ci;
8523 gp_ci.pRasterizationState = &rs_ci;
8524 gp_ci.pColorBlendState = &cb_ci;
8525 gp_ci.pDynamicState = &dyn_state_ci;
8526 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8527 gp_ci.layout = pipeline_layout;
8528 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008529
8530 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008531 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008532
8533 VkPipeline pipeline;
8534 VkPipelineCache pipelineCache;
8535
Karl Schultz6addd812016-02-02 17:17:23 -07008536 err =
8537 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008538 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008539 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8540 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008541
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008542 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008543
Tobin Ehlisd332f282015-10-02 11:00:56 -06008544 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008545 // First need to successfully create the PSO from above by setting
8546 // pViewports
8547 m_errorMonitor->SetDesiredFailureMsg(
8548 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8549 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
8550 "scissorCount is 1. These counts must match.");
8551
8552 VkViewport vp = {}; // Just need dummy vp to point to
8553 vp_state_ci.pViewports = &vp;
8554 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8555 &gp_ci, NULL, &pipeline);
8556 ASSERT_VK_SUCCESS(err);
8557 BeginCommandBuffer();
8558 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8559 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
8560 VkRect2D scissors[2] = {}; // don't care about data
8561 // Count of 2 doesn't match PSO count of 1
8562 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
8563 Draw(1, 0, 0, 0);
8564
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008565 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008566
8567 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8568 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8569 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8570 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008571 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008572}
8573// Create PSO w/o non-zero scissorCount but no scissor data
8574// Then run second test where dynamic viewportCount doesn't match PSO
8575// viewportCount
8576TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8577 VkResult err;
8578
8579 m_errorMonitor->SetDesiredFailureMsg(
8580 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8581 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
8582
8583 ASSERT_NO_FATAL_FAILURE(InitState());
8584 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8585
8586 VkDescriptorPoolSize ds_type_count = {};
8587 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8588 ds_type_count.descriptorCount = 1;
8589
8590 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8591 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8592 ds_pool_ci.maxSets = 1;
8593 ds_pool_ci.poolSizeCount = 1;
8594 ds_pool_ci.pPoolSizes = &ds_type_count;
8595
8596 VkDescriptorPool ds_pool;
8597 err =
8598 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
8599 ASSERT_VK_SUCCESS(err);
8600
8601 VkDescriptorSetLayoutBinding dsl_binding = {};
8602 dsl_binding.binding = 0;
8603 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8604 dsl_binding.descriptorCount = 1;
8605 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8606
8607 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8608 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8609 ds_layout_ci.bindingCount = 1;
8610 ds_layout_ci.pBindings = &dsl_binding;
8611
8612 VkDescriptorSetLayout ds_layout;
8613 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8614 &ds_layout);
8615 ASSERT_VK_SUCCESS(err);
8616
8617 VkDescriptorSet descriptorSet;
8618 VkDescriptorSetAllocateInfo alloc_info = {};
8619 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8620 alloc_info.descriptorSetCount = 1;
8621 alloc_info.descriptorPool = ds_pool;
8622 alloc_info.pSetLayouts = &ds_layout;
8623 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8624 &descriptorSet);
8625 ASSERT_VK_SUCCESS(err);
8626
8627 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8628 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8629 pipeline_layout_ci.setLayoutCount = 1;
8630 pipeline_layout_ci.pSetLayouts = &ds_layout;
8631
8632 VkPipelineLayout pipeline_layout;
8633 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8634 &pipeline_layout);
8635 ASSERT_VK_SUCCESS(err);
8636
8637 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8638 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8639 vp_state_ci.scissorCount = 1;
8640 vp_state_ci.pScissors =
8641 NULL; // Null scissor w/ count of 1 should cause error
8642 vp_state_ci.viewportCount = 1;
8643 vp_state_ci.pViewports =
8644 NULL; // vp is dynamic (below) so this won't cause error
8645
8646 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8647 // Set scissor as dynamic to avoid that error
8648 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8649 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8650 dyn_state_ci.dynamicStateCount = 1;
8651 dyn_state_ci.pDynamicStates = &vp_state;
8652
8653 VkPipelineShaderStageCreateInfo shaderStages[2];
8654 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8655
8656 VkShaderObj vs(m_device, bindStateVertShaderText,
8657 VK_SHADER_STAGE_VERTEX_BIT, this);
8658 VkShaderObj fs(m_device, bindStateFragShaderText,
8659 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008660 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008661 // but add it to be able to run on more devices
8662 shaderStages[0] = vs.GetStageCreateInfo();
8663 shaderStages[1] = fs.GetStageCreateInfo();
8664
8665 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8666 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8667 vi_ci.pNext = nullptr;
8668 vi_ci.vertexBindingDescriptionCount = 0;
8669 vi_ci.pVertexBindingDescriptions = nullptr;
8670 vi_ci.vertexAttributeDescriptionCount = 0;
8671 vi_ci.pVertexAttributeDescriptions = nullptr;
8672
8673 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8674 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8675 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8676
8677 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8678 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8679 rs_ci.pNext = nullptr;
8680
Mark Youngc89c6312016-03-31 16:03:20 -06008681 VkPipelineColorBlendAttachmentState att = {};
8682 att.blendEnable = VK_FALSE;
8683 att.colorWriteMask = 0xf;
8684
Karl Schultz6addd812016-02-02 17:17:23 -07008685 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8686 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8687 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008688 cb_ci.attachmentCount = 1;
8689 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008690
8691 VkGraphicsPipelineCreateInfo gp_ci = {};
8692 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8693 gp_ci.stageCount = 2;
8694 gp_ci.pStages = shaderStages;
8695 gp_ci.pVertexInputState = &vi_ci;
8696 gp_ci.pInputAssemblyState = &ia_ci;
8697 gp_ci.pViewportState = &vp_state_ci;
8698 gp_ci.pRasterizationState = &rs_ci;
8699 gp_ci.pColorBlendState = &cb_ci;
8700 gp_ci.pDynamicState = &dyn_state_ci;
8701 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8702 gp_ci.layout = pipeline_layout;
8703 gp_ci.renderPass = renderPass();
8704
8705 VkPipelineCacheCreateInfo pc_ci = {};
8706 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8707
8708 VkPipeline pipeline;
8709 VkPipelineCache pipelineCache;
8710
8711 err =
8712 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
8713 ASSERT_VK_SUCCESS(err);
8714 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8715 &gp_ci, NULL, &pipeline);
8716
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008717 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008718
8719 // Now hit second fail case where we set scissor w/ different count than PSO
8720 // First need to successfully create the PSO from above by setting
8721 // pViewports
8722 m_errorMonitor->SetDesiredFailureMsg(
8723 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8724 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
8725 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008726
Tobin Ehlisd332f282015-10-02 11:00:56 -06008727 VkRect2D sc = {}; // Just need dummy vp to point to
8728 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07008729 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8730 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008731 ASSERT_VK_SUCCESS(err);
8732 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008733 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8734 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008735 VkViewport viewports[2] = {}; // don't care about data
8736 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07008737 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008738 Draw(1, 0, 0, 0);
8739
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008740 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008741
Chia-I Wuf7458c52015-10-26 21:10:41 +08008742 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8743 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8744 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8745 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008746 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008747}
8748
Mark Young7394fdd2016-03-31 14:56:43 -06008749TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8750 VkResult err;
8751
8752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06008753 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008754
8755 ASSERT_NO_FATAL_FAILURE(InitState());
8756 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8757
8758 VkDescriptorPoolSize ds_type_count = {};
8759 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8760 ds_type_count.descriptorCount = 1;
8761
8762 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8763 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8764 ds_pool_ci.maxSets = 1;
8765 ds_pool_ci.poolSizeCount = 1;
8766 ds_pool_ci.pPoolSizes = &ds_type_count;
8767
8768 VkDescriptorPool ds_pool;
8769 err =
8770 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
8771 ASSERT_VK_SUCCESS(err);
8772
8773 VkDescriptorSetLayoutBinding dsl_binding = {};
8774 dsl_binding.binding = 0;
8775 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8776 dsl_binding.descriptorCount = 1;
8777 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8778
8779 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8780 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8781 ds_layout_ci.bindingCount = 1;
8782 ds_layout_ci.pBindings = &dsl_binding;
8783
8784 VkDescriptorSetLayout ds_layout;
8785 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8786 &ds_layout);
8787 ASSERT_VK_SUCCESS(err);
8788
8789 VkDescriptorSet descriptorSet;
8790 VkDescriptorSetAllocateInfo alloc_info = {};
8791 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8792 alloc_info.descriptorSetCount = 1;
8793 alloc_info.descriptorPool = ds_pool;
8794 alloc_info.pSetLayouts = &ds_layout;
8795 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8796 &descriptorSet);
8797 ASSERT_VK_SUCCESS(err);
8798
8799 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8800 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8801 pipeline_layout_ci.setLayoutCount = 1;
8802 pipeline_layout_ci.pSetLayouts = &ds_layout;
8803
8804 VkPipelineLayout pipeline_layout;
8805 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8806 &pipeline_layout);
8807 ASSERT_VK_SUCCESS(err);
8808
8809 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8810 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8811 vp_state_ci.scissorCount = 1;
8812 vp_state_ci.pScissors = NULL;
8813 vp_state_ci.viewportCount = 1;
8814 vp_state_ci.pViewports = NULL;
8815
8816 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
8817 VK_DYNAMIC_STATE_SCISSOR,
8818 VK_DYNAMIC_STATE_LINE_WIDTH};
8819 // Set scissor as dynamic to avoid that error
8820 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8821 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8822 dyn_state_ci.dynamicStateCount = 2;
8823 dyn_state_ci.pDynamicStates = dynamic_states;
8824
8825 VkPipelineShaderStageCreateInfo shaderStages[2];
8826 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8827
8828 VkShaderObj vs(m_device, bindStateVertShaderText,
8829 VK_SHADER_STAGE_VERTEX_BIT, this);
8830 VkShaderObj fs(m_device, bindStateFragShaderText,
8831 VK_SHADER_STAGE_FRAGMENT_BIT,
8832 this); // TODO - We shouldn't need a fragment shader
8833 // but add it to be able to run on more devices
8834 shaderStages[0] = vs.GetStageCreateInfo();
8835 shaderStages[1] = fs.GetStageCreateInfo();
8836
8837 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8838 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8839 vi_ci.pNext = nullptr;
8840 vi_ci.vertexBindingDescriptionCount = 0;
8841 vi_ci.pVertexBindingDescriptions = nullptr;
8842 vi_ci.vertexAttributeDescriptionCount = 0;
8843 vi_ci.pVertexAttributeDescriptions = nullptr;
8844
8845 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8846 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8847 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8848
8849 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8850 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8851 rs_ci.pNext = nullptr;
8852
Mark Young47107952016-05-02 15:59:55 -06008853 // Check too low (line width of -1.0f).
8854 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008855
8856 VkPipelineColorBlendAttachmentState att = {};
8857 att.blendEnable = VK_FALSE;
8858 att.colorWriteMask = 0xf;
8859
8860 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8861 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8862 cb_ci.pNext = nullptr;
8863 cb_ci.attachmentCount = 1;
8864 cb_ci.pAttachments = &att;
8865
8866 VkGraphicsPipelineCreateInfo gp_ci = {};
8867 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8868 gp_ci.stageCount = 2;
8869 gp_ci.pStages = shaderStages;
8870 gp_ci.pVertexInputState = &vi_ci;
8871 gp_ci.pInputAssemblyState = &ia_ci;
8872 gp_ci.pViewportState = &vp_state_ci;
8873 gp_ci.pRasterizationState = &rs_ci;
8874 gp_ci.pColorBlendState = &cb_ci;
8875 gp_ci.pDynamicState = &dyn_state_ci;
8876 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8877 gp_ci.layout = pipeline_layout;
8878 gp_ci.renderPass = renderPass();
8879
8880 VkPipelineCacheCreateInfo pc_ci = {};
8881 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8882
8883 VkPipeline pipeline;
8884 VkPipelineCache pipelineCache;
8885
8886 err =
8887 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
8888 ASSERT_VK_SUCCESS(err);
8889 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8890 &gp_ci, NULL, &pipeline);
8891
8892 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008893 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008894
8895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8896 "Attempt to set lineWidth to 65536");
8897
8898 // Check too high (line width of 65536.0f).
8899 rs_ci.lineWidth = 65536.0f;
8900
8901 err =
8902 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
8903 ASSERT_VK_SUCCESS(err);
8904 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8905 &gp_ci, NULL, &pipeline);
8906
8907 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008908 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008909
8910 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06008911 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008912
8913 dyn_state_ci.dynamicStateCount = 3;
8914
8915 rs_ci.lineWidth = 1.0f;
8916
8917 err =
8918 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
8919 ASSERT_VK_SUCCESS(err);
8920 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8921 &gp_ci, NULL, &pipeline);
8922 BeginCommandBuffer();
8923 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8924 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
8925
8926 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008927 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008928 m_errorMonitor->VerifyFound();
8929
8930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8931 "Attempt to set lineWidth to 65536");
8932
8933 // Check too high with dynamic setting.
8934 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8935 m_errorMonitor->VerifyFound();
8936 EndCommandBuffer();
8937
8938 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8939 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8940 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8941 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008942 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008943}
8944
Karl Schultz6addd812016-02-02 17:17:23 -07008945TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008946 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008947 m_errorMonitor->SetDesiredFailureMsg(
8948 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008949 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008950
8951 ASSERT_NO_FATAL_FAILURE(InitState());
8952 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008953
Tony Barbourfe3351b2015-07-28 10:17:20 -06008954 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008955 // Don't care about RenderPass handle b/c error should be flagged before
8956 // that
8957 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
8958 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008959
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008960 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008961}
8962
Karl Schultz6addd812016-02-02 17:17:23 -07008963TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008964 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008965 m_errorMonitor->SetDesiredFailureMsg(
8966 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008967 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008968
8969 ASSERT_NO_FATAL_FAILURE(InitState());
8970 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008971
Tony Barbourfe3351b2015-07-28 10:17:20 -06008972 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008973 // Just create a dummy Renderpass that's non-NULL so we can get to the
8974 // proper error
Chris Forbes38ae7c42016-06-21 20:51:44 +12008975 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
Karl Schultz6addd812016-02-02 17:17:23 -07008976 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008977
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008978 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008979}
8980
Chris Forbes2eeabe32016-06-21 20:52:34 +12008981TEST_F(VkLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
8982 m_errorMonitor->ExpectSuccess();
8983
8984 ASSERT_NO_FATAL_FAILURE(InitState());
8985 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8986
8987 BeginCommandBuffer(); // framework implicitly begins the renderpass.
8988 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // end implicit.
8989
8990 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
8991 VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
8992 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8993 m_errorMonitor->VerifyNotFound();
8994 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
8995 VK_SUBPASS_CONTENTS_INLINE);
8996 m_errorMonitor->VerifyNotFound();
8997 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8998 m_errorMonitor->VerifyNotFound();
8999
9000 m_commandBuffer->EndCommandBuffer();
9001 m_errorMonitor->VerifyNotFound();
9002}
9003
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009004TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
9005 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
9006 "the number of renderPass attachments that use loadOp"
9007 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
9008
9009 ASSERT_NO_FATAL_FAILURE(InitState());
9010 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9011
9012 // Create a renderPass with a single attachment that uses loadOp CLEAR
9013 VkAttachmentReference attach = {};
9014 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9015 VkSubpassDescription subpass = {};
9016 subpass.inputAttachmentCount = 1;
9017 subpass.pInputAttachments = &attach;
9018 VkRenderPassCreateInfo rpci = {};
9019 rpci.subpassCount = 1;
9020 rpci.pSubpasses = &subpass;
9021 rpci.attachmentCount = 1;
9022 VkAttachmentDescription attach_desc = {};
9023 attach_desc.format = VK_FORMAT_UNDEFINED;
9024 // Set loadOp to CLEAR
9025 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9026 rpci.pAttachments = &attach_desc;
9027 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9028 VkRenderPass rp;
9029 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9030
9031 VkCommandBufferInheritanceInfo hinfo = {};
9032 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9033 hinfo.renderPass = VK_NULL_HANDLE;
9034 hinfo.subpass = 0;
9035 hinfo.framebuffer = VK_NULL_HANDLE;
9036 hinfo.occlusionQueryEnable = VK_FALSE;
9037 hinfo.queryFlags = 0;
9038 hinfo.pipelineStatistics = 0;
9039 VkCommandBufferBeginInfo info = {};
9040 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9041 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9042 info.pInheritanceInfo = &hinfo;
9043
9044 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9045 VkRenderPassBeginInfo rp_begin = {};
9046 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9047 rp_begin.pNext = NULL;
9048 rp_begin.renderPass = renderPass();
9049 rp_begin.framebuffer = framebuffer();
9050 rp_begin.clearValueCount = 0; // Should be 1
9051
9052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9053 " has a clearValueCount of 0 but the "
9054 "actual number of attachments in "
9055 "renderPass ");
9056
9057 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
9058 VK_SUBPASS_CONTENTS_INLINE);
9059
9060 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06009061
9062 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009063}
9064
Cody Northrop3bb4d962016-05-09 16:15:57 -06009065TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
9066
9067 TEST_DESCRIPTION("End a command buffer with an active render pass");
9068
9069 m_errorMonitor->SetDesiredFailureMsg(
9070 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9071 "It is invalid to issue this call inside an active render pass");
9072
9073 ASSERT_NO_FATAL_FAILURE(InitState());
9074 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9075
9076 // The framework's BeginCommandBuffer calls CreateRenderPass
9077 BeginCommandBuffer();
9078
9079 // Call directly into vkEndCommandBuffer instead of the
9080 // the framework's EndCommandBuffer, which inserts a
9081 // vkEndRenderPass
9082 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
9083
9084 m_errorMonitor->VerifyFound();
9085
9086 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
9087 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
9088}
9089
Karl Schultz6addd812016-02-02 17:17:23 -07009090TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009091 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009092 m_errorMonitor->SetDesiredFailureMsg(
9093 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009094 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009095
9096 ASSERT_NO_FATAL_FAILURE(InitState());
9097 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009098
9099 // Renderpass is started here
9100 BeginCommandBuffer();
9101
9102 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009103 vk_testing::Buffer dstBuffer;
9104 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009105
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009106 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009107
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009108 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009109}
9110
Karl Schultz6addd812016-02-02 17:17:23 -07009111TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009112 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009113 m_errorMonitor->SetDesiredFailureMsg(
9114 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009115 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009116
9117 ASSERT_NO_FATAL_FAILURE(InitState());
9118 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009119
9120 // Renderpass is started here
9121 BeginCommandBuffer();
9122
9123 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009124 vk_testing::Buffer dstBuffer;
9125 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009126
Karl Schultz6addd812016-02-02 17:17:23 -07009127 VkDeviceSize dstOffset = 0;
9128 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -06009129 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009130
Karl Schultz6addd812016-02-02 17:17:23 -07009131 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
9132 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009133
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009134 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009135}
9136
Karl Schultz6addd812016-02-02 17:17:23 -07009137TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009138 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009139 m_errorMonitor->SetDesiredFailureMsg(
9140 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009141 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009142
9143 ASSERT_NO_FATAL_FAILURE(InitState());
9144 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009145
9146 // Renderpass is started here
9147 BeginCommandBuffer();
9148
Michael Lentine0a369f62016-02-03 16:51:46 -06009149 VkClearColorValue clear_color;
9150 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07009151 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9152 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9153 const int32_t tex_width = 32;
9154 const int32_t tex_height = 32;
9155 VkImageCreateInfo image_create_info = {};
9156 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9157 image_create_info.pNext = NULL;
9158 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9159 image_create_info.format = tex_format;
9160 image_create_info.extent.width = tex_width;
9161 image_create_info.extent.height = tex_height;
9162 image_create_info.extent.depth = 1;
9163 image_create_info.mipLevels = 1;
9164 image_create_info.arrayLayers = 1;
9165 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9166 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9167 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009168
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009169 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07009170 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
9171 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009172
Karl Schultz6addd812016-02-02 17:17:23 -07009173 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
9174 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009175
Karl Schultz6addd812016-02-02 17:17:23 -07009176 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
9177 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009178
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009179 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009180}
9181
Karl Schultz6addd812016-02-02 17:17:23 -07009182TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009183 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009184 m_errorMonitor->SetDesiredFailureMsg(
9185 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009186 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009187
9188 ASSERT_NO_FATAL_FAILURE(InitState());
9189 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009190
9191 // Renderpass is started here
9192 BeginCommandBuffer();
9193
9194 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07009195 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009196 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
9197 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9198 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
9199 image_create_info.extent.width = 64;
9200 image_create_info.extent.height = 64;
9201 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9202 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009203
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009204 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07009205 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
9206 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009207
Karl Schultz6addd812016-02-02 17:17:23 -07009208 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
9209 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009210
Karl Schultz6addd812016-02-02 17:17:23 -07009211 vkCmdClearDepthStencilImage(
9212 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
9213 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
9214 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009215
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009216 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009217}
9218
Karl Schultz6addd812016-02-02 17:17:23 -07009219TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009220 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009221 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009222
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009224 "vkCmdClearAttachments: This call "
9225 "must be issued inside an active "
9226 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009227
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009228 ASSERT_NO_FATAL_FAILURE(InitState());
9229 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009230
9231 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009232 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009233 ASSERT_VK_SUCCESS(err);
9234
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009235 VkClearAttachment color_attachment;
9236 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9237 color_attachment.clearValue.color.float32[0] = 0;
9238 color_attachment.clearValue.color.float32[1] = 0;
9239 color_attachment.clearValue.color.float32[2] = 0;
9240 color_attachment.clearValue.color.float32[3] = 0;
9241 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009242 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
9243 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
9244 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009245
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009246 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009247}
9248
Karl Schultz9e66a292016-04-21 15:57:51 -06009249TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9250 // Try to add a buffer memory barrier with no buffer.
9251 m_errorMonitor->SetDesiredFailureMsg(
9252 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9253 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
9254
9255 ASSERT_NO_FATAL_FAILURE(InitState());
9256 BeginCommandBuffer();
9257
9258 VkBufferMemoryBarrier buf_barrier = {};
9259 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9260 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9261 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9262 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9263 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9264 buf_barrier.buffer = VK_NULL_HANDLE;
9265 buf_barrier.offset = 0;
9266 buf_barrier.size = VK_WHOLE_SIZE;
9267 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9268 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
9269 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
9270
9271 m_errorMonitor->VerifyFound();
9272}
9273
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009274TEST_F(VkLayerTest, InvalidBarriers) {
9275 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9276
9277 m_errorMonitor->SetDesiredFailureMsg(
9278 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
9279
9280 ASSERT_NO_FATAL_FAILURE(InitState());
9281 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9282
9283 VkMemoryBarrier mem_barrier = {};
9284 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9285 mem_barrier.pNext = NULL;
9286 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9287 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9288 BeginCommandBuffer();
9289 // BeginCommandBuffer() starts a render pass
9290 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9291 VK_PIPELINE_STAGE_HOST_BIT,
9292 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
9293 &mem_barrier, 0, nullptr, 0, nullptr);
9294 m_errorMonitor->VerifyFound();
9295
9296 m_errorMonitor->SetDesiredFailureMsg(
9297 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9298 "Image Layout cannot be transitioned to UNDEFINED");
9299 VkImageObj image(m_device);
9300 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9301 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9302 ASSERT_TRUE(image.initialized());
9303 VkImageMemoryBarrier img_barrier = {};
9304 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9305 img_barrier.pNext = NULL;
9306 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9307 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9308 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9309 // New layout can't be UNDEFINED
9310 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9311 img_barrier.image = image.handle();
9312 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9313 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9314 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9315 img_barrier.subresourceRange.baseArrayLayer = 0;
9316 img_barrier.subresourceRange.baseMipLevel = 0;
9317 img_barrier.subresourceRange.layerCount = 1;
9318 img_barrier.subresourceRange.levelCount = 1;
9319 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9320 VK_PIPELINE_STAGE_HOST_BIT,
9321 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9322 nullptr, 1, &img_barrier);
9323 m_errorMonitor->VerifyFound();
9324 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9325
9326 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9327 "Subresource must have the sum of the "
9328 "baseArrayLayer");
9329 // baseArrayLayer + layerCount must be <= image's arrayLayers
9330 img_barrier.subresourceRange.baseArrayLayer = 1;
9331 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9332 VK_PIPELINE_STAGE_HOST_BIT,
9333 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9334 nullptr, 1, &img_barrier);
9335 m_errorMonitor->VerifyFound();
9336 img_barrier.subresourceRange.baseArrayLayer = 0;
9337
9338 m_errorMonitor->SetDesiredFailureMsg(
9339 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9340 "Subresource must have the sum of the baseMipLevel");
9341 // baseMipLevel + levelCount must be <= image's mipLevels
9342 img_barrier.subresourceRange.baseMipLevel = 1;
9343 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9344 VK_PIPELINE_STAGE_HOST_BIT,
9345 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9346 nullptr, 1, &img_barrier);
9347 m_errorMonitor->VerifyFound();
9348 img_barrier.subresourceRange.baseMipLevel = 0;
9349
9350 m_errorMonitor->SetDesiredFailureMsg(
9351 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9352 "Buffer Barriers cannot be used during a render pass");
9353 vk_testing::Buffer buffer;
9354 buffer.init(*m_device, 256);
9355 VkBufferMemoryBarrier buf_barrier = {};
9356 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9357 buf_barrier.pNext = NULL;
9358 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9359 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9360 buf_barrier.buffer = buffer.handle();
9361 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9362 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9363 buf_barrier.offset = 0;
9364 buf_barrier.size = VK_WHOLE_SIZE;
9365 // Can't send buffer barrier during a render pass
9366 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9367 VK_PIPELINE_STAGE_HOST_BIT,
9368 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9369 &buf_barrier, 0, nullptr);
9370 m_errorMonitor->VerifyFound();
9371 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9372
9373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9374 "which is not less than total size");
9375 buf_barrier.offset = 257;
9376 // Offset greater than total size
9377 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9378 VK_PIPELINE_STAGE_HOST_BIT,
9379 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9380 &buf_barrier, 0, nullptr);
9381 m_errorMonitor->VerifyFound();
9382 buf_barrier.offset = 0;
9383
9384 m_errorMonitor->SetDesiredFailureMsg(
9385 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
9386 buf_barrier.size = 257;
9387 // Size greater than total size
9388 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9389 VK_PIPELINE_STAGE_HOST_BIT,
9390 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9391 &buf_barrier, 0, nullptr);
9392 m_errorMonitor->VerifyFound();
9393 buf_barrier.size = VK_WHOLE_SIZE;
9394
9395 m_errorMonitor->SetDesiredFailureMsg(
9396 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9397 "Image is a depth and stencil format and thus must "
9398 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
9399 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
9400 VkDepthStencilObj ds_image(m_device);
9401 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
9402 ASSERT_TRUE(ds_image.initialized());
9403 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9404 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9405 img_barrier.image = ds_image.handle();
9406 // Leave aspectMask at COLOR on purpose
9407 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9408 VK_PIPELINE_STAGE_HOST_BIT,
9409 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9410 nullptr, 1, &img_barrier);
9411 m_errorMonitor->VerifyFound();
9412}
9413
Karl Schultz6addd812016-02-02 17:17:23 -07009414TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009415 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009416 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009417
Karl Schultz6addd812016-02-02 17:17:23 -07009418 m_errorMonitor->SetDesiredFailureMsg(
9419 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009420 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9421
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009422 ASSERT_NO_FATAL_FAILURE(InitState());
9423 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009424 uint32_t qfi = 0;
9425 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009426 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9427 buffCI.size = 1024;
9428 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9429 buffCI.queueFamilyIndexCount = 1;
9430 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009431
9432 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009433 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009434 ASSERT_VK_SUCCESS(err);
9435
9436 BeginCommandBuffer();
9437 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009438 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9439 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009440 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07009441 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
9442 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009443
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009444 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009445
Chia-I Wuf7458c52015-10-26 21:10:41 +08009446 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009447}
9448
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009449TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9450 // Create an out-of-range queueFamilyIndex
9451 m_errorMonitor->SetDesiredFailureMsg(
9452 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -06009453 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
9454 "of the indices specified when the device was created, via the "
9455 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009456
9457 ASSERT_NO_FATAL_FAILURE(InitState());
9458 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9459 VkBufferCreateInfo buffCI = {};
9460 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9461 buffCI.size = 1024;
9462 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9463 buffCI.queueFamilyIndexCount = 1;
9464 // Introduce failure by specifying invalid queue_family_index
9465 uint32_t qfi = 777;
9466 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06009467 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009468
9469 VkBuffer ib;
9470 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
9471
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009472 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009473 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009474}
9475
Karl Schultz6addd812016-02-02 17:17:23 -07009476TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
9477 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
9478 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009479
Karl Schultz6addd812016-02-02 17:17:23 -07009480 m_errorMonitor->SetDesiredFailureMsg(
9481 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009482 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009483
9484 ASSERT_NO_FATAL_FAILURE(InitState());
9485 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009486
9487 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009488 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009489 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
9490 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009491
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009492 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009493}
9494
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009495TEST_F(VkLayerTest, DSUsageBitsErrors) {
9496 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
9497 "that do not have correct usage bits sets.");
9498 VkResult err;
9499
9500 ASSERT_NO_FATAL_FAILURE(InitState());
9501 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9502 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9503 ds_type_count[i].type = VkDescriptorType(i);
9504 ds_type_count[i].descriptorCount = 1;
9505 }
9506 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9507 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9508 ds_pool_ci.pNext = NULL;
9509 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9510 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9511 ds_pool_ci.pPoolSizes = ds_type_count;
9512
9513 VkDescriptorPool ds_pool;
9514 err =
9515 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9516 ASSERT_VK_SUCCESS(err);
9517
9518 // Create 10 layouts where each has a single descriptor of different type
9519 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] =
9520 {};
9521 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9522 dsl_binding[i].binding = 0;
9523 dsl_binding[i].descriptorType = VkDescriptorType(i);
9524 dsl_binding[i].descriptorCount = 1;
9525 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9526 dsl_binding[i].pImmutableSamplers = NULL;
9527 }
9528
9529 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9530 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9531 ds_layout_ci.pNext = NULL;
9532 ds_layout_ci.bindingCount = 1;
9533 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9534 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9535 ds_layout_ci.pBindings = dsl_binding + i;
9536 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
9537 NULL, ds_layouts + i);
9538 ASSERT_VK_SUCCESS(err);
9539 }
9540 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9541 VkDescriptorSetAllocateInfo alloc_info = {};
9542 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9543 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9544 alloc_info.descriptorPool = ds_pool;
9545 alloc_info.pSetLayouts = ds_layouts;
9546 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9547 descriptor_sets);
9548 ASSERT_VK_SUCCESS(err);
9549
9550 // Create a buffer & bufferView to be used for invalid updates
9551 VkBufferCreateInfo buff_ci = {};
9552 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9553 // This usage is not valid for any descriptor type
9554 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
9555 buff_ci.size = 256;
9556 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9557 VkBuffer buffer;
9558 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9559 ASSERT_VK_SUCCESS(err);
9560
9561 VkBufferViewCreateInfo buff_view_ci = {};
9562 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9563 buff_view_ci.buffer = buffer;
9564 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9565 buff_view_ci.range = VK_WHOLE_SIZE;
9566 VkBufferView buff_view;
9567 err =
9568 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
9569 ASSERT_VK_SUCCESS(err);
9570
9571 // Create an image to be used for invalid updates
9572 VkImageCreateInfo image_ci = {};
9573 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9574 image_ci.imageType = VK_IMAGE_TYPE_2D;
9575 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
9576 image_ci.extent.width = 64;
9577 image_ci.extent.height = 64;
9578 image_ci.extent.depth = 1;
9579 image_ci.mipLevels = 1;
9580 image_ci.arrayLayers = 1;
9581 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
9582 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9583 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9584 // This usage is not valid for any descriptor type
9585 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9586 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9587 VkImage image;
9588 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9589 ASSERT_VK_SUCCESS(err);
9590 // Bind memory to image
9591 VkMemoryRequirements mem_reqs;
9592 VkDeviceMemory image_mem;
9593 bool pass;
9594 VkMemoryAllocateInfo mem_alloc = {};
9595 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9596 mem_alloc.pNext = NULL;
9597 mem_alloc.allocationSize = 0;
9598 mem_alloc.memoryTypeIndex = 0;
9599 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9600 mem_alloc.allocationSize = mem_reqs.size;
9601 pass =
9602 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9603 ASSERT_TRUE(pass);
9604 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9605 ASSERT_VK_SUCCESS(err);
9606 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9607 ASSERT_VK_SUCCESS(err);
9608 // Now create view for image
9609 VkImageViewCreateInfo image_view_ci = {};
9610 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9611 image_view_ci.image = image;
9612 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
9613 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9614 image_view_ci.subresourceRange.layerCount = 1;
9615 image_view_ci.subresourceRange.baseArrayLayer = 0;
9616 image_view_ci.subresourceRange.levelCount = 1;
9617 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9618 VkImageView image_view;
9619 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
9620 &image_view);
9621 ASSERT_VK_SUCCESS(err);
9622
9623 VkDescriptorBufferInfo buff_info = {};
9624 buff_info.buffer = buffer;
9625 VkDescriptorImageInfo img_info = {};
9626 img_info.imageView = image_view;
9627 VkWriteDescriptorSet descriptor_write = {};
9628 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9629 descriptor_write.dstBinding = 0;
9630 descriptor_write.descriptorCount = 1;
9631 descriptor_write.pTexelBufferView = &buff_view;
9632 descriptor_write.pBufferInfo = &buff_info;
9633 descriptor_write.pImageInfo = &img_info;
9634
9635 // These error messages align with VkDescriptorType struct
9636 const char *error_msgs[] = {
9637 "", // placeholder, no error for SAMPLER descriptor
9638 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
9639 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
9640 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
9641 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
9642 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
9643 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
9644 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
9645 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
9646 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
9647 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
9648 // Start loop at 1 as SAMPLER desc type has no usage bit error
9649 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9650 descriptor_write.descriptorType = VkDescriptorType(i);
9651 descriptor_write.dstSet = descriptor_sets[i];
9652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9653 error_msgs[i]);
9654
9655 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
9656 NULL);
9657
9658 m_errorMonitor->VerifyFound();
9659 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
9660 }
9661 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9662 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009663 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009664 vkDestroyImageView(m_device->device(), image_view, NULL);
9665 vkDestroyBuffer(m_device->device(), buffer, NULL);
9666 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9667 vkFreeDescriptorSets(m_device->device(), ds_pool,
9668 VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
9669 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9670}
9671
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009672TEST_F(VkLayerTest, DSBufferInfoErrors) {
9673 TEST_DESCRIPTION(
9674 "Attempt to update buffer descriptor set that has incorrect "
9675 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
9676 "1. offset value greater than buffer size\n"
9677 "2. range value of 0\n"
9678 "3. range value greater than buffer (size - offset)");
9679 VkResult err;
9680
9681 ASSERT_NO_FATAL_FAILURE(InitState());
9682 VkDescriptorPoolSize ds_type_count = {};
9683 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9684 ds_type_count.descriptorCount = 1;
9685
9686 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9687 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9688 ds_pool_ci.pNext = NULL;
9689 ds_pool_ci.maxSets = 1;
9690 ds_pool_ci.poolSizeCount = 1;
9691 ds_pool_ci.pPoolSizes = &ds_type_count;
9692
9693 VkDescriptorPool ds_pool;
9694 err =
9695 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9696 ASSERT_VK_SUCCESS(err);
9697
9698 // Create layout with single uniform buffer descriptor
9699 VkDescriptorSetLayoutBinding dsl_binding = {};
9700 dsl_binding.binding = 0;
9701 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9702 dsl_binding.descriptorCount = 1;
9703 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9704 dsl_binding.pImmutableSamplers = NULL;
9705
9706 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9707 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9708 ds_layout_ci.pNext = NULL;
9709 ds_layout_ci.bindingCount = 1;
9710 ds_layout_ci.pBindings = &dsl_binding;
9711 VkDescriptorSetLayout ds_layout;
9712 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9713 &ds_layout);
9714 ASSERT_VK_SUCCESS(err);
9715
9716 VkDescriptorSet descriptor_set = {};
9717 VkDescriptorSetAllocateInfo alloc_info = {};
9718 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9719 alloc_info.descriptorSetCount = 1;
9720 alloc_info.descriptorPool = ds_pool;
9721 alloc_info.pSetLayouts = &ds_layout;
9722 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9723 &descriptor_set);
9724 ASSERT_VK_SUCCESS(err);
9725
9726 // Create a buffer to be used for invalid updates
9727 VkBufferCreateInfo buff_ci = {};
9728 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9729 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9730 buff_ci.size = 256;
9731 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9732 VkBuffer buffer;
9733 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9734 ASSERT_VK_SUCCESS(err);
9735 // Have to bind memory to buffer before descriptor update
9736 VkMemoryAllocateInfo mem_alloc = {};
9737 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9738 mem_alloc.pNext = NULL;
9739 mem_alloc.allocationSize = 256;
9740 mem_alloc.memoryTypeIndex = 0;
9741
9742 VkMemoryRequirements mem_reqs;
9743 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9744 bool pass =
9745 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9746 if (!pass) {
9747 vkDestroyBuffer(m_device->device(), buffer, NULL);
9748 return;
9749 }
9750
9751 VkDeviceMemory mem;
9752 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9753 ASSERT_VK_SUCCESS(err);
9754 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9755 ASSERT_VK_SUCCESS(err);
9756
9757 VkDescriptorBufferInfo buff_info = {};
9758 buff_info.buffer = buffer;
9759 // First make offset 1 larger than buffer size
9760 buff_info.offset = 257;
9761 buff_info.range = VK_WHOLE_SIZE;
9762 VkWriteDescriptorSet descriptor_write = {};
9763 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9764 descriptor_write.dstBinding = 0;
9765 descriptor_write.descriptorCount = 1;
9766 descriptor_write.pTexelBufferView = nullptr;
9767 descriptor_write.pBufferInfo = &buff_info;
9768 descriptor_write.pImageInfo = nullptr;
9769
9770 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9771 descriptor_write.dstSet = descriptor_set;
9772 m_errorMonitor->SetDesiredFailureMsg(
9773 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9774 " offset of 257 is greater than buffer ");
9775
9776 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9777
9778 m_errorMonitor->VerifyFound();
9779 // Now cause error due to range of 0
9780 buff_info.offset = 0;
9781 buff_info.range = 0;
9782 m_errorMonitor->SetDesiredFailureMsg(
9783 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9784 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
9785
9786 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9787
9788 m_errorMonitor->VerifyFound();
9789 // Now cause error due to range exceeding buffer size - offset
9790 buff_info.offset = 128;
9791 buff_info.range = 200;
9792 m_errorMonitor->SetDesiredFailureMsg(
9793 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9794 " range is 200 which is greater than buffer size ");
9795
9796 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9797
9798 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009799 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009800 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9801 vkDestroyBuffer(m_device->device(), buffer, NULL);
9802 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9803 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9804}
9805
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009806TEST_F(VkLayerTest, DSAspectBitsErrors) {
9807 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9808 // are set, but could expand this test to hit more cases.
9809 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
9810 "that do not have correct aspect bits sets.");
9811 VkResult err;
9812
9813 ASSERT_NO_FATAL_FAILURE(InitState());
9814 VkDescriptorPoolSize ds_type_count = {};
9815 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9816 ds_type_count.descriptorCount = 1;
9817
9818 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9819 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9820 ds_pool_ci.pNext = NULL;
9821 ds_pool_ci.maxSets = 5;
9822 ds_pool_ci.poolSizeCount = 1;
9823 ds_pool_ci.pPoolSizes = &ds_type_count;
9824
9825 VkDescriptorPool ds_pool;
9826 err =
9827 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9828 ASSERT_VK_SUCCESS(err);
9829
9830 VkDescriptorSetLayoutBinding dsl_binding = {};
9831 dsl_binding.binding = 0;
9832 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9833 dsl_binding.descriptorCount = 1;
9834 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9835 dsl_binding.pImmutableSamplers = NULL;
9836
9837 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9838 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9839 ds_layout_ci.pNext = NULL;
9840 ds_layout_ci.bindingCount = 1;
9841 ds_layout_ci.pBindings = &dsl_binding;
9842 VkDescriptorSetLayout ds_layout;
9843 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9844 &ds_layout);
9845 ASSERT_VK_SUCCESS(err);
9846
9847 VkDescriptorSet descriptor_set = {};
9848 VkDescriptorSetAllocateInfo alloc_info = {};
9849 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9850 alloc_info.descriptorSetCount = 1;
9851 alloc_info.descriptorPool = ds_pool;
9852 alloc_info.pSetLayouts = &ds_layout;
9853 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9854 &descriptor_set);
9855 ASSERT_VK_SUCCESS(err);
9856
9857 // Create an image to be used for invalid updates
9858 VkImageCreateInfo image_ci = {};
9859 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9860 image_ci.imageType = VK_IMAGE_TYPE_2D;
9861 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9862 image_ci.extent.width = 64;
9863 image_ci.extent.height = 64;
9864 image_ci.extent.depth = 1;
9865 image_ci.mipLevels = 1;
9866 image_ci.arrayLayers = 1;
9867 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
9868 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9869 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9870 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9871 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9872 VkImage image;
9873 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9874 ASSERT_VK_SUCCESS(err);
9875 // Bind memory to image
9876 VkMemoryRequirements mem_reqs;
9877 VkDeviceMemory image_mem;
9878 bool pass;
9879 VkMemoryAllocateInfo mem_alloc = {};
9880 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9881 mem_alloc.pNext = NULL;
9882 mem_alloc.allocationSize = 0;
9883 mem_alloc.memoryTypeIndex = 0;
9884 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9885 mem_alloc.allocationSize = mem_reqs.size;
9886 pass =
9887 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9888 ASSERT_TRUE(pass);
9889 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9890 ASSERT_VK_SUCCESS(err);
9891 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9892 ASSERT_VK_SUCCESS(err);
9893 // Now create view for image
9894 VkImageViewCreateInfo image_view_ci = {};
9895 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9896 image_view_ci.image = image;
9897 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9898 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9899 image_view_ci.subresourceRange.layerCount = 1;
9900 image_view_ci.subresourceRange.baseArrayLayer = 0;
9901 image_view_ci.subresourceRange.levelCount = 1;
9902 // Setting both depth & stencil aspect bits is illegal for descriptor
9903 image_view_ci.subresourceRange.aspectMask =
9904 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
9905
9906 VkImageView image_view;
9907 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
9908 &image_view);
9909 ASSERT_VK_SUCCESS(err);
9910
9911 VkDescriptorImageInfo img_info = {};
9912 img_info.imageView = image_view;
9913 VkWriteDescriptorSet descriptor_write = {};
9914 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9915 descriptor_write.dstBinding = 0;
9916 descriptor_write.descriptorCount = 1;
9917 descriptor_write.pTexelBufferView = NULL;
9918 descriptor_write.pBufferInfo = NULL;
9919 descriptor_write.pImageInfo = &img_info;
9920 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9921 descriptor_write.dstSet = descriptor_set;
9922 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
9923 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
9924 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9925 error_msg);
9926
9927 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9928
9929 m_errorMonitor->VerifyFound();
9930 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9931 vkDestroyImage(m_device->device(), image, NULL);
9932 vkFreeMemory(m_device->device(), image_mem, NULL);
9933 vkDestroyImageView(m_device->device(), image_view, NULL);
9934 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9935 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9936}
9937
Karl Schultz6addd812016-02-02 17:17:23 -07009938TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009939 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07009940 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009941
Karl Schultz6addd812016-02-02 17:17:23 -07009942 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06009943 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9944 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
9945 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009946
Tobin Ehlis3b780662015-05-28 12:11:26 -06009947 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009948 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009949 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009950 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9951 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009952
9953 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009954 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9955 ds_pool_ci.pNext = NULL;
9956 ds_pool_ci.maxSets = 1;
9957 ds_pool_ci.poolSizeCount = 1;
9958 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009959
Tobin Ehlis3b780662015-05-28 12:11:26 -06009960 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009961 err =
9962 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009963 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009964 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009965 dsl_binding.binding = 0;
9966 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9967 dsl_binding.descriptorCount = 1;
9968 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9969 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009970
Tony Barboureb254902015-07-15 12:50:33 -06009971 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009972 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9973 ds_layout_ci.pNext = NULL;
9974 ds_layout_ci.bindingCount = 1;
9975 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009976
Tobin Ehlis3b780662015-05-28 12:11:26 -06009977 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009978 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9979 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009980 ASSERT_VK_SUCCESS(err);
9981
9982 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009983 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009984 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009985 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009986 alloc_info.descriptorPool = ds_pool;
9987 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009988 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9989 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009990 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009991
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009992 VkSamplerCreateInfo sampler_ci = {};
9993 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9994 sampler_ci.pNext = NULL;
9995 sampler_ci.magFilter = VK_FILTER_NEAREST;
9996 sampler_ci.minFilter = VK_FILTER_NEAREST;
9997 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9998 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9999 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10000 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10001 sampler_ci.mipLodBias = 1.0;
10002 sampler_ci.anisotropyEnable = VK_FALSE;
10003 sampler_ci.maxAnisotropy = 1;
10004 sampler_ci.compareEnable = VK_FALSE;
10005 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10006 sampler_ci.minLod = 1.0;
10007 sampler_ci.maxLod = 1.0;
10008 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10009 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10010 VkSampler sampler;
10011 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10012 ASSERT_VK_SUCCESS(err);
10013
10014 VkDescriptorImageInfo info = {};
10015 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010016
10017 VkWriteDescriptorSet descriptor_write;
10018 memset(&descriptor_write, 0, sizeof(descriptor_write));
10019 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010020 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010021 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010022 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010023 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010024 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010025
10026 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10027
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010028 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010029
Chia-I Wuf7458c52015-10-26 21:10:41 +080010030 vkDestroySampler(m_device->device(), sampler, NULL);
10031 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10032 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010033}
10034
Karl Schultz6addd812016-02-02 17:17:23 -070010035TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010036 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010037 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010038
Karl Schultz6addd812016-02-02 17:17:23 -070010039 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010040 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10041 " binding #0 with 1 total descriptors but update of 1 descriptors "
10042 "starting at binding offset of 0 combined with update array element "
10043 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010044
Tobin Ehlis3b780662015-05-28 12:11:26 -060010045 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010046 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010047 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010048 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10049 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010050
10051 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010052 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10053 ds_pool_ci.pNext = NULL;
10054 ds_pool_ci.maxSets = 1;
10055 ds_pool_ci.poolSizeCount = 1;
10056 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010057
Tobin Ehlis3b780662015-05-28 12:11:26 -060010058 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010059 err =
10060 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010061 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010062
Tony Barboureb254902015-07-15 12:50:33 -060010063 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010064 dsl_binding.binding = 0;
10065 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10066 dsl_binding.descriptorCount = 1;
10067 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10068 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010069
10070 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010071 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10072 ds_layout_ci.pNext = NULL;
10073 ds_layout_ci.bindingCount = 1;
10074 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010075
Tobin Ehlis3b780662015-05-28 12:11:26 -060010076 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010077 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10078 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010079 ASSERT_VK_SUCCESS(err);
10080
10081 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010082 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010083 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010084 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010085 alloc_info.descriptorPool = ds_pool;
10086 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010087 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10088 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010089 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010090
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010091 // Correctly update descriptor to avoid "NOT_UPDATED" error
10092 VkDescriptorBufferInfo buff_info = {};
10093 buff_info.buffer =
10094 VkBuffer(0); // Don't care about buffer handle for this test
10095 buff_info.offset = 0;
10096 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010097
10098 VkWriteDescriptorSet descriptor_write;
10099 memset(&descriptor_write, 0, sizeof(descriptor_write));
10100 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010101 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010102 descriptor_write.dstArrayElement =
10103 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010104 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010105 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10106 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010107
10108 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10109
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010110 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010111
Chia-I Wuf7458c52015-10-26 21:10:41 +080010112 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10113 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010114}
10115
Karl Schultz6addd812016-02-02 17:17:23 -070010116TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
10117 // Create layout w/ count of 1 and attempt update to that layout w/ binding
10118 // index 2
10119 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010120
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010121 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10122 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010123
Tobin Ehlis3b780662015-05-28 12:11:26 -060010124 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010125 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010126 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010127 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10128 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010129
10130 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010131 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10132 ds_pool_ci.pNext = NULL;
10133 ds_pool_ci.maxSets = 1;
10134 ds_pool_ci.poolSizeCount = 1;
10135 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010136
Tobin Ehlis3b780662015-05-28 12:11:26 -060010137 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010138 err =
10139 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010140 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010141
Tony Barboureb254902015-07-15 12:50:33 -060010142 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010143 dsl_binding.binding = 0;
10144 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10145 dsl_binding.descriptorCount = 1;
10146 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10147 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010148
10149 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010150 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10151 ds_layout_ci.pNext = NULL;
10152 ds_layout_ci.bindingCount = 1;
10153 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010154 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010155 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10156 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010157 ASSERT_VK_SUCCESS(err);
10158
10159 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010160 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010161 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010162 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010163 alloc_info.descriptorPool = ds_pool;
10164 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010165 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10166 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010167 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010168
Tony Barboureb254902015-07-15 12:50:33 -060010169 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010170 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10171 sampler_ci.pNext = NULL;
10172 sampler_ci.magFilter = VK_FILTER_NEAREST;
10173 sampler_ci.minFilter = VK_FILTER_NEAREST;
10174 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10175 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10176 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10177 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10178 sampler_ci.mipLodBias = 1.0;
10179 sampler_ci.anisotropyEnable = VK_FALSE;
10180 sampler_ci.maxAnisotropy = 1;
10181 sampler_ci.compareEnable = VK_FALSE;
10182 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10183 sampler_ci.minLod = 1.0;
10184 sampler_ci.maxLod = 1.0;
10185 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10186 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010187
Tobin Ehlis3b780662015-05-28 12:11:26 -060010188 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010189 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010190 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010191
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010192 VkDescriptorImageInfo info = {};
10193 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010194
10195 VkWriteDescriptorSet descriptor_write;
10196 memset(&descriptor_write, 0, sizeof(descriptor_write));
10197 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010198 descriptor_write.dstSet = descriptorSet;
10199 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010200 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010201 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010202 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010203 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010204
10205 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10206
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010207 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010208
Chia-I Wuf7458c52015-10-26 21:10:41 +080010209 vkDestroySampler(m_device->device(), sampler, NULL);
10210 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10211 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010212}
10213
Karl Schultz6addd812016-02-02 17:17:23 -070010214TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10215 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10216 // types
10217 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010218
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis660bcdc2016-05-17 10:39:46 -060010220 ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010221
Tobin Ehlis3b780662015-05-28 12:11:26 -060010222 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010223
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010224 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010225 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10226 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010227
10228 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010229 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10230 ds_pool_ci.pNext = NULL;
10231 ds_pool_ci.maxSets = 1;
10232 ds_pool_ci.poolSizeCount = 1;
10233 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010234
Tobin Ehlis3b780662015-05-28 12:11:26 -060010235 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010236 err =
10237 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010238 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010239 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010240 dsl_binding.binding = 0;
10241 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10242 dsl_binding.descriptorCount = 1;
10243 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10244 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010245
Tony Barboureb254902015-07-15 12:50:33 -060010246 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010247 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10248 ds_layout_ci.pNext = NULL;
10249 ds_layout_ci.bindingCount = 1;
10250 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010251
Tobin Ehlis3b780662015-05-28 12:11:26 -060010252 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010253 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10254 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010255 ASSERT_VK_SUCCESS(err);
10256
10257 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010258 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010259 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010260 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010261 alloc_info.descriptorPool = ds_pool;
10262 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010263 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10264 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010265 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010266
Tony Barboureb254902015-07-15 12:50:33 -060010267 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010268 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10269 sampler_ci.pNext = NULL;
10270 sampler_ci.magFilter = VK_FILTER_NEAREST;
10271 sampler_ci.minFilter = VK_FILTER_NEAREST;
10272 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10273 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10274 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10275 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10276 sampler_ci.mipLodBias = 1.0;
10277 sampler_ci.anisotropyEnable = VK_FALSE;
10278 sampler_ci.maxAnisotropy = 1;
10279 sampler_ci.compareEnable = VK_FALSE;
10280 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10281 sampler_ci.minLod = 1.0;
10282 sampler_ci.maxLod = 1.0;
10283 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10284 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010285 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010286 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010287 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010288
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010289 VkDescriptorImageInfo info = {};
10290 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010291
10292 VkWriteDescriptorSet descriptor_write;
10293 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -070010294 descriptor_write.sType =
10295 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010296 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010297 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010298 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010299 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010300 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010301
10302 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10303
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010304 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010305
Chia-I Wuf7458c52015-10-26 21:10:41 +080010306 vkDestroySampler(m_device->device(), sampler, NULL);
10307 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10308 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010309}
10310
Karl Schultz6addd812016-02-02 17:17:23 -070010311TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010312 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010313 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010314
Karl Schultz6addd812016-02-02 17:17:23 -070010315 m_errorMonitor->SetDesiredFailureMsg(
10316 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010317 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010318
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010319 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010320 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10321 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010322 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010323 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10324 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010325
10326 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010327 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10328 ds_pool_ci.pNext = NULL;
10329 ds_pool_ci.maxSets = 1;
10330 ds_pool_ci.poolSizeCount = 1;
10331 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010332
10333 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010334 err =
10335 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010336 ASSERT_VK_SUCCESS(err);
10337
10338 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010339 dsl_binding.binding = 0;
10340 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10341 dsl_binding.descriptorCount = 1;
10342 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10343 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010344
10345 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010346 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10347 ds_layout_ci.pNext = NULL;
10348 ds_layout_ci.bindingCount = 1;
10349 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010350 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010351 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10352 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010353 ASSERT_VK_SUCCESS(err);
10354
10355 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010356 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010357 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010358 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010359 alloc_info.descriptorPool = ds_pool;
10360 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010361 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10362 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010363 ASSERT_VK_SUCCESS(err);
10364
Karl Schultz6addd812016-02-02 17:17:23 -070010365 VkSampler sampler =
10366 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010367
10368 VkDescriptorImageInfo descriptor_info;
10369 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10370 descriptor_info.sampler = sampler;
10371
10372 VkWriteDescriptorSet descriptor_write;
10373 memset(&descriptor_write, 0, sizeof(descriptor_write));
10374 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010375 descriptor_write.dstSet = descriptorSet;
10376 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010377 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010378 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10379 descriptor_write.pImageInfo = &descriptor_info;
10380
10381 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10382
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010383 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010384
Chia-I Wuf7458c52015-10-26 21:10:41 +080010385 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10386 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010387}
10388
Karl Schultz6addd812016-02-02 17:17:23 -070010389TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10390 // Create a single combined Image/Sampler descriptor and send it an invalid
10391 // imageView
10392 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010393
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10395 "Attempted write update to combined "
10396 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -060010397 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010398
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010399 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010400 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010401 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10402 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010403
10404 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010405 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10406 ds_pool_ci.pNext = NULL;
10407 ds_pool_ci.maxSets = 1;
10408 ds_pool_ci.poolSizeCount = 1;
10409 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010410
10411 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010412 err =
10413 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010414 ASSERT_VK_SUCCESS(err);
10415
10416 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010417 dsl_binding.binding = 0;
10418 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10419 dsl_binding.descriptorCount = 1;
10420 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10421 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010422
10423 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010424 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10425 ds_layout_ci.pNext = NULL;
10426 ds_layout_ci.bindingCount = 1;
10427 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010428 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010429 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10430 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010431 ASSERT_VK_SUCCESS(err);
10432
10433 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010434 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010435 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010436 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010437 alloc_info.descriptorPool = ds_pool;
10438 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010439 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10440 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010441 ASSERT_VK_SUCCESS(err);
10442
10443 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010444 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10445 sampler_ci.pNext = NULL;
10446 sampler_ci.magFilter = VK_FILTER_NEAREST;
10447 sampler_ci.minFilter = VK_FILTER_NEAREST;
10448 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10449 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10450 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10451 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10452 sampler_ci.mipLodBias = 1.0;
10453 sampler_ci.anisotropyEnable = VK_FALSE;
10454 sampler_ci.maxAnisotropy = 1;
10455 sampler_ci.compareEnable = VK_FALSE;
10456 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10457 sampler_ci.minLod = 1.0;
10458 sampler_ci.maxLod = 1.0;
10459 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10460 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010461
10462 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010463 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010464 ASSERT_VK_SUCCESS(err);
10465
Karl Schultz6addd812016-02-02 17:17:23 -070010466 VkImageView view =
10467 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010468
10469 VkDescriptorImageInfo descriptor_info;
10470 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10471 descriptor_info.sampler = sampler;
10472 descriptor_info.imageView = view;
10473
10474 VkWriteDescriptorSet descriptor_write;
10475 memset(&descriptor_write, 0, sizeof(descriptor_write));
10476 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010477 descriptor_write.dstSet = descriptorSet;
10478 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010479 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010480 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10481 descriptor_write.pImageInfo = &descriptor_info;
10482
10483 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10484
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010485 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010486
Chia-I Wuf7458c52015-10-26 21:10:41 +080010487 vkDestroySampler(m_device->device(), sampler, NULL);
10488 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10489 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010490}
10491
Karl Schultz6addd812016-02-02 17:17:23 -070010492TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10493 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10494 // into the other
10495 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010496
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010497 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10498 " binding #1 with type "
10499 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10500 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010501
Tobin Ehlis04356f92015-10-27 16:35:27 -060010502 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010503 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010504 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010505 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10506 ds_type_count[0].descriptorCount = 1;
10507 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10508 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010509
10510 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010511 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10512 ds_pool_ci.pNext = NULL;
10513 ds_pool_ci.maxSets = 1;
10514 ds_pool_ci.poolSizeCount = 2;
10515 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010516
10517 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010518 err =
10519 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010520 ASSERT_VK_SUCCESS(err);
10521 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010522 dsl_binding[0].binding = 0;
10523 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10524 dsl_binding[0].descriptorCount = 1;
10525 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10526 dsl_binding[0].pImmutableSamplers = NULL;
10527 dsl_binding[1].binding = 1;
10528 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10529 dsl_binding[1].descriptorCount = 1;
10530 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10531 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010532
10533 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010534 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10535 ds_layout_ci.pNext = NULL;
10536 ds_layout_ci.bindingCount = 2;
10537 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010538
10539 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010540 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10541 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010542 ASSERT_VK_SUCCESS(err);
10543
10544 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010545 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010546 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010547 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010548 alloc_info.descriptorPool = ds_pool;
10549 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010550 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10551 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010552 ASSERT_VK_SUCCESS(err);
10553
10554 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010555 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10556 sampler_ci.pNext = NULL;
10557 sampler_ci.magFilter = VK_FILTER_NEAREST;
10558 sampler_ci.minFilter = VK_FILTER_NEAREST;
10559 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10560 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10561 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10562 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10563 sampler_ci.mipLodBias = 1.0;
10564 sampler_ci.anisotropyEnable = VK_FALSE;
10565 sampler_ci.maxAnisotropy = 1;
10566 sampler_ci.compareEnable = VK_FALSE;
10567 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10568 sampler_ci.minLod = 1.0;
10569 sampler_ci.maxLod = 1.0;
10570 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10571 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010572
10573 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010574 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010575 ASSERT_VK_SUCCESS(err);
10576
10577 VkDescriptorImageInfo info = {};
10578 info.sampler = sampler;
10579
10580 VkWriteDescriptorSet descriptor_write;
10581 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10582 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010583 descriptor_write.dstSet = descriptorSet;
10584 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010585 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010586 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10587 descriptor_write.pImageInfo = &info;
10588 // This write update should succeed
10589 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10590 // Now perform a copy update that fails due to type mismatch
10591 VkCopyDescriptorSet copy_ds_update;
10592 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10593 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10594 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -060010595 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010596 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010597 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +080010598 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010599 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10600
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010601 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010602 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070010603 m_errorMonitor->SetDesiredFailureMsg(
10604 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010605 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060010606 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10607 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10608 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010609 copy_ds_update.srcBinding =
10610 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010611 copy_ds_update.dstSet = descriptorSet;
10612 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -060010613 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010614 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10615
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010616 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010617
Tobin Ehlis04356f92015-10-27 16:35:27 -060010618 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070010619 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010620 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
10621 "update array offset of 0 and update of "
10622 "5 descriptors oversteps total number "
10623 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010624
Tobin Ehlis04356f92015-10-27 16:35:27 -060010625 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10626 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10627 copy_ds_update.srcSet = descriptorSet;
10628 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010629 copy_ds_update.dstSet = descriptorSet;
10630 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010631 copy_ds_update.descriptorCount =
10632 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010633 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10634
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010635 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010636
Chia-I Wuf7458c52015-10-26 21:10:41 +080010637 vkDestroySampler(m_device->device(), sampler, NULL);
10638 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10639 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010640}
10641
Karl Schultz6addd812016-02-02 17:17:23 -070010642TEST_F(VkLayerTest, NumSamplesMismatch) {
10643 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10644 // sampleCount
10645 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010646
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070010648 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010649
Tobin Ehlis3b780662015-05-28 12:11:26 -060010650 ASSERT_NO_FATAL_FAILURE(InitState());
10651 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010652 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010653 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010654 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010655
10656 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010657 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10658 ds_pool_ci.pNext = NULL;
10659 ds_pool_ci.maxSets = 1;
10660 ds_pool_ci.poolSizeCount = 1;
10661 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010662
Tobin Ehlis3b780662015-05-28 12:11:26 -060010663 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010664 err =
10665 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010666 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010667
Tony Barboureb254902015-07-15 12:50:33 -060010668 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010669 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010670 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010671 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010672 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10673 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010674
Tony Barboureb254902015-07-15 12:50:33 -060010675 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10676 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10677 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010678 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010679 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010680
Tobin Ehlis3b780662015-05-28 12:11:26 -060010681 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010682 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10683 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010684 ASSERT_VK_SUCCESS(err);
10685
10686 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010687 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010688 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010689 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010690 alloc_info.descriptorPool = ds_pool;
10691 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010692 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10693 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010694 ASSERT_VK_SUCCESS(err);
10695
Tony Barboureb254902015-07-15 12:50:33 -060010696 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010697 pipe_ms_state_ci.sType =
10698 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
10699 pipe_ms_state_ci.pNext = NULL;
10700 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10701 pipe_ms_state_ci.sampleShadingEnable = 0;
10702 pipe_ms_state_ci.minSampleShading = 1.0;
10703 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010704
Tony Barboureb254902015-07-15 12:50:33 -060010705 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010706 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10707 pipeline_layout_ci.pNext = NULL;
10708 pipeline_layout_ci.setLayoutCount = 1;
10709 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010710
10711 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010712 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
10713 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010714 ASSERT_VK_SUCCESS(err);
10715
Karl Schultz6addd812016-02-02 17:17:23 -070010716 VkShaderObj vs(m_device, bindStateVertShaderText,
10717 VK_SHADER_STAGE_VERTEX_BIT, this);
10718 VkShaderObj fs(m_device, bindStateFragShaderText,
10719 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060010720 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070010721 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010722 VkPipelineObj pipe(m_device);
10723 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010724 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010725 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010726 pipe.SetMSAA(&pipe_ms_state_ci);
10727 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010728
Tony Barbourfe3351b2015-07-28 10:17:20 -060010729 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070010730 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10731 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010732
Mark Young29927482016-05-04 14:38:51 -060010733 // Render triangle (the error should trigger on the attempt to draw).
10734 Draw(3, 1, 0, 0);
10735
10736 // Finalize recording of the command buffer
10737 EndCommandBuffer();
10738
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010739 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010740
Chia-I Wuf7458c52015-10-26 21:10:41 +080010741 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10742 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10743 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010744}
Mark Young29927482016-05-04 14:38:51 -060010745
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010746TEST_F(VkLayerTest, RenderPassIncompatible) {
10747 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
10748 "Initial case is drawing with an active renderpass that's "
10749 "not compatible with the bound PSO's creation renderpass");
10750 VkResult err;
10751
10752 ASSERT_NO_FATAL_FAILURE(InitState());
10753 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10754
10755 VkDescriptorSetLayoutBinding dsl_binding = {};
10756 dsl_binding.binding = 0;
10757 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10758 dsl_binding.descriptorCount = 1;
10759 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10760 dsl_binding.pImmutableSamplers = NULL;
10761
10762 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10763 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10764 ds_layout_ci.pNext = NULL;
10765 ds_layout_ci.bindingCount = 1;
10766 ds_layout_ci.pBindings = &dsl_binding;
10767
10768 VkDescriptorSetLayout ds_layout;
10769 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10770 &ds_layout);
10771 ASSERT_VK_SUCCESS(err);
10772
10773 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10774 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10775 pipeline_layout_ci.pNext = NULL;
10776 pipeline_layout_ci.setLayoutCount = 1;
10777 pipeline_layout_ci.pSetLayouts = &ds_layout;
10778
10779 VkPipelineLayout pipeline_layout;
10780 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
10781 &pipeline_layout);
10782 ASSERT_VK_SUCCESS(err);
10783
10784 VkShaderObj vs(m_device, bindStateVertShaderText,
10785 VK_SHADER_STAGE_VERTEX_BIT, this);
10786 VkShaderObj fs(m_device, bindStateFragShaderText,
10787 VK_SHADER_STAGE_FRAGMENT_BIT,
10788 this); // We shouldn't need a fragment shader
10789 // but add it to be able to run on more devices
10790 // Create a renderpass that will be incompatible with default renderpass
10791 VkAttachmentReference attach = {};
10792 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
10793 VkAttachmentReference color_att = {};
10794 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10795 VkSubpassDescription subpass = {};
10796 subpass.inputAttachmentCount = 1;
10797 subpass.pInputAttachments = &attach;
10798 subpass.colorAttachmentCount = 1;
10799 subpass.pColorAttachments = &color_att;
10800 VkRenderPassCreateInfo rpci = {};
10801 rpci.subpassCount = 1;
10802 rpci.pSubpasses = &subpass;
10803 rpci.attachmentCount = 1;
10804 VkAttachmentDescription attach_desc = {};
10805 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060010806 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
10807 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010808 rpci.pAttachments = &attach_desc;
10809 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
10810 VkRenderPass rp;
10811 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10812 VkPipelineObj pipe(m_device);
10813 pipe.AddShader(&vs);
10814 pipe.AddShader(&fs);
10815 pipe.AddColorAttachment();
10816 VkViewport view_port = {};
10817 m_viewports.push_back(view_port);
10818 pipe.SetViewport(m_viewports);
10819 VkRect2D rect = {};
10820 m_scissors.push_back(rect);
10821 pipe.SetScissor(m_scissors);
10822 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10823
10824 VkCommandBufferInheritanceInfo cbii = {};
10825 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
10826 cbii.renderPass = rp;
10827 cbii.subpass = 0;
10828 VkCommandBufferBeginInfo cbbi = {};
10829 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
10830 cbbi.pInheritanceInfo = &cbii;
10831 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
10832 VkRenderPassBeginInfo rpbi = {};
10833 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
10834 rpbi.framebuffer = m_framebuffer;
10835 rpbi.renderPass = rp;
10836 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi,
10837 VK_SUBPASS_CONTENTS_INLINE);
10838 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10839 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
10840
10841 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10842 " is incompatible w/ gfx pipeline ");
10843 // Render triangle (the error should trigger on the attempt to draw).
10844 Draw(3, 1, 0, 0);
10845
10846 // Finalize recording of the command buffer
10847 EndCommandBuffer();
10848
10849 m_errorMonitor->VerifyFound();
10850
10851 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10852 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10853 vkDestroyRenderPass(m_device->device(), rp, NULL);
10854}
10855
Mark Youngc89c6312016-03-31 16:03:20 -060010856TEST_F(VkLayerTest, NumBlendAttachMismatch) {
10857 // Create Pipeline where the number of blend attachments doesn't match the
10858 // number of color attachments. In this case, we don't add any color
10859 // blend attachments even though we have a color attachment.
10860 VkResult err;
10861
10862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -060010863 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060010864
10865 ASSERT_NO_FATAL_FAILURE(InitState());
10866 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10867 VkDescriptorPoolSize ds_type_count = {};
10868 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10869 ds_type_count.descriptorCount = 1;
10870
10871 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10872 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10873 ds_pool_ci.pNext = NULL;
10874 ds_pool_ci.maxSets = 1;
10875 ds_pool_ci.poolSizeCount = 1;
10876 ds_pool_ci.pPoolSizes = &ds_type_count;
10877
10878 VkDescriptorPool ds_pool;
10879 err =
10880 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10881 ASSERT_VK_SUCCESS(err);
10882
10883 VkDescriptorSetLayoutBinding dsl_binding = {};
10884 dsl_binding.binding = 0;
10885 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10886 dsl_binding.descriptorCount = 1;
10887 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10888 dsl_binding.pImmutableSamplers = NULL;
10889
10890 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10891 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10892 ds_layout_ci.pNext = NULL;
10893 ds_layout_ci.bindingCount = 1;
10894 ds_layout_ci.pBindings = &dsl_binding;
10895
10896 VkDescriptorSetLayout ds_layout;
10897 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10898 &ds_layout);
10899 ASSERT_VK_SUCCESS(err);
10900
10901 VkDescriptorSet descriptorSet;
10902 VkDescriptorSetAllocateInfo alloc_info = {};
10903 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10904 alloc_info.descriptorSetCount = 1;
10905 alloc_info.descriptorPool = ds_pool;
10906 alloc_info.pSetLayouts = &ds_layout;
10907 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10908 &descriptorSet);
10909 ASSERT_VK_SUCCESS(err);
10910
10911 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
10912 pipe_ms_state_ci.sType =
10913 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
10914 pipe_ms_state_ci.pNext = NULL;
10915 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10916 pipe_ms_state_ci.sampleShadingEnable = 0;
10917 pipe_ms_state_ci.minSampleShading = 1.0;
10918 pipe_ms_state_ci.pSampleMask = NULL;
10919
10920 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10921 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10922 pipeline_layout_ci.pNext = NULL;
10923 pipeline_layout_ci.setLayoutCount = 1;
10924 pipeline_layout_ci.pSetLayouts = &ds_layout;
10925
10926 VkPipelineLayout pipeline_layout;
10927 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
10928 &pipeline_layout);
10929 ASSERT_VK_SUCCESS(err);
10930
10931 VkShaderObj vs(m_device, bindStateVertShaderText,
10932 VK_SHADER_STAGE_VERTEX_BIT, this);
10933 VkShaderObj fs(m_device, bindStateFragShaderText,
10934 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060010935 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -060010936 // but add it to be able to run on more devices
10937 VkPipelineObj pipe(m_device);
10938 pipe.AddShader(&vs);
10939 pipe.AddShader(&fs);
10940 pipe.SetMSAA(&pipe_ms_state_ci);
10941 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10942
10943 BeginCommandBuffer();
10944 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10945 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
10946
Mark Young29927482016-05-04 14:38:51 -060010947 // Render triangle (the error should trigger on the attempt to draw).
10948 Draw(3, 1, 0, 0);
10949
10950 // Finalize recording of the command buffer
10951 EndCommandBuffer();
10952
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010953 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060010954
10955 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10956 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10957 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10958}
Mark Young29927482016-05-04 14:38:51 -060010959
Mark Muellerd4914412016-06-13 17:52:06 -060010960TEST_F(VkLayerTest, MissingClearAttachment) {
10961 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
10962 "structure passed to vkCmdClearAttachments");
10963 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10964 "vkCmdClearAttachments() attachment index 1 not found in attachment "
10965 "reference array of active subpass 0");
10966
10967 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
10968 m_errorMonitor->VerifyFound();
10969}
10970
Karl Schultz6addd812016-02-02 17:17:23 -070010971TEST_F(VkLayerTest, ClearCmdNoDraw) {
10972 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
10973 // to issuing a Draw
10974 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010975
Karl Schultz6addd812016-02-02 17:17:23 -070010976 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -070010977 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010978 "vkCmdClearAttachments() issued on CB object ");
10979
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010980 ASSERT_NO_FATAL_FAILURE(InitState());
10981 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010982
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010983 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010984 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10985 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010986
10987 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010988 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10989 ds_pool_ci.pNext = NULL;
10990 ds_pool_ci.maxSets = 1;
10991 ds_pool_ci.poolSizeCount = 1;
10992 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010993
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010994 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010995 err =
10996 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010997 ASSERT_VK_SUCCESS(err);
10998
Tony Barboureb254902015-07-15 12:50:33 -060010999 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011000 dsl_binding.binding = 0;
11001 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11002 dsl_binding.descriptorCount = 1;
11003 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11004 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011005
Tony Barboureb254902015-07-15 12:50:33 -060011006 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011007 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11008 ds_layout_ci.pNext = NULL;
11009 ds_layout_ci.bindingCount = 1;
11010 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011011
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011012 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011013 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11014 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011015 ASSERT_VK_SUCCESS(err);
11016
11017 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011018 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011019 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011020 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011021 alloc_info.descriptorPool = ds_pool;
11022 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011023 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11024 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011025 ASSERT_VK_SUCCESS(err);
11026
Tony Barboureb254902015-07-15 12:50:33 -060011027 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011028 pipe_ms_state_ci.sType =
11029 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11030 pipe_ms_state_ci.pNext = NULL;
11031 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11032 pipe_ms_state_ci.sampleShadingEnable = 0;
11033 pipe_ms_state_ci.minSampleShading = 1.0;
11034 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011035
Tony Barboureb254902015-07-15 12:50:33 -060011036 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011037 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11038 pipeline_layout_ci.pNext = NULL;
11039 pipeline_layout_ci.setLayoutCount = 1;
11040 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011041
11042 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011043 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11044 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011045 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011046
Karl Schultz6addd812016-02-02 17:17:23 -070011047 VkShaderObj vs(m_device, bindStateVertShaderText,
11048 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011049 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011050 // on more devices
11051 VkShaderObj fs(m_device, bindStateFragShaderText,
11052 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011053
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011054 VkPipelineObj pipe(m_device);
11055 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011056 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011057 pipe.SetMSAA(&pipe_ms_state_ci);
11058 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011059
11060 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011061
Karl Schultz6addd812016-02-02 17:17:23 -070011062 // Main thing we care about for this test is that the VkImage obj we're
11063 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011064 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011065 VkClearAttachment color_attachment;
11066 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11067 color_attachment.clearValue.color.float32[0] = 1.0;
11068 color_attachment.clearValue.color.float32[1] = 1.0;
11069 color_attachment.clearValue.color.float32[2] = 1.0;
11070 color_attachment.clearValue.color.float32[3] = 1.0;
11071 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011072 VkClearRect clear_rect = {
11073 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011074
Karl Schultz6addd812016-02-02 17:17:23 -070011075 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
11076 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011077
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011078 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011079
Chia-I Wuf7458c52015-10-26 21:10:41 +080011080 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11081 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11082 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011083}
11084
Karl Schultz6addd812016-02-02 17:17:23 -070011085TEST_F(VkLayerTest, VtxBufferBadIndex) {
11086 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011087
Karl Schultz6addd812016-02-02 17:17:23 -070011088 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070011089 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -070011090 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011091
Tobin Ehlis502480b2015-06-24 15:53:07 -060011092 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011093 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011094 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011095
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011096 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011097 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11098 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011099
11100 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011101 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11102 ds_pool_ci.pNext = NULL;
11103 ds_pool_ci.maxSets = 1;
11104 ds_pool_ci.poolSizeCount = 1;
11105 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011106
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011107 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011108 err =
11109 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011110 ASSERT_VK_SUCCESS(err);
11111
Tony Barboureb254902015-07-15 12:50:33 -060011112 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011113 dsl_binding.binding = 0;
11114 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11115 dsl_binding.descriptorCount = 1;
11116 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11117 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011118
Tony Barboureb254902015-07-15 12:50:33 -060011119 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011120 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11121 ds_layout_ci.pNext = NULL;
11122 ds_layout_ci.bindingCount = 1;
11123 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011124
Tobin Ehlis502480b2015-06-24 15:53:07 -060011125 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011126 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11127 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011128 ASSERT_VK_SUCCESS(err);
11129
11130 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011131 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011132 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011133 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011134 alloc_info.descriptorPool = ds_pool;
11135 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011136 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11137 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011138 ASSERT_VK_SUCCESS(err);
11139
Tony Barboureb254902015-07-15 12:50:33 -060011140 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011141 pipe_ms_state_ci.sType =
11142 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11143 pipe_ms_state_ci.pNext = NULL;
11144 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11145 pipe_ms_state_ci.sampleShadingEnable = 0;
11146 pipe_ms_state_ci.minSampleShading = 1.0;
11147 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011148
Tony Barboureb254902015-07-15 12:50:33 -060011149 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011150 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11151 pipeline_layout_ci.pNext = NULL;
11152 pipeline_layout_ci.setLayoutCount = 1;
11153 pipeline_layout_ci.pSetLayouts = &ds_layout;
11154 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011155
Karl Schultz6addd812016-02-02 17:17:23 -070011156 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11157 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011158 ASSERT_VK_SUCCESS(err);
11159
Karl Schultz6addd812016-02-02 17:17:23 -070011160 VkShaderObj vs(m_device, bindStateVertShaderText,
11161 VK_SHADER_STAGE_VERTEX_BIT, this);
11162 VkShaderObj fs(m_device, bindStateFragShaderText,
11163 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011164 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011165 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011166 VkPipelineObj pipe(m_device);
11167 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011168 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011169 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011170 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011171 pipe.SetViewport(m_viewports);
11172 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011173 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011174
11175 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011176 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11177 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011178 // Don't care about actual data, just need to get to draw to flag error
11179 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -070011180 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
11181 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011182 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011183 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011184
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011185 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011186
Chia-I Wuf7458c52015-10-26 21:10:41 +080011187 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11188 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11189 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011190}
Mark Muellerdfe37552016-07-07 14:47:42 -060011191
11192TEST_F(VkLayerTest, VertexBufferInvalid) {
11193 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
11194 "delete a buffer twice, use an invalid offset for each "
11195 "buffer type, and attempt to bind a null buffer");
11196
11197 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
11198 "using deleted buffer ";
11199 const char *double_destroy_message = "Cannot free buffer 0x";
11200 const char *invalid_offset_message = "vkBindBufferMemory(): "
11201 "memoryOffset is 0x";
11202 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
11203 "storage memoryOffset "
11204 "is 0x";
11205 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
11206 "texel memoryOffset "
11207 "is 0x";
11208 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
11209 "uniform memoryOffset "
11210 "is 0x";
11211 const char *bind_null_buffer_message = "In vkBindBufferMemory, attempting"
11212 " to Bind Obj(0x";
11213 const char *free_invalid_buffer_message = "Request to delete memory "
11214 "object 0x";
11215
11216 ASSERT_NO_FATAL_FAILURE(InitState());
11217 ASSERT_NO_FATAL_FAILURE(InitViewport());
11218 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11219
11220 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11221 pipe_ms_state_ci.sType =
11222 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11223 pipe_ms_state_ci.pNext = NULL;
11224 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11225 pipe_ms_state_ci.sampleShadingEnable = 0;
11226 pipe_ms_state_ci.minSampleShading = 1.0;
11227 pipe_ms_state_ci.pSampleMask = nullptr;
11228
11229 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11230 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11231 VkPipelineLayout pipeline_layout;
11232
11233 VkResult err = vkCreatePipelineLayout(m_device->device(),
11234 &pipeline_layout_ci, nullptr,
11235 &pipeline_layout);
11236 ASSERT_VK_SUCCESS(err);
11237
11238 VkShaderObj vs(m_device, bindStateVertShaderText,
11239 VK_SHADER_STAGE_VERTEX_BIT, this);
11240 VkShaderObj fs(m_device, bindStateFragShaderText,
11241 VK_SHADER_STAGE_FRAGMENT_BIT,
11242 this);
11243 VkPipelineObj pipe(m_device);
11244 pipe.AddShader(&vs);
11245 pipe.AddShader(&fs);
11246 pipe.AddColorAttachment();
11247 pipe.SetMSAA(&pipe_ms_state_ci);
11248 pipe.SetViewport(m_viewports);
11249 pipe.SetScissor(m_scissors);
11250 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11251
11252 BeginCommandBuffer();
11253 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11254 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11255
11256 {
11257 // Create and bind a vertex buffer in a reduced scope, which will cause
11258 // it to be deleted upon leaving this scope
11259 const float vbo_data[3] = {1.f, 0.f, 1.f};
11260 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data),
11261 3, vbo_data);
11262 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11263 draw_verticies.AddVertexInputToPipe(pipe);
11264 }
11265
11266 Draw(1, 0, 0, 0);
11267
11268 EndCommandBuffer();
11269
11270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11271 deleted_buffer_in_command_buffer);
11272 QueueCommandBuffer(false);
11273 m_errorMonitor->VerifyFound();
11274
11275 {
11276 // Create and bind a vertex buffer in a reduced scope, and delete it
11277 // twice, the second through the destructor
11278 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11279 VkBufferTest::eDoubleDelete);
11280 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11281 double_destroy_message);
11282 buffer_test.TestDoubleDestroy();
11283 }
11284 m_errorMonitor->VerifyFound();
11285
11286 if (VkBufferTest::
11287 GetTestConditionValid(m_device,
11288 VkBufferTest::eInvalidMemoryOffset)) {
11289 // Create and bind a memory buffer with an invalid offset.
11290 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11291 invalid_offset_message);
11292 VkBufferTest buffer_test(m_device,
11293 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
11294 VkBufferTest::eInvalidMemoryOffset);
11295 (void) buffer_test;
11296 m_errorMonitor->VerifyFound();
11297 }
11298
11299 if (VkBufferTest::
11300 GetTestConditionValid(m_device,
11301 VkBufferTest::eInvalidDeviceOffset,
11302 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
11303 // Create and bind a memory buffer with an invalid offset again,
11304 // but look for a texel buffer message.
11305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11306 invalid_texel_buffer_offset_message);
11307 VkBufferTest buffer_test(m_device,
11308 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
11309 VkBufferTest::eInvalidDeviceOffset);
11310 (void) buffer_test;
11311 m_errorMonitor->VerifyFound();
11312 }
11313
11314 if (VkBufferTest::
11315 GetTestConditionValid(m_device,
11316 VkBufferTest::eInvalidDeviceOffset,
11317 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
11318 // Create and bind a memory buffer with an invalid offset again, but
11319 // look for a uniform buffer message.
11320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11321 invalid_uniform_buffer_offset_message);
11322 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
11323 VkBufferTest::eInvalidDeviceOffset);
11324 (void) buffer_test;
11325 m_errorMonitor->VerifyFound();
11326 }
11327
11328 if (VkBufferTest::
11329 GetTestConditionValid(m_device,
11330 VkBufferTest::eInvalidDeviceOffset,
11331 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
11332 // Create and bind a memory buffer with an invalid offset again, but
11333 // look for a storage buffer message.
11334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11335 invalid_storage_buffer_offset_message);
11336 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11337 VkBufferTest::eInvalidDeviceOffset);
11338 (void) buffer_test;
11339 m_errorMonitor->VerifyFound();
11340 }
11341
11342 {
11343 // Attempt to bind a null buffer.
11344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11345 bind_null_buffer_message);
11346 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11347 VkBufferTest::eBindNullBuffer);
11348 (void) buffer_test;
11349 m_errorMonitor->VerifyFound();
11350 }
11351
11352 {
11353 // Attempt to use an invalid handle to delete a buffer.
11354 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11355 free_invalid_buffer_message);
11356 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11357 VkBufferTest::eFreeInvalidHandle);
11358 (void) buffer_test;
11359 }
11360 m_errorMonitor->VerifyFound();
11361
11362 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11363}
11364
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011365// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11366TEST_F(VkLayerTest, InvalidImageLayout) {
11367 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
11368 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11369 "images in the wrong layout when they're copied or transitioned.");
11370 // 3 in ValidateCmdBufImageLayouts
11371 // * -1 Attempt to submit cmd buf w/ deleted image
11372 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11373 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
11374 m_errorMonitor->SetDesiredFailureMsg(
11375 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11376 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11377
11378 ASSERT_NO_FATAL_FAILURE(InitState());
11379 // Create src & dst images to use for copy operations
11380 VkImage src_image;
11381 VkImage dst_image;
11382
11383 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11384 const int32_t tex_width = 32;
11385 const int32_t tex_height = 32;
11386
11387 VkImageCreateInfo image_create_info = {};
11388 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11389 image_create_info.pNext = NULL;
11390 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11391 image_create_info.format = tex_format;
11392 image_create_info.extent.width = tex_width;
11393 image_create_info.extent.height = tex_height;
11394 image_create_info.extent.depth = 1;
11395 image_create_info.mipLevels = 1;
11396 image_create_info.arrayLayers = 4;
11397 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11398 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11399 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11400 image_create_info.flags = 0;
11401
11402 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11403 ASSERT_VK_SUCCESS(err);
11404 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11405 ASSERT_VK_SUCCESS(err);
11406
11407 BeginCommandBuffer();
11408 VkImageCopy copyRegion;
11409 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11410 copyRegion.srcSubresource.mipLevel = 0;
11411 copyRegion.srcSubresource.baseArrayLayer = 0;
11412 copyRegion.srcSubresource.layerCount = 1;
11413 copyRegion.srcOffset.x = 0;
11414 copyRegion.srcOffset.y = 0;
11415 copyRegion.srcOffset.z = 0;
11416 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11417 copyRegion.dstSubresource.mipLevel = 0;
11418 copyRegion.dstSubresource.baseArrayLayer = 0;
11419 copyRegion.dstSubresource.layerCount = 1;
11420 copyRegion.dstOffset.x = 0;
11421 copyRegion.dstOffset.y = 0;
11422 copyRegion.dstOffset.z = 0;
11423 copyRegion.extent.width = 1;
11424 copyRegion.extent.height = 1;
11425 copyRegion.extent.depth = 1;
11426 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11427 m_errorMonitor->VerifyFound();
11428 // Now cause error due to src image layout changing
11429 m_errorMonitor->SetDesiredFailureMsg(
11430 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11431 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
11432 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11433 m_errorMonitor->VerifyFound();
11434 // Final src error is due to bad layout type
11435 m_errorMonitor->SetDesiredFailureMsg(
11436 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11437 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
11438 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11439 m_errorMonitor->VerifyFound();
11440 // Now verify same checks for dst
11441 m_errorMonitor->SetDesiredFailureMsg(
11442 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11443 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
11444 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11445 m_errorMonitor->VerifyFound();
11446 // Now cause error due to src image layout changing
11447 m_errorMonitor->SetDesiredFailureMsg(
11448 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11449 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
11450 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
11451 m_errorMonitor->VerifyFound();
11452 m_errorMonitor->SetDesiredFailureMsg(
11453 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11454 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
11455 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
11456 m_errorMonitor->VerifyFound();
11457 // Now cause error due to bad image layout transition in PipelineBarrier
11458 VkImageMemoryBarrier image_barrier[1] = {};
11459 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11460 image_barrier[0].image = src_image;
11461 image_barrier[0].subresourceRange.layerCount = 2;
11462 image_barrier[0].subresourceRange.levelCount = 2;
11463 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11464 m_errorMonitor->SetDesiredFailureMsg(
11465 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11466 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
11467 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
11468 m_errorMonitor->VerifyFound();
11469
11470 // Finally some layout errors at RenderPass create time
11471 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11472 VkAttachmentReference attach = {};
11473 // perf warning for GENERAL layout w/ non-DS input attachment
11474 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11475 VkSubpassDescription subpass = {};
11476 subpass.inputAttachmentCount = 1;
11477 subpass.pInputAttachments = &attach;
11478 VkRenderPassCreateInfo rpci = {};
11479 rpci.subpassCount = 1;
11480 rpci.pSubpasses = &subpass;
11481 rpci.attachmentCount = 1;
11482 VkAttachmentDescription attach_desc = {};
11483 attach_desc.format = VK_FORMAT_UNDEFINED;
11484 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011485 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011486 VkRenderPass rp;
11487 m_errorMonitor->SetDesiredFailureMsg(
11488 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11489 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
11490 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11491 m_errorMonitor->VerifyFound();
11492 // error w/ non-general layout
11493 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11494
11495 m_errorMonitor->SetDesiredFailureMsg(
11496 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11497 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11498 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11499 m_errorMonitor->VerifyFound();
11500 subpass.inputAttachmentCount = 0;
11501 subpass.colorAttachmentCount = 1;
11502 subpass.pColorAttachments = &attach;
11503 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11504 // perf warning for GENERAL layout on color attachment
11505 m_errorMonitor->SetDesiredFailureMsg(
11506 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11507 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
11508 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11509 m_errorMonitor->VerifyFound();
11510 // error w/ non-color opt or GENERAL layout for color attachment
11511 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11512 m_errorMonitor->SetDesiredFailureMsg(
11513 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11514 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11515 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11516 m_errorMonitor->VerifyFound();
11517 subpass.colorAttachmentCount = 0;
11518 subpass.pDepthStencilAttachment = &attach;
11519 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11520 // perf warning for GENERAL layout on DS attachment
11521 m_errorMonitor->SetDesiredFailureMsg(
11522 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11523 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
11524 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11525 m_errorMonitor->VerifyFound();
11526 // error w/ non-ds opt or GENERAL layout for color attachment
11527 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11528 m_errorMonitor->SetDesiredFailureMsg(
11529 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11530 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
11531 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11532 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060011533 // For this error we need a valid renderpass so create default one
11534 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11535 attach.attachment = 0;
11536 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
11537 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
11538 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
11539 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
11540 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
11541 // Can't do a CLEAR load on READ_ONLY initialLayout
11542 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
11543 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11544 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11545 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11546 " with invalid first layout "
11547 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
11548 "ONLY_OPTIMAL");
11549 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11550 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011551
11552 vkDestroyImage(m_device->device(), src_image, NULL);
11553 vkDestroyImage(m_device->device(), dst_image, NULL);
11554}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011555#endif // DRAW_STATE_TESTS
11556
Tobin Ehlis0788f522015-05-26 16:11:58 -060011557#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060011558#if GTEST_IS_THREADSAFE
11559struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011560 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011561 VkEvent event;
11562 bool bailout;
11563};
11564
Karl Schultz6addd812016-02-02 17:17:23 -070011565extern "C" void *AddToCommandBuffer(void *arg) {
11566 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011567
Karl Schultz6addd812016-02-02 17:17:23 -070011568 for (int i = 0; i < 10000; i++) {
11569 vkCmdSetEvent(data->commandBuffer, data->event,
11570 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011571 if (data->bailout) {
11572 break;
11573 }
11574 }
11575 return NULL;
11576}
11577
Karl Schultz6addd812016-02-02 17:17:23 -070011578TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011579 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011580
Karl Schultz6addd812016-02-02 17:17:23 -070011581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11582 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011583
Mike Stroyanaccf7692015-05-12 16:00:45 -060011584 ASSERT_NO_FATAL_FAILURE(InitState());
11585 ASSERT_NO_FATAL_FAILURE(InitViewport());
11586 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11587
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011588 // Calls AllocateCommandBuffers
11589 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060011590
11591 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011592 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011593
11594 VkEventCreateInfo event_info;
11595 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011596 VkResult err;
11597
11598 memset(&event_info, 0, sizeof(event_info));
11599 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11600
Chia-I Wuf7458c52015-10-26 21:10:41 +080011601 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011602 ASSERT_VK_SUCCESS(err);
11603
Mike Stroyanaccf7692015-05-12 16:00:45 -060011604 err = vkResetEvent(device(), event);
11605 ASSERT_VK_SUCCESS(err);
11606
11607 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011608 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011609 data.event = event;
11610 data.bailout = false;
11611 m_errorMonitor->SetBailout(&data.bailout);
11612 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011613 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011614 // Add many entries to command buffer from this thread at the same time.
11615 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060011616
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011617 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011618 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011619
Mike Stroyan10b8cb72016-01-22 15:22:03 -070011620 m_errorMonitor->SetBailout(NULL);
11621
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011622 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011623
Chia-I Wuf7458c52015-10-26 21:10:41 +080011624 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011625}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011626#endif // GTEST_IS_THREADSAFE
11627#endif // THREADING_TESTS
11628
Chris Forbes9f7ff632015-05-25 11:13:08 +120011629#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070011630TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011631 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011632 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011633
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011634 ASSERT_NO_FATAL_FAILURE(InitState());
11635 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11636
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011637 VkShaderModule module;
11638 VkShaderModuleCreateInfo moduleCreateInfo;
11639 struct icd_spv_header spv;
11640
11641 spv.magic = ICD_SPV_MAGIC;
11642 spv.version = ICD_SPV_VERSION;
11643 spv.gen_magic = 0;
11644
11645 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
11646 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070011647 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011648 moduleCreateInfo.codeSize = 4;
11649 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011650 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011651
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011652 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011653}
11654
Karl Schultz6addd812016-02-02 17:17:23 -070011655TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011657 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011658
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011659 ASSERT_NO_FATAL_FAILURE(InitState());
11660 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11661
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011662 VkShaderModule module;
11663 VkShaderModuleCreateInfo moduleCreateInfo;
11664 struct icd_spv_header spv;
11665
11666 spv.magic = ~ICD_SPV_MAGIC;
11667 spv.version = ICD_SPV_VERSION;
11668 spv.gen_magic = 0;
11669
11670 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
11671 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070011672 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011673 moduleCreateInfo.codeSize = sizeof(spv) + 10;
11674 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011675 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011676
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011677 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011678}
11679
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011680#if 0
11681// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070011682TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011684 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011685
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011686 ASSERT_NO_FATAL_FAILURE(InitState());
11687 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11688
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011689 VkShaderModule module;
11690 VkShaderModuleCreateInfo moduleCreateInfo;
11691 struct icd_spv_header spv;
11692
11693 spv.magic = ICD_SPV_MAGIC;
11694 spv.version = ~ICD_SPV_VERSION;
11695 spv.gen_magic = 0;
11696
11697 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
11698 moduleCreateInfo.pNext = NULL;
11699
Karl Schultz6addd812016-02-02 17:17:23 -070011700 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011701 moduleCreateInfo.codeSize = sizeof(spv) + 10;
11702 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011703 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011704
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011705 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011706}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011707#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011708
Karl Schultz6addd812016-02-02 17:17:23 -070011709TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070011710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011711 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011712
Chris Forbes9f7ff632015-05-25 11:13:08 +120011713 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060011714 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120011715
11716 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011717 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120011718 "\n"
11719 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070011720 "out gl_PerVertex {\n"
11721 " vec4 gl_Position;\n"
11722 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120011723 "void main(){\n"
11724 " gl_Position = vec4(1);\n"
11725 " x = 0;\n"
11726 "}\n";
11727 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011728 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120011729 "\n"
11730 "layout(location=0) out vec4 color;\n"
11731 "void main(){\n"
11732 " color = vec4(1);\n"
11733 "}\n";
11734
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060011735 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11736 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120011737
11738 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080011739 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120011740 pipe.AddShader(&vs);
11741 pipe.AddShader(&fs);
11742
Chris Forbes9f7ff632015-05-25 11:13:08 +120011743 VkDescriptorSetObj descriptorSet(m_device);
11744 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011745 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120011746
Tony Barbour5781e8f2015-08-04 16:23:11 -060011747 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120011748
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011749 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120011750}
Chris Forbes9f7ff632015-05-25 11:13:08 +120011751
Karl Schultz6addd812016-02-02 17:17:23 -070011752TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011754 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011755
Chris Forbes59cb88d2015-05-25 11:13:13 +120011756 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060011757 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120011758
11759 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011760 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120011761 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070011762 "out gl_PerVertex {\n"
11763 " vec4 gl_Position;\n"
11764 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120011765 "void main(){\n"
11766 " gl_Position = vec4(1);\n"
11767 "}\n";
11768 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011769 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120011770 "\n"
11771 "layout(location=0) in float x;\n"
11772 "layout(location=0) out vec4 color;\n"
11773 "void main(){\n"
11774 " color = vec4(x);\n"
11775 "}\n";
11776
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060011777 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11778 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120011779
11780 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080011781 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120011782 pipe.AddShader(&vs);
11783 pipe.AddShader(&fs);
11784
Chris Forbes59cb88d2015-05-25 11:13:13 +120011785 VkDescriptorSetObj descriptorSet(m_device);
11786 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011787 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120011788
Tony Barbour5781e8f2015-08-04 16:23:11 -060011789 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120011790
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011791 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120011792}
11793
Karl Schultz6addd812016-02-02 17:17:23 -070011794TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +130011795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011796 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130011797
11798 ASSERT_NO_FATAL_FAILURE(InitState());
11799 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11800
11801 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011802 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130011803 "\n"
11804 "out gl_PerVertex {\n"
11805 " vec4 gl_Position;\n"
11806 "};\n"
11807 "void main(){\n"
11808 " gl_Position = vec4(1);\n"
11809 "}\n";
11810 char const *fsSource =
11811 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130011812 "\n"
11813 "in block { layout(location=0) float x; } ins;\n"
11814 "layout(location=0) out vec4 color;\n"
11815 "void main(){\n"
11816 " color = vec4(ins.x);\n"
11817 "}\n";
11818
11819 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11820 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11821
11822 VkPipelineObj pipe(m_device);
11823 pipe.AddColorAttachment();
11824 pipe.AddShader(&vs);
11825 pipe.AddShader(&fs);
11826
11827 VkDescriptorSetObj descriptorSet(m_device);
11828 descriptorSet.AppendDummy();
11829 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11830
11831 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11832
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011833 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130011834}
11835
Karl Schultz6addd812016-02-02 17:17:23 -070011836TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +130011837 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +130011838 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -070011839 "output arr[2] of float32' vs 'ptr to "
11840 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130011841
11842 ASSERT_NO_FATAL_FAILURE(InitState());
11843 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11844
11845 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011846 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130011847 "\n"
11848 "layout(location=0) out float x[2];\n"
11849 "out gl_PerVertex {\n"
11850 " vec4 gl_Position;\n"
11851 "};\n"
11852 "void main(){\n"
11853 " x[0] = 0; x[1] = 0;\n"
11854 " gl_Position = vec4(1);\n"
11855 "}\n";
11856 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011857 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130011858 "\n"
11859 "layout(location=0) in float x[3];\n"
11860 "layout(location=0) out vec4 color;\n"
11861 "void main(){\n"
11862 " color = vec4(x[0] + x[1] + x[2]);\n"
11863 "}\n";
11864
11865 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11866 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11867
11868 VkPipelineObj pipe(m_device);
11869 pipe.AddColorAttachment();
11870 pipe.AddShader(&vs);
11871 pipe.AddShader(&fs);
11872
11873 VkDescriptorSetObj descriptorSet(m_device);
11874 descriptorSet.AppendDummy();
11875 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11876
11877 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11878
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011879 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130011880}
11881
Karl Schultz6addd812016-02-02 17:17:23 -070011882TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011884 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011885
Chris Forbesb56af562015-05-25 11:13:17 +120011886 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060011887 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120011888
11889 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011890 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120011891 "\n"
11892 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070011893 "out gl_PerVertex {\n"
11894 " vec4 gl_Position;\n"
11895 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +120011896 "void main(){\n"
11897 " x = 0;\n"
11898 " gl_Position = vec4(1);\n"
11899 "}\n";
11900 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011901 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120011902 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070011903 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +120011904 "layout(location=0) out vec4 color;\n"
11905 "void main(){\n"
11906 " color = vec4(x);\n"
11907 "}\n";
11908
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060011909 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11910 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120011911
11912 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080011913 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120011914 pipe.AddShader(&vs);
11915 pipe.AddShader(&fs);
11916
Chris Forbesb56af562015-05-25 11:13:17 +120011917 VkDescriptorSetObj descriptorSet(m_device);
11918 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011919 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120011920
Tony Barbour5781e8f2015-08-04 16:23:11 -060011921 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120011922
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011923 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120011924}
11925
Karl Schultz6addd812016-02-02 17:17:23 -070011926TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +130011927 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011928 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130011929
11930 ASSERT_NO_FATAL_FAILURE(InitState());
11931 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11932
11933 char const *vsSource =
11934 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130011935 "\n"
11936 "out block { layout(location=0) int x; } outs;\n"
11937 "out gl_PerVertex {\n"
11938 " vec4 gl_Position;\n"
11939 "};\n"
11940 "void main(){\n"
11941 " outs.x = 0;\n"
11942 " gl_Position = vec4(1);\n"
11943 "}\n";
11944 char const *fsSource =
11945 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130011946 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070011947 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +130011948 "layout(location=0) out vec4 color;\n"
11949 "void main(){\n"
11950 " color = vec4(ins.x);\n"
11951 "}\n";
11952
11953 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11954 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11955
11956 VkPipelineObj pipe(m_device);
11957 pipe.AddColorAttachment();
11958 pipe.AddShader(&vs);
11959 pipe.AddShader(&fs);
11960
11961 VkDescriptorSetObj descriptorSet(m_device);
11962 descriptorSet.AppendDummy();
11963 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11964
11965 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11966
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011967 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130011968}
11969
11970TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
11971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11972 "location 0.0 which is not written by vertex shader");
11973
11974 ASSERT_NO_FATAL_FAILURE(InitState());
11975 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11976
11977 char const *vsSource =
11978 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130011979 "\n"
11980 "out block { layout(location=1) float x; } outs;\n"
11981 "out gl_PerVertex {\n"
11982 " vec4 gl_Position;\n"
11983 "};\n"
11984 "void main(){\n"
11985 " outs.x = 0;\n"
11986 " gl_Position = vec4(1);\n"
11987 "}\n";
11988 char const *fsSource =
11989 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130011990 "\n"
11991 "in block { layout(location=0) float x; } ins;\n"
11992 "layout(location=0) out vec4 color;\n"
11993 "void main(){\n"
11994 " color = vec4(ins.x);\n"
11995 "}\n";
11996
11997 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11998 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11999
12000 VkPipelineObj pipe(m_device);
12001 pipe.AddColorAttachment();
12002 pipe.AddShader(&vs);
12003 pipe.AddShader(&fs);
12004
12005 VkDescriptorSetObj descriptorSet(m_device);
12006 descriptorSet.AppendDummy();
12007 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12008
12009 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12010
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012011 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012012}
12013
12014TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
12015 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12016 "location 0.1 which is not written by vertex shader");
12017
12018 ASSERT_NO_FATAL_FAILURE(InitState());
12019 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12020
12021 char const *vsSource =
12022 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012023 "\n"
12024 "out block { layout(location=0, component=0) float x; } outs;\n"
12025 "out gl_PerVertex {\n"
12026 " vec4 gl_Position;\n"
12027 "};\n"
12028 "void main(){\n"
12029 " outs.x = 0;\n"
12030 " gl_Position = vec4(1);\n"
12031 "}\n";
12032 char const *fsSource =
12033 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012034 "\n"
12035 "in block { layout(location=0, component=1) float x; } ins;\n"
12036 "layout(location=0) out vec4 color;\n"
12037 "void main(){\n"
12038 " color = vec4(ins.x);\n"
12039 "}\n";
12040
12041 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12042 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12043
12044 VkPipelineObj pipe(m_device);
12045 pipe.AddColorAttachment();
12046 pipe.AddShader(&vs);
12047 pipe.AddShader(&fs);
12048
12049 VkDescriptorSetObj descriptorSet(m_device);
12050 descriptorSet.AppendDummy();
12051 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12052
12053 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12054
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012055 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012056}
12057
Karl Schultz6addd812016-02-02 17:17:23 -070012058TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012060 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012061
Chris Forbesde136e02015-05-25 11:13:28 +120012062 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012063 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120012064
12065 VkVertexInputBindingDescription input_binding;
12066 memset(&input_binding, 0, sizeof(input_binding));
12067
12068 VkVertexInputAttributeDescription input_attrib;
12069 memset(&input_attrib, 0, sizeof(input_attrib));
12070 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12071
12072 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012073 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012074 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012075 "out gl_PerVertex {\n"
12076 " vec4 gl_Position;\n"
12077 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012078 "void main(){\n"
12079 " gl_Position = vec4(1);\n"
12080 "}\n";
12081 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012082 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012083 "\n"
12084 "layout(location=0) out vec4 color;\n"
12085 "void main(){\n"
12086 " color = vec4(1);\n"
12087 "}\n";
12088
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012089 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12090 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120012091
12092 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012093 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120012094 pipe.AddShader(&vs);
12095 pipe.AddShader(&fs);
12096
12097 pipe.AddVertexInputBindings(&input_binding, 1);
12098 pipe.AddVertexInputAttribs(&input_attrib, 1);
12099
Chris Forbesde136e02015-05-25 11:13:28 +120012100 VkDescriptorSetObj descriptorSet(m_device);
12101 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012102 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120012103
Tony Barbour5781e8f2015-08-04 16:23:11 -060012104 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120012105
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012106 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120012107}
12108
Karl Schultz6addd812016-02-02 17:17:23 -070012109TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012110 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012111 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +130012112
12113 ASSERT_NO_FATAL_FAILURE(InitState());
12114 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12115
12116 VkVertexInputBindingDescription input_binding;
12117 memset(&input_binding, 0, sizeof(input_binding));
12118
12119 VkVertexInputAttributeDescription input_attrib;
12120 memset(&input_attrib, 0, sizeof(input_attrib));
12121 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12122
12123 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012124 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130012125 "\n"
12126 "layout(location=1) in float x;\n"
12127 "out gl_PerVertex {\n"
12128 " vec4 gl_Position;\n"
12129 "};\n"
12130 "void main(){\n"
12131 " gl_Position = vec4(x);\n"
12132 "}\n";
12133 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012134 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130012135 "\n"
12136 "layout(location=0) out vec4 color;\n"
12137 "void main(){\n"
12138 " color = vec4(1);\n"
12139 "}\n";
12140
12141 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12142 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12143
12144 VkPipelineObj pipe(m_device);
12145 pipe.AddColorAttachment();
12146 pipe.AddShader(&vs);
12147 pipe.AddShader(&fs);
12148
12149 pipe.AddVertexInputBindings(&input_binding, 1);
12150 pipe.AddVertexInputAttribs(&input_attrib, 1);
12151
12152 VkDescriptorSetObj descriptorSet(m_device);
12153 descriptorSet.AppendDummy();
12154 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12155
12156 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12157
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012158 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130012159}
12160
Karl Schultz6addd812016-02-02 17:17:23 -070012161TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
12162 m_errorMonitor->SetDesiredFailureMsg(
12163 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012164 "VS consumes input at location 0 but not provided");
12165
Chris Forbes62e8e502015-05-25 11:13:29 +120012166 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012167 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120012168
12169 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012170 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012171 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012172 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -070012173 "out gl_PerVertex {\n"
12174 " vec4 gl_Position;\n"
12175 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012176 "void main(){\n"
12177 " gl_Position = x;\n"
12178 "}\n";
12179 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012180 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012181 "\n"
12182 "layout(location=0) out vec4 color;\n"
12183 "void main(){\n"
12184 " color = vec4(1);\n"
12185 "}\n";
12186
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012187 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12188 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120012189
12190 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012191 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120012192 pipe.AddShader(&vs);
12193 pipe.AddShader(&fs);
12194
Chris Forbes62e8e502015-05-25 11:13:29 +120012195 VkDescriptorSetObj descriptorSet(m_device);
12196 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012197 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120012198
Tony Barbour5781e8f2015-08-04 16:23:11 -060012199 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120012200
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012201 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120012202}
12203
Karl Schultz6addd812016-02-02 17:17:23 -070012204TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
12205 m_errorMonitor->SetDesiredFailureMsg(
12206 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012207 "location 0 does not match VS input type");
12208
Chris Forbesc97d98e2015-05-25 11:13:31 +120012209 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012210 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120012211
12212 VkVertexInputBindingDescription input_binding;
12213 memset(&input_binding, 0, sizeof(input_binding));
12214
12215 VkVertexInputAttributeDescription input_attrib;
12216 memset(&input_attrib, 0, sizeof(input_attrib));
12217 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12218
12219 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012220 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012221 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012222 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070012223 "out gl_PerVertex {\n"
12224 " vec4 gl_Position;\n"
12225 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012226 "void main(){\n"
12227 " gl_Position = vec4(x);\n"
12228 "}\n";
12229 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012230 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012231 "\n"
12232 "layout(location=0) out vec4 color;\n"
12233 "void main(){\n"
12234 " color = vec4(1);\n"
12235 "}\n";
12236
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012237 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12238 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120012239
12240 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012241 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120012242 pipe.AddShader(&vs);
12243 pipe.AddShader(&fs);
12244
12245 pipe.AddVertexInputBindings(&input_binding, 1);
12246 pipe.AddVertexInputAttribs(&input_attrib, 1);
12247
Chris Forbesc97d98e2015-05-25 11:13:31 +120012248 VkDescriptorSetObj descriptorSet(m_device);
12249 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012250 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120012251
Tony Barbour5781e8f2015-08-04 16:23:11 -060012252 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120012253
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012254 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120012255}
12256
Chris Forbesc68b43c2016-04-06 11:18:47 +120012257TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
12258 m_errorMonitor->SetDesiredFailureMsg(
12259 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12260 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
12261
12262 ASSERT_NO_FATAL_FAILURE(InitState());
12263 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12264
12265 char const *vsSource =
12266 "#version 450\n"
12267 "\n"
12268 "out gl_PerVertex {\n"
12269 " vec4 gl_Position;\n"
12270 "};\n"
12271 "void main(){\n"
12272 " gl_Position = vec4(1);\n"
12273 "}\n";
12274 char const *fsSource =
12275 "#version 450\n"
12276 "\n"
12277 "layout(location=0) out vec4 color;\n"
12278 "void main(){\n"
12279 " color = vec4(1);\n"
12280 "}\n";
12281
12282 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12283 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12284
12285 VkPipelineObj pipe(m_device);
12286 pipe.AddColorAttachment();
12287 pipe.AddShader(&vs);
12288 pipe.AddShader(&vs);
12289 pipe.AddShader(&fs);
12290
12291 VkDescriptorSetObj descriptorSet(m_device);
12292 descriptorSet.AppendDummy();
12293 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12294
12295 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12296
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012297 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120012298}
12299
Karl Schultz6addd812016-02-02 17:17:23 -070012300TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012301 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130012302
12303 ASSERT_NO_FATAL_FAILURE(InitState());
12304 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12305
12306 VkVertexInputBindingDescription input_binding;
12307 memset(&input_binding, 0, sizeof(input_binding));
12308
12309 VkVertexInputAttributeDescription input_attribs[2];
12310 memset(input_attribs, 0, sizeof(input_attribs));
12311
12312 for (int i = 0; i < 2; i++) {
12313 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12314 input_attribs[i].location = i;
12315 }
12316
12317 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012318 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012319 "\n"
12320 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012321 "out gl_PerVertex {\n"
12322 " vec4 gl_Position;\n"
12323 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012324 "void main(){\n"
12325 " gl_Position = x[0] + x[1];\n"
12326 "}\n";
12327 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012328 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012329 "\n"
12330 "layout(location=0) out vec4 color;\n"
12331 "void main(){\n"
12332 " color = vec4(1);\n"
12333 "}\n";
12334
12335 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12336 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12337
12338 VkPipelineObj pipe(m_device);
12339 pipe.AddColorAttachment();
12340 pipe.AddShader(&vs);
12341 pipe.AddShader(&fs);
12342
12343 pipe.AddVertexInputBindings(&input_binding, 1);
12344 pipe.AddVertexInputAttribs(input_attribs, 2);
12345
12346 VkDescriptorSetObj descriptorSet(m_device);
12347 descriptorSet.AppendDummy();
12348 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12349
12350 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12351
12352 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012353 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130012354}
12355
Chris Forbes2682b242015-11-24 11:13:14 +130012356TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
12357{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012358 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130012359
12360 ASSERT_NO_FATAL_FAILURE(InitState());
12361 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12362
12363 VkVertexInputBindingDescription input_binding;
12364 memset(&input_binding, 0, sizeof(input_binding));
12365
12366 VkVertexInputAttributeDescription input_attribs[2];
12367 memset(input_attribs, 0, sizeof(input_attribs));
12368
12369 for (int i = 0; i < 2; i++) {
12370 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12371 input_attribs[i].location = i;
12372 }
12373
12374 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012375 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012376 "\n"
12377 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -070012378 "out gl_PerVertex {\n"
12379 " vec4 gl_Position;\n"
12380 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012381 "void main(){\n"
12382 " gl_Position = x[0] + x[1];\n"
12383 "}\n";
12384 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012385 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012386 "\n"
12387 "layout(location=0) out vec4 color;\n"
12388 "void main(){\n"
12389 " color = vec4(1);\n"
12390 "}\n";
12391
12392 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12393 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12394
12395 VkPipelineObj pipe(m_device);
12396 pipe.AddColorAttachment();
12397 pipe.AddShader(&vs);
12398 pipe.AddShader(&fs);
12399
12400 pipe.AddVertexInputBindings(&input_binding, 1);
12401 pipe.AddVertexInputAttribs(input_attribs, 2);
12402
12403 VkDescriptorSetObj descriptorSet(m_device);
12404 descriptorSet.AppendDummy();
12405 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12406
12407 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12408
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012409 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130012410}
Chris Forbes2682b242015-11-24 11:13:14 +130012411
Chris Forbesbc290ce2016-07-06 12:01:49 +120012412TEST_F(VkLayerTest, CreatePipelineAttribComponents)
12413{
12414 m_errorMonitor->ExpectSuccess();
12415
12416 ASSERT_NO_FATAL_FAILURE(InitState());
12417 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12418
12419 VkVertexInputBindingDescription input_binding;
12420 memset(&input_binding, 0, sizeof(input_binding));
12421
12422 VkVertexInputAttributeDescription input_attribs[3];
12423 memset(input_attribs, 0, sizeof(input_attribs));
12424
12425 for (int i = 0; i < 3; i++) {
12426 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12427 input_attribs[i].location = i;
12428 }
12429
12430 char const *vsSource =
12431 "#version 450\n"
12432 "\n"
12433 "layout(location=0) in vec4 x;\n"
12434 "layout(location=1) in vec3 y1;\n"
12435 "layout(location=1, component=3) in float y2;\n"
12436 "layout(location=2) in vec4 z;\n"
12437 "out gl_PerVertex {\n"
12438 " vec4 gl_Position;\n"
12439 "};\n"
12440 "void main(){\n"
12441 " gl_Position = x + vec4(y1, y2) + z;\n"
12442 "}\n";
12443 char const *fsSource =
12444 "#version 450\n"
12445 "\n"
12446 "layout(location=0) out vec4 color;\n"
12447 "void main(){\n"
12448 " color = vec4(1);\n"
12449 "}\n";
12450
12451 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12452 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12453
12454 VkPipelineObj pipe(m_device);
12455 pipe.AddColorAttachment();
12456 pipe.AddShader(&vs);
12457 pipe.AddShader(&fs);
12458
12459 pipe.AddVertexInputBindings(&input_binding, 1);
12460 pipe.AddVertexInputAttribs(input_attribs, 3);
12461
12462 VkDescriptorSetObj descriptorSet(m_device);
12463 descriptorSet.AppendDummy();
12464 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12465
12466 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12467
12468 m_errorMonitor->VerifyNotFound();
12469}
12470
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012471TEST_F(VkLayerTest, CreatePipelineSimplePositive)
12472{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012473 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012474
12475 ASSERT_NO_FATAL_FAILURE(InitState());
12476 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12477
12478 char const *vsSource =
12479 "#version 450\n"
12480 "out gl_PerVertex {\n"
12481 " vec4 gl_Position;\n"
12482 "};\n"
12483 "void main(){\n"
12484 " gl_Position = vec4(0);\n"
12485 "}\n";
12486 char const *fsSource =
12487 "#version 450\n"
12488 "\n"
12489 "layout(location=0) out vec4 color;\n"
12490 "void main(){\n"
12491 " color = vec4(1);\n"
12492 "}\n";
12493
12494 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12495 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12496
12497 VkPipelineObj pipe(m_device);
12498 pipe.AddColorAttachment();
12499 pipe.AddShader(&vs);
12500 pipe.AddShader(&fs);
12501
12502 VkDescriptorSetObj descriptorSet(m_device);
12503 descriptorSet.AppendDummy();
12504 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12505
12506 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12507
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012508 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012509}
12510
Chris Forbes912c9192016-04-05 17:50:35 +120012511TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
12512{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012513 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +120012514
12515 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
12516
12517 ASSERT_NO_FATAL_FAILURE(InitState());
12518 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12519
12520 char const *vsSource =
12521 "#version 450\n"
12522 "out gl_PerVertex {\n"
12523 " vec4 gl_Position;\n"
12524 "};\n"
12525 "layout(location=0) out vec3 x;\n"
12526 "layout(location=1) out ivec3 y;\n"
12527 "layout(location=2) out vec3 z;\n"
12528 "void main(){\n"
12529 " gl_Position = vec4(0);\n"
12530 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
12531 "}\n";
12532 char const *fsSource =
12533 "#version 450\n"
12534 "\n"
12535 "layout(location=0) out vec4 color;\n"
12536 "layout(location=0) in float x;\n"
12537 "layout(location=1) flat in int y;\n"
12538 "layout(location=2) in vec2 z;\n"
12539 "void main(){\n"
12540 " color = vec4(1 + x + y + z.x);\n"
12541 "}\n";
12542
12543 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12544 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12545
12546 VkPipelineObj pipe(m_device);
12547 pipe.AddColorAttachment();
12548 pipe.AddShader(&vs);
12549 pipe.AddShader(&fs);
12550
12551 VkDescriptorSetObj descriptorSet(m_device);
12552 descriptorSet.AppendDummy();
12553 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12554
Mike Stroyan255e9582016-06-24 09:49:32 -060012555 VkResult err = VK_SUCCESS;
12556 err =
12557 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12558 ASSERT_VK_SUCCESS(err);
12559
Chris Forbes912c9192016-04-05 17:50:35 +120012560
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012561 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +120012562}
12563
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012564TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
12565{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012566 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012567
12568 ASSERT_NO_FATAL_FAILURE(InitState());
12569 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12570
Chris Forbesc1e852d2016-04-04 19:26:42 +120012571 if (!m_device->phy().features().tessellationShader) {
12572 printf("Device does not support tessellation shaders; skipped.\n");
12573 return;
12574 }
12575
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012576 char const *vsSource =
12577 "#version 450\n"
12578 "void main(){}\n";
12579 char const *tcsSource =
12580 "#version 450\n"
12581 "layout(location=0) out int x[];\n"
12582 "layout(vertices=3) out;\n"
12583 "void main(){\n"
12584 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
12585 " gl_TessLevelInner[0] = 1;\n"
12586 " x[gl_InvocationID] = gl_InvocationID;\n"
12587 "}\n";
12588 char const *tesSource =
12589 "#version 450\n"
12590 "layout(triangles, equal_spacing, cw) in;\n"
12591 "layout(location=0) in int x[];\n"
12592 "out gl_PerVertex { vec4 gl_Position; };\n"
12593 "void main(){\n"
12594 " gl_Position.xyz = gl_TessCoord;\n"
12595 " gl_Position.w = x[0] + x[1] + x[2];\n"
12596 "}\n";
12597 char const *fsSource =
12598 "#version 450\n"
12599 "layout(location=0) out vec4 color;\n"
12600 "void main(){\n"
12601 " color = vec4(1);\n"
12602 "}\n";
12603
12604 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12605 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
12606 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
12607 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12608
12609 VkPipelineInputAssemblyStateCreateInfo iasci{
12610 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
12611 nullptr,
12612 0,
12613 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
12614 VK_FALSE};
12615
Chris Forbesb4cacb62016-04-04 19:15:00 +120012616 VkPipelineTessellationStateCreateInfo tsci{
12617 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
12618 nullptr,
12619 0,
12620 3};
12621
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012622 VkPipelineObj pipe(m_device);
12623 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +120012624 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012625 pipe.AddColorAttachment();
12626 pipe.AddShader(&vs);
12627 pipe.AddShader(&tcs);
12628 pipe.AddShader(&tes);
12629 pipe.AddShader(&fs);
12630
12631 VkDescriptorSetObj descriptorSet(m_device);
12632 descriptorSet.AppendDummy();
12633 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12634
12635 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12636
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012637 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012638}
12639
Chris Forbesa0ab8152016-04-20 13:34:27 +120012640TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
12641{
12642 m_errorMonitor->ExpectSuccess();
12643
12644 ASSERT_NO_FATAL_FAILURE(InitState());
12645 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12646
12647 if (!m_device->phy().features().geometryShader) {
12648 printf("Device does not support geometry shaders; skipped.\n");
12649 return;
12650 }
12651
12652 char const *vsSource =
12653 "#version 450\n"
12654 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
12655 "void main(){\n"
12656 " vs_out.x = vec4(1);\n"
12657 "}\n";
12658 char const *gsSource =
12659 "#version 450\n"
12660 "layout(triangles) in;\n"
12661 "layout(triangle_strip, max_vertices=3) out;\n"
12662 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
12663 "out gl_PerVertex { vec4 gl_Position; };\n"
12664 "void main() {\n"
12665 " gl_Position = gs_in[0].x;\n"
12666 " EmitVertex();\n"
12667 "}\n";
12668 char const *fsSource =
12669 "#version 450\n"
12670 "layout(location=0) out vec4 color;\n"
12671 "void main(){\n"
12672 " color = vec4(1);\n"
12673 "}\n";
12674
12675 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12676 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
12677 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12678
12679 VkPipelineObj pipe(m_device);
12680 pipe.AddColorAttachment();
12681 pipe.AddShader(&vs);
12682 pipe.AddShader(&gs);
12683 pipe.AddShader(&fs);
12684
12685 VkDescriptorSetObj descriptorSet(m_device);
12686 descriptorSet.AppendDummy();
12687 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12688
12689 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12690
12691 m_errorMonitor->VerifyNotFound();
12692}
12693
Chris Forbesa0193bc2016-04-04 19:19:47 +120012694TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
12695{
12696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12697 "is per-vertex in tessellation control shader stage "
12698 "but per-patch in tessellation evaluation shader stage");
12699
12700 ASSERT_NO_FATAL_FAILURE(InitState());
12701 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12702
Chris Forbesc1e852d2016-04-04 19:26:42 +120012703 if (!m_device->phy().features().tessellationShader) {
12704 printf("Device does not support tessellation shaders; skipped.\n");
12705 return;
12706 }
12707
Chris Forbesa0193bc2016-04-04 19:19:47 +120012708 char const *vsSource =
12709 "#version 450\n"
12710 "void main(){}\n";
12711 char const *tcsSource =
12712 "#version 450\n"
12713 "layout(location=0) out int x[];\n"
12714 "layout(vertices=3) out;\n"
12715 "void main(){\n"
12716 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
12717 " gl_TessLevelInner[0] = 1;\n"
12718 " x[gl_InvocationID] = gl_InvocationID;\n"
12719 "}\n";
12720 char const *tesSource =
12721 "#version 450\n"
12722 "layout(triangles, equal_spacing, cw) in;\n"
12723 "layout(location=0) patch in int x;\n"
12724 "out gl_PerVertex { vec4 gl_Position; };\n"
12725 "void main(){\n"
12726 " gl_Position.xyz = gl_TessCoord;\n"
12727 " gl_Position.w = x;\n"
12728 "}\n";
12729 char const *fsSource =
12730 "#version 450\n"
12731 "layout(location=0) out vec4 color;\n"
12732 "void main(){\n"
12733 " color = vec4(1);\n"
12734 "}\n";
12735
12736 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12737 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
12738 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
12739 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12740
12741 VkPipelineInputAssemblyStateCreateInfo iasci{
12742 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
12743 nullptr,
12744 0,
12745 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
12746 VK_FALSE};
12747
12748 VkPipelineTessellationStateCreateInfo tsci{
12749 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
12750 nullptr,
12751 0,
12752 3};
12753
12754 VkPipelineObj pipe(m_device);
12755 pipe.SetInputAssembly(&iasci);
12756 pipe.SetTessellation(&tsci);
12757 pipe.AddColorAttachment();
12758 pipe.AddShader(&vs);
12759 pipe.AddShader(&tcs);
12760 pipe.AddShader(&tes);
12761 pipe.AddShader(&fs);
12762
12763 VkDescriptorSetObj descriptorSet(m_device);
12764 descriptorSet.AppendDummy();
12765 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12766
12767 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12768
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012769 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120012770}
12771
Karl Schultz6addd812016-02-02 17:17:23 -070012772TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
12773 m_errorMonitor->SetDesiredFailureMsg(
12774 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012775 "Duplicate vertex input binding descriptions for binding 0");
12776
Chris Forbes280ba2c2015-06-12 11:16:41 +120012777 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012778 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120012779
12780 /* Two binding descriptions for binding 0 */
12781 VkVertexInputBindingDescription input_bindings[2];
12782 memset(input_bindings, 0, sizeof(input_bindings));
12783
12784 VkVertexInputAttributeDescription input_attrib;
12785 memset(&input_attrib, 0, sizeof(input_attrib));
12786 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12787
12788 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012789 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120012790 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012791 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070012792 "out gl_PerVertex {\n"
12793 " vec4 gl_Position;\n"
12794 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120012795 "void main(){\n"
12796 " gl_Position = vec4(x);\n"
12797 "}\n";
12798 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012799 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120012800 "\n"
12801 "layout(location=0) out vec4 color;\n"
12802 "void main(){\n"
12803 " color = vec4(1);\n"
12804 "}\n";
12805
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012806 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12807 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120012808
12809 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012810 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120012811 pipe.AddShader(&vs);
12812 pipe.AddShader(&fs);
12813
12814 pipe.AddVertexInputBindings(input_bindings, 2);
12815 pipe.AddVertexInputAttribs(&input_attrib, 1);
12816
Chris Forbes280ba2c2015-06-12 11:16:41 +120012817 VkDescriptorSetObj descriptorSet(m_device);
12818 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012819 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120012820
Tony Barbour5781e8f2015-08-04 16:23:11 -060012821 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120012822
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012823 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120012824}
Chris Forbes8f68b562015-05-25 11:13:32 +120012825
Chris Forbes35efec72016-04-21 14:32:08 +120012826TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
12827 m_errorMonitor->ExpectSuccess();
12828
12829 ASSERT_NO_FATAL_FAILURE(InitState());
12830 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12831
Chris Forbes91cf3a82016-06-28 17:51:35 +120012832 if (!m_device->phy().features().shaderFloat64) {
Chris Forbes35efec72016-04-21 14:32:08 +120012833 printf("Device does not support 64bit vertex attributes; skipped.\n");
12834 return;
12835 }
12836
12837 VkVertexInputBindingDescription input_bindings[1];
12838 memset(input_bindings, 0, sizeof(input_bindings));
12839
12840 VkVertexInputAttributeDescription input_attribs[4];
12841 memset(input_attribs, 0, sizeof(input_attribs));
12842 input_attribs[0].location = 0;
12843 input_attribs[0].offset = 0;
12844 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
12845 input_attribs[1].location = 2;
12846 input_attribs[1].offset = 32;
12847 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
12848 input_attribs[2].location = 4;
12849 input_attribs[2].offset = 64;
12850 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
12851 input_attribs[3].location = 6;
12852 input_attribs[3].offset = 96;
12853 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
12854
12855 char const *vsSource =
12856 "#version 450\n"
12857 "\n"
12858 "layout(location=0) in dmat4 x;\n"
12859 "out gl_PerVertex {\n"
12860 " vec4 gl_Position;\n"
12861 "};\n"
12862 "void main(){\n"
12863 " gl_Position = vec4(x[0][0]);\n"
12864 "}\n";
12865 char const *fsSource =
12866 "#version 450\n"
12867 "\n"
12868 "layout(location=0) out vec4 color;\n"
12869 "void main(){\n"
12870 " color = vec4(1);\n"
12871 "}\n";
12872
12873 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12874 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12875
12876 VkPipelineObj pipe(m_device);
12877 pipe.AddColorAttachment();
12878 pipe.AddShader(&vs);
12879 pipe.AddShader(&fs);
12880
12881 pipe.AddVertexInputBindings(input_bindings, 1);
12882 pipe.AddVertexInputAttribs(input_attribs, 4);
12883
12884 VkDescriptorSetObj descriptorSet(m_device);
12885 descriptorSet.AppendDummy();
12886 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12887
12888 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12889
12890 m_errorMonitor->VerifyNotFound();
12891}
12892
Karl Schultz6addd812016-02-02 17:17:23 -070012893TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012894 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012895 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012896
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012897 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012898
12899 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012900 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012901 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012902 "out gl_PerVertex {\n"
12903 " vec4 gl_Position;\n"
12904 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012905 "void main(){\n"
12906 " gl_Position = vec4(1);\n"
12907 "}\n";
12908 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012909 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012910 "\n"
12911 "void main(){\n"
12912 "}\n";
12913
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012914 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12915 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012916
12917 VkPipelineObj pipe(m_device);
12918 pipe.AddShader(&vs);
12919 pipe.AddShader(&fs);
12920
Chia-I Wu08accc62015-07-07 11:50:03 +080012921 /* set up CB 0, not written */
12922 pipe.AddColorAttachment();
12923 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012924
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012925 VkDescriptorSetObj descriptorSet(m_device);
12926 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012927 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012928
Tony Barbour5781e8f2015-08-04 16:23:11 -060012929 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012930
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012931 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120012932}
12933
Karl Schultz6addd812016-02-02 17:17:23 -070012934TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -070012935 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012936 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012937 "FS writes to output location 1 with no matching attachment");
12938
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012939 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012940
12941 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012942 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012943 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012944 "out gl_PerVertex {\n"
12945 " vec4 gl_Position;\n"
12946 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012947 "void main(){\n"
12948 " gl_Position = vec4(1);\n"
12949 "}\n";
12950 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012951 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012952 "\n"
12953 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012954 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012955 "void main(){\n"
12956 " x = vec4(1);\n"
12957 " y = vec4(1);\n"
12958 "}\n";
12959
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012960 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12961 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012962
12963 VkPipelineObj pipe(m_device);
12964 pipe.AddShader(&vs);
12965 pipe.AddShader(&fs);
12966
Chia-I Wu08accc62015-07-07 11:50:03 +080012967 /* set up CB 0, not written */
12968 pipe.AddColorAttachment();
12969 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012970 /* FS writes CB 1, but we don't configure it */
12971
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012972 VkDescriptorSetObj descriptorSet(m_device);
12973 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012974 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012975
Tony Barbour5781e8f2015-08-04 16:23:11 -060012976 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012977
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012978 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120012979}
12980
Karl Schultz6addd812016-02-02 17:17:23 -070012981TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012983 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012984
Chris Forbesa36d69e2015-05-25 11:13:44 +120012985 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120012986
12987 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012988 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120012989 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012990 "out gl_PerVertex {\n"
12991 " vec4 gl_Position;\n"
12992 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120012993 "void main(){\n"
12994 " gl_Position = vec4(1);\n"
12995 "}\n";
12996 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012997 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120012998 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012999 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +120013000 "void main(){\n"
13001 " x = ivec4(1);\n"
13002 "}\n";
13003
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013004 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13005 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013006
13007 VkPipelineObj pipe(m_device);
13008 pipe.AddShader(&vs);
13009 pipe.AddShader(&fs);
13010
Chia-I Wu08accc62015-07-07 11:50:03 +080013011 /* set up CB 0; type is UNORM by default */
13012 pipe.AddColorAttachment();
13013 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013014
Chris Forbesa36d69e2015-05-25 11:13:44 +120013015 VkDescriptorSetObj descriptorSet(m_device);
13016 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013017 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013018
Tony Barbour5781e8f2015-08-04 16:23:11 -060013019 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013020
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013021 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120013022}
Chris Forbes7b1b8932015-06-05 14:43:36 +120013023
Karl Schultz6addd812016-02-02 17:17:23 -070013024TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013025 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013026 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013027
Chris Forbes556c76c2015-08-14 12:04:59 +120013028 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120013029
13030 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013031 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013032 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013033 "out gl_PerVertex {\n"
13034 " vec4 gl_Position;\n"
13035 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013036 "void main(){\n"
13037 " gl_Position = vec4(1);\n"
13038 "}\n";
13039 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013040 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013041 "\n"
13042 "layout(location=0) out vec4 x;\n"
13043 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
13044 "void main(){\n"
13045 " x = vec4(bar.y);\n"
13046 "}\n";
13047
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013048 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13049 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120013050
Chris Forbes556c76c2015-08-14 12:04:59 +120013051 VkPipelineObj pipe(m_device);
13052 pipe.AddShader(&vs);
13053 pipe.AddShader(&fs);
13054
13055 /* set up CB 0; type is UNORM by default */
13056 pipe.AddColorAttachment();
13057 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13058
13059 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013060 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120013061
13062 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13063
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013064 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120013065}
13066
Chris Forbes5c59e902016-02-26 16:56:09 +130013067TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
13068 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13069 "not declared in layout");
13070
13071 ASSERT_NO_FATAL_FAILURE(InitState());
13072
13073 char const *vsSource =
13074 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130013075 "\n"
13076 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13077 "out gl_PerVertex {\n"
13078 " vec4 gl_Position;\n"
13079 "};\n"
13080 "void main(){\n"
13081 " gl_Position = vec4(consts.x);\n"
13082 "}\n";
13083 char const *fsSource =
13084 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130013085 "\n"
13086 "layout(location=0) out vec4 x;\n"
13087 "void main(){\n"
13088 " x = vec4(1);\n"
13089 "}\n";
13090
13091 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13092 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13093
13094 VkPipelineObj pipe(m_device);
13095 pipe.AddShader(&vs);
13096 pipe.AddShader(&fs);
13097
13098 /* set up CB 0; type is UNORM by default */
13099 pipe.AddColorAttachment();
13100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13101
13102 VkDescriptorSetObj descriptorSet(m_device);
13103 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13104
13105 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13106
13107 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013108 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130013109}
13110
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013111TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
13112 m_errorMonitor->SetDesiredFailureMsg(
13113 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13114 "Shader uses descriptor slot 0.0");
13115
13116 ASSERT_NO_FATAL_FAILURE(InitState());
13117
13118 char const *csSource =
13119 "#version 450\n"
13120 "\n"
13121 "layout(local_size_x=1) in;\n"
13122 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13123 "void main(){\n"
13124 " x = vec4(1);\n"
13125 "}\n";
13126
13127 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13128
13129 VkDescriptorSetObj descriptorSet(m_device);
13130 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13131
13132 VkComputePipelineCreateInfo cpci = {
13133 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13134 nullptr, 0, {
13135 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13136 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13137 cs.handle(), "main", nullptr
13138 },
13139 descriptorSet.GetPipelineLayout(),
13140 VK_NULL_HANDLE, -1
13141 };
13142
13143 VkPipeline pipe;
13144 VkResult err = vkCreateComputePipelines(
13145 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13146
13147 m_errorMonitor->VerifyFound();
13148
13149 if (err == VK_SUCCESS) {
13150 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13151 }
13152}
13153
13154TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
13155 m_errorMonitor->ExpectSuccess();
13156
13157 ASSERT_NO_FATAL_FAILURE(InitState());
13158
13159 char const *csSource =
13160 "#version 450\n"
13161 "\n"
13162 "layout(local_size_x=1) in;\n"
13163 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13164 "void main(){\n"
13165 " // x is not used.\n"
13166 "}\n";
13167
13168 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13169
13170 VkDescriptorSetObj descriptorSet(m_device);
13171 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13172
13173 VkComputePipelineCreateInfo cpci = {
13174 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13175 nullptr, 0, {
13176 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13177 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13178 cs.handle(), "main", nullptr
13179 },
13180 descriptorSet.GetPipelineLayout(),
13181 VK_NULL_HANDLE, -1
13182 };
13183
13184 VkPipeline pipe;
13185 VkResult err = vkCreateComputePipelines(
13186 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13187
13188 m_errorMonitor->VerifyNotFound();
13189
13190 if (err == VK_SUCCESS) {
13191 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13192 }
13193}
13194
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013195#endif // SHADER_CHECKER_TESTS
13196
13197#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060013198TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -070013199 m_errorMonitor->SetDesiredFailureMsg(
13200 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013201 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013202
13203 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013204
13205 // Create an image
13206 VkImage image;
13207
Karl Schultz6addd812016-02-02 17:17:23 -070013208 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13209 const int32_t tex_width = 32;
13210 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013211
13212 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013213 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13214 image_create_info.pNext = NULL;
13215 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13216 image_create_info.format = tex_format;
13217 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013218 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070013219 image_create_info.extent.depth = 1;
13220 image_create_info.mipLevels = 1;
13221 image_create_info.arrayLayers = 1;
13222 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13223 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13224 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13225 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013226
13227 // Introduce error by sending down a bogus width extent
13228 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013229 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013230
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013231 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013232}
13233
Mark Youngc48c4c12016-04-11 14:26:49 -060013234TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
13235 m_errorMonitor->SetDesiredFailureMsg(
13236 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13237 "CreateImage extents is 0 for at least one required dimension");
13238
13239 ASSERT_NO_FATAL_FAILURE(InitState());
13240
13241 // Create an image
13242 VkImage image;
13243
13244 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13245 const int32_t tex_width = 32;
13246 const int32_t tex_height = 32;
13247
13248 VkImageCreateInfo image_create_info = {};
13249 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13250 image_create_info.pNext = NULL;
13251 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13252 image_create_info.format = tex_format;
13253 image_create_info.extent.width = tex_width;
13254 image_create_info.extent.height = tex_height;
13255 image_create_info.extent.depth = 1;
13256 image_create_info.mipLevels = 1;
13257 image_create_info.arrayLayers = 1;
13258 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13259 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13260 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13261 image_create_info.flags = 0;
13262
13263 // Introduce error by sending down a bogus width extent
13264 image_create_info.extent.width = 0;
13265 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
13266
13267 m_errorMonitor->VerifyFound();
13268}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013269#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120013270
Tobin Ehliscde08892015-09-22 10:11:37 -060013271#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070013272TEST_F(VkLayerTest, InvalidImageView) {
13273 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060013274
Karl Schultz6addd812016-02-02 17:17:23 -070013275 m_errorMonitor->SetDesiredFailureMsg(
13276 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013277 "vkCreateImageView called with baseMipLevel 10 ");
13278
Tobin Ehliscde08892015-09-22 10:11:37 -060013279 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060013280
Mike Stroyana3082432015-09-25 13:39:21 -060013281 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070013282 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060013283
Karl Schultz6addd812016-02-02 17:17:23 -070013284 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13285 const int32_t tex_width = 32;
13286 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060013287
13288 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013289 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13290 image_create_info.pNext = NULL;
13291 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13292 image_create_info.format = tex_format;
13293 image_create_info.extent.width = tex_width;
13294 image_create_info.extent.height = tex_height;
13295 image_create_info.extent.depth = 1;
13296 image_create_info.mipLevels = 1;
13297 image_create_info.arrayLayers = 1;
13298 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13299 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13300 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13301 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060013302
Chia-I Wuf7458c52015-10-26 21:10:41 +080013303 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060013304 ASSERT_VK_SUCCESS(err);
13305
13306 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013307 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13308 image_view_create_info.image = image;
13309 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13310 image_view_create_info.format = tex_format;
13311 image_view_create_info.subresourceRange.layerCount = 1;
13312 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
13313 image_view_create_info.subresourceRange.levelCount = 1;
13314 image_view_create_info.subresourceRange.aspectMask =
13315 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060013316
13317 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070013318 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
13319 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060013320
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013321 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060013322 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060013323}
Mike Stroyana3082432015-09-25 13:39:21 -060013324
Mark Youngd339ba32016-05-30 13:28:35 -060013325TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
13326 VkResult err;
13327
13328 m_errorMonitor->SetDesiredFailureMsg(
13329 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13330 "vkCreateImageView called with invalid memory ");
13331
13332 ASSERT_NO_FATAL_FAILURE(InitState());
13333
13334 // Create an image and try to create a view with no memory backing the image
13335 VkImage image;
13336
13337 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13338 const int32_t tex_width = 32;
13339 const int32_t tex_height = 32;
13340
13341 VkImageCreateInfo image_create_info = {};
13342 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13343 image_create_info.pNext = NULL;
13344 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13345 image_create_info.format = tex_format;
13346 image_create_info.extent.width = tex_width;
13347 image_create_info.extent.height = tex_height;
13348 image_create_info.extent.depth = 1;
13349 image_create_info.mipLevels = 1;
13350 image_create_info.arrayLayers = 1;
13351 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13352 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13353 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13354 image_create_info.flags = 0;
13355
13356 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
13357 ASSERT_VK_SUCCESS(err);
13358
13359 VkImageViewCreateInfo image_view_create_info = {};
13360 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13361 image_view_create_info.image = image;
13362 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13363 image_view_create_info.format = tex_format;
13364 image_view_create_info.subresourceRange.layerCount = 1;
13365 image_view_create_info.subresourceRange.baseMipLevel = 0;
13366 image_view_create_info.subresourceRange.levelCount = 1;
13367 image_view_create_info.subresourceRange.aspectMask =
13368 VK_IMAGE_ASPECT_COLOR_BIT;
13369
13370 VkImageView view;
13371 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
13372 &view);
13373
13374 m_errorMonitor->VerifyFound();
13375 vkDestroyImage(m_device->device(), image, NULL);
13376 // If last error is success, it still created the view, so delete it.
13377 if (err == VK_SUCCESS) {
13378 vkDestroyImageView(m_device->device(), view, NULL);
13379 }
13380
13381}
13382
Karl Schultz6addd812016-02-02 17:17:23 -070013383TEST_F(VkLayerTest, InvalidImageViewAspect) {
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013384 TEST_DESCRIPTION(
13385 "Create an image and try to create a view with an invalid aspectMask");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013387 "vkCreateImageView: Color image "
13388 "formats must have ONLY the "
13389 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013390
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013391 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013392
Karl Schultz6addd812016-02-02 17:17:23 -070013393 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013394 VkImageObj image(m_device);
13395 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT,
13396 VK_IMAGE_TILING_LINEAR, 0);
13397 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013398
13399 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013400 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013401 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070013402 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13403 image_view_create_info.format = tex_format;
13404 image_view_create_info.subresourceRange.baseMipLevel = 0;
13405 image_view_create_info.subresourceRange.levelCount = 1;
13406 // Cause an error by setting an invalid image aspect
13407 image_view_create_info.subresourceRange.aspectMask =
13408 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013409
13410 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013411 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013412
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013413 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013414}
13415
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013416TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070013417 VkResult err;
13418 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060013419
Karl Schultz6addd812016-02-02 17:17:23 -070013420 m_errorMonitor->SetDesiredFailureMsg(
13421 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013422 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013423
Mike Stroyana3082432015-09-25 13:39:21 -060013424 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060013425
13426 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070013427 VkImage srcImage;
13428 VkImage dstImage;
13429 VkDeviceMemory srcMem;
13430 VkDeviceMemory destMem;
13431 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060013432
13433 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013434 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13435 image_create_info.pNext = NULL;
13436 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13437 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
13438 image_create_info.extent.width = 32;
13439 image_create_info.extent.height = 32;
13440 image_create_info.extent.depth = 1;
13441 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013442 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070013443 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13444 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
13445 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13446 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013447
Karl Schultz6addd812016-02-02 17:17:23 -070013448 err =
13449 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013450 ASSERT_VK_SUCCESS(err);
13451
Karl Schultz6addd812016-02-02 17:17:23 -070013452 err =
13453 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013454 ASSERT_VK_SUCCESS(err);
13455
13456 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013457 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013458 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13459 memAlloc.pNext = NULL;
13460 memAlloc.allocationSize = 0;
13461 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013462
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060013463 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060013464 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070013465 pass =
13466 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060013467 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013468 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060013469 ASSERT_VK_SUCCESS(err);
13470
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013471 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060013472 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070013473 pass =
13474 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060013475 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013476 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060013477 ASSERT_VK_SUCCESS(err);
13478
13479 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
13480 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013481 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060013482 ASSERT_VK_SUCCESS(err);
13483
13484 BeginCommandBuffer();
13485 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080013486 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060013487 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060013488 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013489 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060013490 copyRegion.srcOffset.x = 0;
13491 copyRegion.srcOffset.y = 0;
13492 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080013493 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013494 copyRegion.dstSubresource.mipLevel = 0;
13495 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013496 // Introduce failure by forcing the dst layerCount to differ from src
13497 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013498 copyRegion.dstOffset.x = 0;
13499 copyRegion.dstOffset.y = 0;
13500 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013501 copyRegion.extent.width = 1;
13502 copyRegion.extent.height = 1;
13503 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070013504 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
13505 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060013506 EndCommandBuffer();
13507
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013508 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060013509
Chia-I Wuf7458c52015-10-26 21:10:41 +080013510 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013511 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080013512 vkFreeMemory(m_device->device(), srcMem, NULL);
13513 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060013514}
13515
Tony Barbourd6673642016-05-05 14:46:39 -060013516TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
13517
13518 TEST_DESCRIPTION("Creating images with unsuported formats ");
13519
13520 ASSERT_NO_FATAL_FAILURE(InitState());
13521 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13522 VkImageObj image(m_device);
13523 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
13524 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
13525 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
13526 VK_IMAGE_TILING_OPTIMAL, 0);
13527 ASSERT_TRUE(image.initialized());
13528
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013529 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
13530 VkImageCreateInfo image_create_info;
13531 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13532 image_create_info.pNext = NULL;
13533 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13534 image_create_info.format = VK_FORMAT_UNDEFINED;
13535 image_create_info.extent.width = 32;
13536 image_create_info.extent.height = 32;
13537 image_create_info.extent.depth = 1;
13538 image_create_info.mipLevels = 1;
13539 image_create_info.arrayLayers = 1;
13540 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13541 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
13542 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13543 image_create_info.flags = 0;
13544
13545 m_errorMonitor->SetDesiredFailureMsg(
13546 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13547 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
13548
13549 VkImage localImage;
13550 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
13551 m_errorMonitor->VerifyFound();
13552
Tony Barbourd6673642016-05-05 14:46:39 -060013553 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013554 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060013555 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
13556 VkFormat format = static_cast<VkFormat>(f);
13557 VkFormatProperties fProps = m_device->format_properties(format);
13558 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
13559 fProps.optimalTilingFeatures == 0) {
13560 unsupported = format;
13561 break;
13562 }
13563 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013564
Tony Barbourd6673642016-05-05 14:46:39 -060013565 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060013566 image_create_info.format = unsupported;
Tony Barbourd6673642016-05-05 14:46:39 -060013567 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013568 "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060013569
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013570 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060013571 m_errorMonitor->VerifyFound();
13572 }
13573}
13574
13575TEST_F(VkLayerTest, ImageLayerViewTests) {
13576 VkResult ret;
13577 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
13578
13579 ASSERT_NO_FATAL_FAILURE(InitState());
13580
13581 VkImageObj image(m_device);
13582 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
13583 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
13584 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
13585 VK_IMAGE_TILING_OPTIMAL, 0);
13586 ASSERT_TRUE(image.initialized());
13587
13588 VkImageView imgView;
13589 VkImageViewCreateInfo imgViewInfo = {};
13590 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13591 imgViewInfo.image = image.handle();
13592 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
13593 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
13594 imgViewInfo.subresourceRange.layerCount = 1;
13595 imgViewInfo.subresourceRange.baseMipLevel = 0;
13596 imgViewInfo.subresourceRange.levelCount = 1;
13597 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13598
13599 m_errorMonitor->SetDesiredFailureMsg(
13600 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13601 "vkCreateImageView called with baseMipLevel");
13602 // View can't have baseMipLevel >= image's mipLevels - Expect
13603 // VIEW_CREATE_ERROR
13604 imgViewInfo.subresourceRange.baseMipLevel = 1;
13605 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13606 m_errorMonitor->VerifyFound();
13607 imgViewInfo.subresourceRange.baseMipLevel = 0;
13608
13609 m_errorMonitor->SetDesiredFailureMsg(
13610 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13611 "vkCreateImageView called with baseArrayLayer");
13612 // View can't have baseArrayLayer >= image's arraySize - Expect
13613 // VIEW_CREATE_ERROR
13614 imgViewInfo.subresourceRange.baseArrayLayer = 1;
13615 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13616 m_errorMonitor->VerifyFound();
13617 imgViewInfo.subresourceRange.baseArrayLayer = 0;
13618
13619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13620 "vkCreateImageView called with 0 in "
13621 "pCreateInfo->subresourceRange."
13622 "levelCount");
13623 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
13624 imgViewInfo.subresourceRange.levelCount = 0;
13625 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13626 m_errorMonitor->VerifyFound();
13627 imgViewInfo.subresourceRange.levelCount = 1;
13628
13629 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13630 "vkCreateImageView called with 0 in "
13631 "pCreateInfo->subresourceRange."
13632 "layerCount");
13633 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
13634 imgViewInfo.subresourceRange.layerCount = 0;
13635 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13636 m_errorMonitor->VerifyFound();
13637 imgViewInfo.subresourceRange.layerCount = 1;
13638
13639 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13640 "but both must be color formats");
13641 // Can't use depth format for view into color image - Expect INVALID_FORMAT
13642 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
13643 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13644 m_errorMonitor->VerifyFound();
13645 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
13646
13647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13648 "Formats MUST be IDENTICAL unless "
13649 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
13650 "was set on image creation.");
13651 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
13652 // VIEW_CREATE_ERROR
13653 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
13654 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13655 m_errorMonitor->VerifyFound();
13656 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
13657
13658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13659 "can support ImageViews with "
13660 "differing formats but they must be "
13661 "in the same compatibility class.");
13662 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
13663 // VIEW_CREATE_ERROR
13664 VkImageCreateInfo mutImgInfo = image.create_info();
13665 VkImage mutImage;
13666 mutImgInfo.format = VK_FORMAT_R8_UINT;
13667 assert(
13668 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
13669 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
13670 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
13671 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
13672 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
13673 ASSERT_VK_SUCCESS(ret);
13674 imgViewInfo.image = mutImage;
13675 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13676 m_errorMonitor->VerifyFound();
13677 imgViewInfo.image = image.handle();
13678 vkDestroyImage(m_device->handle(), mutImage, NULL);
13679}
13680
13681TEST_F(VkLayerTest, MiscImageLayerTests) {
13682
13683 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
13684
13685 ASSERT_NO_FATAL_FAILURE(InitState());
13686
13687 VkImageObj image(m_device);
13688 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
13689 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
13690 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
13691 VK_IMAGE_TILING_OPTIMAL, 0);
13692 ASSERT_TRUE(image.initialized());
13693
13694 m_errorMonitor->SetDesiredFailureMsg(
13695 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13696 "number of layers in image subresource is zero");
13697 vk_testing::Buffer buffer;
13698 VkMemoryPropertyFlags reqs = 0;
13699 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
13700 VkBufferImageCopy region = {};
13701 region.bufferRowLength = 128;
13702 region.bufferImageHeight = 128;
13703 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13704 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
13705 region.imageSubresource.layerCount = 0;
13706 region.imageExtent.height = 4;
13707 region.imageExtent.width = 4;
13708 region.imageExtent.depth = 1;
13709 m_commandBuffer->BeginCommandBuffer();
13710 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
13711 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
13712 1, &region);
13713 m_errorMonitor->VerifyFound();
13714 region.imageSubresource.layerCount = 1;
13715
13716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13717 "aspectMasks for each region must "
13718 "specify only COLOR or DEPTH or "
13719 "STENCIL");
13720 // Expect MISMATCHED_IMAGE_ASPECT
13721 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
13722 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
13723 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
13724 1, &region);
13725 m_errorMonitor->VerifyFound();
13726 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13727
13728 m_errorMonitor->SetDesiredFailureMsg(
13729 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13730 "If the format of srcImage is a depth, stencil, depth stencil or "
13731 "integer-based format then filter must be VK_FILTER_NEAREST");
13732 // Expect INVALID_FILTER
13733 VkImageObj intImage1(m_device);
13734 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
13735 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
13736 0);
13737 VkImageObj intImage2(m_device);
13738 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
13739 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
13740 0);
13741 VkImageBlit blitRegion = {};
13742 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13743 blitRegion.srcSubresource.baseArrayLayer = 0;
13744 blitRegion.srcSubresource.layerCount = 1;
13745 blitRegion.srcSubresource.mipLevel = 0;
13746 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13747 blitRegion.dstSubresource.baseArrayLayer = 0;
13748 blitRegion.dstSubresource.layerCount = 1;
13749 blitRegion.dstSubresource.mipLevel = 0;
13750
13751 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
13752 intImage1.layout(), intImage2.handle(), intImage2.layout(),
13753 16, &blitRegion, VK_FILTER_LINEAR);
13754 m_errorMonitor->VerifyFound();
13755
13756 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13757 "called with 0 in ppMemoryBarriers");
13758 VkImageMemoryBarrier img_barrier;
13759 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
13760 img_barrier.pNext = NULL;
13761 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
13762 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
13763 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
13764 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
13765 img_barrier.image = image.handle();
13766 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
13767 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
13768 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13769 img_barrier.subresourceRange.baseArrayLayer = 0;
13770 img_barrier.subresourceRange.baseMipLevel = 0;
13771 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
13772 img_barrier.subresourceRange.layerCount = 0;
13773 img_barrier.subresourceRange.levelCount = 1;
13774 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
13775 VK_PIPELINE_STAGE_HOST_BIT,
13776 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
13777 nullptr, 1, &img_barrier);
13778 m_errorMonitor->VerifyFound();
13779 img_barrier.subresourceRange.layerCount = 1;
13780}
13781
13782TEST_F(VkLayerTest, ImageFormatLimits) {
13783
13784 TEST_DESCRIPTION("Exceed the limits of image format ");
13785
13786 m_errorMonitor->SetDesiredFailureMsg(
13787 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13788 "CreateImage extents exceed allowable limits for format");
13789 VkImageCreateInfo image_create_info = {};
13790 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13791 image_create_info.pNext = NULL;
13792 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13793 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
13794 image_create_info.extent.width = 32;
13795 image_create_info.extent.height = 32;
13796 image_create_info.extent.depth = 1;
13797 image_create_info.mipLevels = 1;
13798 image_create_info.arrayLayers = 1;
13799 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13800 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13801 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13802 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
13803 image_create_info.flags = 0;
13804
13805 VkImage nullImg;
13806 VkImageFormatProperties imgFmtProps;
13807 vkGetPhysicalDeviceImageFormatProperties(
13808 gpu(), image_create_info.format, image_create_info.imageType,
13809 image_create_info.tiling, image_create_info.usage,
13810 image_create_info.flags, &imgFmtProps);
13811 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
13812 // Expect INVALID_FORMAT_LIMITS_VIOLATION
13813 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13814 m_errorMonitor->VerifyFound();
13815 image_create_info.extent.depth = 1;
13816
13817 m_errorMonitor->SetDesiredFailureMsg(
13818 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13819 "exceeds allowable maximum supported by format of");
13820 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
13821 // Expect INVALID_FORMAT_LIMITS_VIOLATION
13822 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13823 m_errorMonitor->VerifyFound();
13824 image_create_info.mipLevels = 1;
13825
13826 m_errorMonitor->SetDesiredFailureMsg(
13827 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13828 "exceeds allowable maximum supported by format of");
13829 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
13830 // Expect INVALID_FORMAT_LIMITS_VIOLATION
13831 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13832 m_errorMonitor->VerifyFound();
13833 image_create_info.arrayLayers = 1;
13834
13835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13836 "is not supported by format");
13837 int samples = imgFmtProps.sampleCounts >> 1;
13838 image_create_info.samples = (VkSampleCountFlagBits)samples;
13839 // Expect INVALID_FORMAT_LIMITS_VIOLATION
13840 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13841 m_errorMonitor->VerifyFound();
13842 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13843
13844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13845 "pCreateInfo->initialLayout, must be "
13846 "VK_IMAGE_LAYOUT_UNDEFINED or "
13847 "VK_IMAGE_LAYOUT_PREINITIALIZED");
13848 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
13849 // Expect INVALID_LAYOUT
13850 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13851 m_errorMonitor->VerifyFound();
13852 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
13853}
13854
Karl Schultz6addd812016-02-02 17:17:23 -070013855TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060013856 VkResult err;
13857 bool pass;
13858
13859 // Create color images with different format sizes and try to copy between them
13860 m_errorMonitor->SetDesiredFailureMsg(
13861 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13862 "vkCmdCopyImage called with unmatched source and dest image format sizes");
13863
13864 ASSERT_NO_FATAL_FAILURE(InitState());
13865
13866 // Create two images of different types and try to copy between them
13867 VkImage srcImage;
13868 VkImage dstImage;
13869 VkDeviceMemory srcMem;
13870 VkDeviceMemory destMem;
13871 VkMemoryRequirements memReqs;
13872
13873 VkImageCreateInfo image_create_info = {};
13874 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13875 image_create_info.pNext = NULL;
13876 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13877 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
13878 image_create_info.extent.width = 32;
13879 image_create_info.extent.height = 32;
13880 image_create_info.extent.depth = 1;
13881 image_create_info.mipLevels = 1;
13882 image_create_info.arrayLayers = 1;
13883 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13884 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13885 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13886 image_create_info.flags = 0;
13887
13888 err =
13889 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
13890 ASSERT_VK_SUCCESS(err);
13891
13892 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
13893 // Introduce failure by creating second image with a different-sized format.
13894 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
13895
13896 err =
13897 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
13898 ASSERT_VK_SUCCESS(err);
13899
13900 // Allocate memory
13901 VkMemoryAllocateInfo memAlloc = {};
13902 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13903 memAlloc.pNext = NULL;
13904 memAlloc.allocationSize = 0;
13905 memAlloc.memoryTypeIndex = 0;
13906
13907 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
13908 memAlloc.allocationSize = memReqs.size;
13909 pass =
13910 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
13911 ASSERT_TRUE(pass);
13912 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
13913 ASSERT_VK_SUCCESS(err);
13914
13915 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
13916 memAlloc.allocationSize = memReqs.size;
13917 pass =
13918 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
13919 ASSERT_TRUE(pass);
13920 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
13921 ASSERT_VK_SUCCESS(err);
13922
13923 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
13924 ASSERT_VK_SUCCESS(err);
13925 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
13926 ASSERT_VK_SUCCESS(err);
13927
13928 BeginCommandBuffer();
13929 VkImageCopy copyRegion;
13930 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13931 copyRegion.srcSubresource.mipLevel = 0;
13932 copyRegion.srcSubresource.baseArrayLayer = 0;
13933 copyRegion.srcSubresource.layerCount = 0;
13934 copyRegion.srcOffset.x = 0;
13935 copyRegion.srcOffset.y = 0;
13936 copyRegion.srcOffset.z = 0;
13937 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13938 copyRegion.dstSubresource.mipLevel = 0;
13939 copyRegion.dstSubresource.baseArrayLayer = 0;
13940 copyRegion.dstSubresource.layerCount = 0;
13941 copyRegion.dstOffset.x = 0;
13942 copyRegion.dstOffset.y = 0;
13943 copyRegion.dstOffset.z = 0;
13944 copyRegion.extent.width = 1;
13945 copyRegion.extent.height = 1;
13946 copyRegion.extent.depth = 1;
13947 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
13948 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
13949 EndCommandBuffer();
13950
13951 m_errorMonitor->VerifyFound();
13952
13953 vkDestroyImage(m_device->device(), srcImage, NULL);
13954 vkDestroyImage(m_device->device(), dstImage, NULL);
13955 vkFreeMemory(m_device->device(), srcMem, NULL);
13956 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060013957}
13958
Karl Schultz6addd812016-02-02 17:17:23 -070013959TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
13960 VkResult err;
13961 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060013962
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013963 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070013964 m_errorMonitor->SetDesiredFailureMsg(
13965 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013966 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013967
Mike Stroyana3082432015-09-25 13:39:21 -060013968 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060013969
13970 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070013971 VkImage srcImage;
13972 VkImage dstImage;
13973 VkDeviceMemory srcMem;
13974 VkDeviceMemory destMem;
13975 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060013976
13977 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013978 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13979 image_create_info.pNext = NULL;
13980 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13981 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
13982 image_create_info.extent.width = 32;
13983 image_create_info.extent.height = 32;
13984 image_create_info.extent.depth = 1;
13985 image_create_info.mipLevels = 1;
13986 image_create_info.arrayLayers = 1;
13987 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13988 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13989 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13990 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013991
Karl Schultz6addd812016-02-02 17:17:23 -070013992 err =
13993 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013994 ASSERT_VK_SUCCESS(err);
13995
Karl Schultzbdb75952016-04-19 11:36:49 -060013996 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
13997
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013998 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070013999 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014000 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
14001 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014002
Karl Schultz6addd812016-02-02 17:17:23 -070014003 err =
14004 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014005 ASSERT_VK_SUCCESS(err);
14006
14007 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014008 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014009 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14010 memAlloc.pNext = NULL;
14011 memAlloc.allocationSize = 0;
14012 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014013
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014014 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014015 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014016 pass =
14017 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014018 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014019 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014020 ASSERT_VK_SUCCESS(err);
14021
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014022 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014023 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014024 pass =
14025 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014026 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014027 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014028 ASSERT_VK_SUCCESS(err);
14029
14030 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14031 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014032 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014033 ASSERT_VK_SUCCESS(err);
14034
14035 BeginCommandBuffer();
14036 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014037 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014038 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014039 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014040 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014041 copyRegion.srcOffset.x = 0;
14042 copyRegion.srcOffset.y = 0;
14043 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014044 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014045 copyRegion.dstSubresource.mipLevel = 0;
14046 copyRegion.dstSubresource.baseArrayLayer = 0;
14047 copyRegion.dstSubresource.layerCount = 0;
14048 copyRegion.dstOffset.x = 0;
14049 copyRegion.dstOffset.y = 0;
14050 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014051 copyRegion.extent.width = 1;
14052 copyRegion.extent.height = 1;
14053 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014054 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14055 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014056 EndCommandBuffer();
14057
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014058 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014059
Chia-I Wuf7458c52015-10-26 21:10:41 +080014060 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014061 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014062 vkFreeMemory(m_device->device(), srcMem, NULL);
14063 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014064}
14065
Karl Schultz6addd812016-02-02 17:17:23 -070014066TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
14067 VkResult err;
14068 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014069
Karl Schultz6addd812016-02-02 17:17:23 -070014070 m_errorMonitor->SetDesiredFailureMsg(
14071 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014072 "vkCmdResolveImage called with source sample count less than 2.");
14073
Mike Stroyana3082432015-09-25 13:39:21 -060014074 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014075
14076 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070014077 VkImage srcImage;
14078 VkImage dstImage;
14079 VkDeviceMemory srcMem;
14080 VkDeviceMemory destMem;
14081 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014082
14083 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014084 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14085 image_create_info.pNext = NULL;
14086 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14087 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14088 image_create_info.extent.width = 32;
14089 image_create_info.extent.height = 1;
14090 image_create_info.extent.depth = 1;
14091 image_create_info.mipLevels = 1;
14092 image_create_info.arrayLayers = 1;
14093 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14094 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14095 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14096 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014097
Karl Schultz6addd812016-02-02 17:17:23 -070014098 err =
14099 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014100 ASSERT_VK_SUCCESS(err);
14101
Karl Schultz6addd812016-02-02 17:17:23 -070014102 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014103
Karl Schultz6addd812016-02-02 17:17:23 -070014104 err =
14105 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014106 ASSERT_VK_SUCCESS(err);
14107
14108 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014109 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014110 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14111 memAlloc.pNext = NULL;
14112 memAlloc.allocationSize = 0;
14113 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014114
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014115 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014116 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014117 pass =
14118 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014119 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014120 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014121 ASSERT_VK_SUCCESS(err);
14122
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014123 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014124 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014125 pass =
14126 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014127 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014128 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014129 ASSERT_VK_SUCCESS(err);
14130
14131 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14132 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014133 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014134 ASSERT_VK_SUCCESS(err);
14135
14136 BeginCommandBuffer();
14137 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014138 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14139 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014140 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014141 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014142 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014143 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014144 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014145 resolveRegion.srcOffset.x = 0;
14146 resolveRegion.srcOffset.y = 0;
14147 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014148 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014149 resolveRegion.dstSubresource.mipLevel = 0;
14150 resolveRegion.dstSubresource.baseArrayLayer = 0;
14151 resolveRegion.dstSubresource.layerCount = 0;
14152 resolveRegion.dstOffset.x = 0;
14153 resolveRegion.dstOffset.y = 0;
14154 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014155 resolveRegion.extent.width = 1;
14156 resolveRegion.extent.height = 1;
14157 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014158 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14159 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014160 EndCommandBuffer();
14161
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014162 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014163
Chia-I Wuf7458c52015-10-26 21:10:41 +080014164 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014165 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014166 vkFreeMemory(m_device->device(), srcMem, NULL);
14167 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014168}
14169
Karl Schultz6addd812016-02-02 17:17:23 -070014170TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
14171 VkResult err;
14172 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014173
Karl Schultz6addd812016-02-02 17:17:23 -070014174 m_errorMonitor->SetDesiredFailureMsg(
14175 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014176 "vkCmdResolveImage called with dest sample count greater than 1.");
14177
Mike Stroyana3082432015-09-25 13:39:21 -060014178 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014179
Chris Forbesa7530692016-05-08 12:35:39 +120014180 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070014181 VkImage srcImage;
14182 VkImage dstImage;
14183 VkDeviceMemory srcMem;
14184 VkDeviceMemory destMem;
14185 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014186
14187 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014188 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14189 image_create_info.pNext = NULL;
14190 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14191 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14192 image_create_info.extent.width = 32;
14193 image_create_info.extent.height = 1;
14194 image_create_info.extent.depth = 1;
14195 image_create_info.mipLevels = 1;
14196 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120014197 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070014198 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14199 // Note: Some implementations expect color attachment usage for any
14200 // multisample surface
14201 image_create_info.usage =
14202 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14203 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014204
Karl Schultz6addd812016-02-02 17:17:23 -070014205 err =
14206 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014207 ASSERT_VK_SUCCESS(err);
14208
Karl Schultz6addd812016-02-02 17:17:23 -070014209 // Note: Some implementations expect color attachment usage for any
14210 // multisample surface
14211 image_create_info.usage =
14212 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014213
Karl Schultz6addd812016-02-02 17:17:23 -070014214 err =
14215 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014216 ASSERT_VK_SUCCESS(err);
14217
14218 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014219 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014220 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14221 memAlloc.pNext = NULL;
14222 memAlloc.allocationSize = 0;
14223 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014224
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014225 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014226 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014227 pass =
14228 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014229 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014230 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014231 ASSERT_VK_SUCCESS(err);
14232
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014233 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014234 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014235 pass =
14236 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014237 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014238 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014239 ASSERT_VK_SUCCESS(err);
14240
14241 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14242 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014243 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014244 ASSERT_VK_SUCCESS(err);
14245
14246 BeginCommandBuffer();
14247 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014248 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14249 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014250 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014251 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014252 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014253 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014254 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014255 resolveRegion.srcOffset.x = 0;
14256 resolveRegion.srcOffset.y = 0;
14257 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014258 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014259 resolveRegion.dstSubresource.mipLevel = 0;
14260 resolveRegion.dstSubresource.baseArrayLayer = 0;
14261 resolveRegion.dstSubresource.layerCount = 0;
14262 resolveRegion.dstOffset.x = 0;
14263 resolveRegion.dstOffset.y = 0;
14264 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014265 resolveRegion.extent.width = 1;
14266 resolveRegion.extent.height = 1;
14267 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014268 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14269 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014270 EndCommandBuffer();
14271
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014272 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014273
Chia-I Wuf7458c52015-10-26 21:10:41 +080014274 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014275 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014276 vkFreeMemory(m_device->device(), srcMem, NULL);
14277 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014278}
14279
Karl Schultz6addd812016-02-02 17:17:23 -070014280TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
14281 VkResult err;
14282 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014283
Karl Schultz6addd812016-02-02 17:17:23 -070014284 m_errorMonitor->SetDesiredFailureMsg(
14285 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014286 "vkCmdResolveImage called with unmatched source and dest formats.");
14287
Mike Stroyana3082432015-09-25 13:39:21 -060014288 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014289
14290 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014291 VkImage srcImage;
14292 VkImage dstImage;
14293 VkDeviceMemory srcMem;
14294 VkDeviceMemory destMem;
14295 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014296
14297 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014298 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14299 image_create_info.pNext = NULL;
14300 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14301 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14302 image_create_info.extent.width = 32;
14303 image_create_info.extent.height = 1;
14304 image_create_info.extent.depth = 1;
14305 image_create_info.mipLevels = 1;
14306 image_create_info.arrayLayers = 1;
14307 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
14308 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14309 // Note: Some implementations expect color attachment usage for any
14310 // multisample surface
14311 image_create_info.usage =
14312 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14313 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014314
Karl Schultz6addd812016-02-02 17:17:23 -070014315 err =
14316 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014317 ASSERT_VK_SUCCESS(err);
14318
Karl Schultz6addd812016-02-02 17:17:23 -070014319 // Set format to something other than source image
14320 image_create_info.format = VK_FORMAT_R32_SFLOAT;
14321 // Note: Some implementations expect color attachment usage for any
14322 // multisample surface
14323 image_create_info.usage =
14324 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14325 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014326
Karl Schultz6addd812016-02-02 17:17:23 -070014327 err =
14328 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014329 ASSERT_VK_SUCCESS(err);
14330
14331 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014332 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014333 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14334 memAlloc.pNext = NULL;
14335 memAlloc.allocationSize = 0;
14336 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014337
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014338 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014339 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014340 pass =
14341 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014342 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014343 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014344 ASSERT_VK_SUCCESS(err);
14345
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014346 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014347 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014348 pass =
14349 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014350 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014351 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014352 ASSERT_VK_SUCCESS(err);
14353
14354 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14355 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014356 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014357 ASSERT_VK_SUCCESS(err);
14358
14359 BeginCommandBuffer();
14360 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014361 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14362 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014363 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014364 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014365 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014366 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014367 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014368 resolveRegion.srcOffset.x = 0;
14369 resolveRegion.srcOffset.y = 0;
14370 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014371 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014372 resolveRegion.dstSubresource.mipLevel = 0;
14373 resolveRegion.dstSubresource.baseArrayLayer = 0;
14374 resolveRegion.dstSubresource.layerCount = 0;
14375 resolveRegion.dstOffset.x = 0;
14376 resolveRegion.dstOffset.y = 0;
14377 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014378 resolveRegion.extent.width = 1;
14379 resolveRegion.extent.height = 1;
14380 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014381 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14382 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014383 EndCommandBuffer();
14384
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014385 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014386
Chia-I Wuf7458c52015-10-26 21:10:41 +080014387 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014388 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014389 vkFreeMemory(m_device->device(), srcMem, NULL);
14390 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014391}
14392
Karl Schultz6addd812016-02-02 17:17:23 -070014393TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
14394 VkResult err;
14395 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014396
Karl Schultz6addd812016-02-02 17:17:23 -070014397 m_errorMonitor->SetDesiredFailureMsg(
14398 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014399 "vkCmdResolveImage called with unmatched source and dest image types.");
14400
Mike Stroyana3082432015-09-25 13:39:21 -060014401 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014402
14403 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014404 VkImage srcImage;
14405 VkImage dstImage;
14406 VkDeviceMemory srcMem;
14407 VkDeviceMemory destMem;
14408 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014409
14410 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014411 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14412 image_create_info.pNext = NULL;
14413 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14414 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14415 image_create_info.extent.width = 32;
14416 image_create_info.extent.height = 1;
14417 image_create_info.extent.depth = 1;
14418 image_create_info.mipLevels = 1;
14419 image_create_info.arrayLayers = 1;
14420 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
14421 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14422 // Note: Some implementations expect color attachment usage for any
14423 // multisample surface
14424 image_create_info.usage =
14425 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14426 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014427
Karl Schultz6addd812016-02-02 17:17:23 -070014428 err =
14429 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014430 ASSERT_VK_SUCCESS(err);
14431
Karl Schultz6addd812016-02-02 17:17:23 -070014432 image_create_info.imageType = VK_IMAGE_TYPE_1D;
14433 // Note: Some implementations expect color attachment usage for any
14434 // multisample surface
14435 image_create_info.usage =
14436 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14437 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014438
Karl Schultz6addd812016-02-02 17:17:23 -070014439 err =
14440 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014441 ASSERT_VK_SUCCESS(err);
14442
14443 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014444 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014445 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14446 memAlloc.pNext = NULL;
14447 memAlloc.allocationSize = 0;
14448 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014449
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014450 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014451 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014452 pass =
14453 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014454 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014455 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014456 ASSERT_VK_SUCCESS(err);
14457
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014458 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014459 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014460 pass =
14461 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014462 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014463 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014464 ASSERT_VK_SUCCESS(err);
14465
14466 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14467 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014468 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014469 ASSERT_VK_SUCCESS(err);
14470
14471 BeginCommandBuffer();
14472 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014473 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14474 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014475 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014476 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014477 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014478 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014479 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014480 resolveRegion.srcOffset.x = 0;
14481 resolveRegion.srcOffset.y = 0;
14482 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014483 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014484 resolveRegion.dstSubresource.mipLevel = 0;
14485 resolveRegion.dstSubresource.baseArrayLayer = 0;
14486 resolveRegion.dstSubresource.layerCount = 0;
14487 resolveRegion.dstOffset.x = 0;
14488 resolveRegion.dstOffset.y = 0;
14489 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014490 resolveRegion.extent.width = 1;
14491 resolveRegion.extent.height = 1;
14492 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014493 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14494 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014495 EndCommandBuffer();
14496
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014497 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014498
Chia-I Wuf7458c52015-10-26 21:10:41 +080014499 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014500 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014501 vkFreeMemory(m_device->device(), srcMem, NULL);
14502 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014503}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014504
Karl Schultz6addd812016-02-02 17:17:23 -070014505TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014506 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070014507 // to using a DS format, then cause it to hit error due to COLOR_BIT not
14508 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014509 // The image format check comes 2nd in validation so we trigger it first,
14510 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070014511 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014512
Karl Schultz6addd812016-02-02 17:17:23 -070014513 m_errorMonitor->SetDesiredFailureMsg(
14514 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014515 "Combination depth/stencil image formats can have only the ");
14516
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014517 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014518
Chia-I Wu1b99bb22015-10-27 19:25:11 +080014519 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014520 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
14521 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014522
14523 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014524 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14525 ds_pool_ci.pNext = NULL;
14526 ds_pool_ci.maxSets = 1;
14527 ds_pool_ci.poolSizeCount = 1;
14528 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014529
14530 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070014531 err =
14532 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014533 ASSERT_VK_SUCCESS(err);
14534
14535 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014536 dsl_binding.binding = 0;
14537 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
14538 dsl_binding.descriptorCount = 1;
14539 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
14540 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014541
14542 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014543 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14544 ds_layout_ci.pNext = NULL;
14545 ds_layout_ci.bindingCount = 1;
14546 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014547 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070014548 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
14549 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014550 ASSERT_VK_SUCCESS(err);
14551
14552 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014553 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080014554 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070014555 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014556 alloc_info.descriptorPool = ds_pool;
14557 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070014558 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
14559 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014560 ASSERT_VK_SUCCESS(err);
14561
Karl Schultz6addd812016-02-02 17:17:23 -070014562 VkImage image_bad;
14563 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014564 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060014565 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014566 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070014567 const int32_t tex_width = 32;
14568 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014569
14570 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014571 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14572 image_create_info.pNext = NULL;
14573 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14574 image_create_info.format = tex_format_bad;
14575 image_create_info.extent.width = tex_width;
14576 image_create_info.extent.height = tex_height;
14577 image_create_info.extent.depth = 1;
14578 image_create_info.mipLevels = 1;
14579 image_create_info.arrayLayers = 1;
14580 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14581 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14582 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
14583 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
14584 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014585
Karl Schultz6addd812016-02-02 17:17:23 -070014586 err =
14587 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014588 ASSERT_VK_SUCCESS(err);
14589 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070014590 image_create_info.usage =
14591 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14592 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
14593 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014594 ASSERT_VK_SUCCESS(err);
14595
14596 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014597 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14598 image_view_create_info.image = image_bad;
14599 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14600 image_view_create_info.format = tex_format_bad;
14601 image_view_create_info.subresourceRange.baseArrayLayer = 0;
14602 image_view_create_info.subresourceRange.baseMipLevel = 0;
14603 image_view_create_info.subresourceRange.layerCount = 1;
14604 image_view_create_info.subresourceRange.levelCount = 1;
14605 image_view_create_info.subresourceRange.aspectMask =
14606 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014607
14608 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070014609 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
14610 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014611
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014612 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014613
Chia-I Wuf7458c52015-10-26 21:10:41 +080014614 vkDestroyImage(m_device->device(), image_bad, NULL);
14615 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014616 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
14617 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014618}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060014619
14620TEST_F(VkLayerTest, ClearImageErrors) {
14621 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
14622 "ClearDepthStencilImage with a color image.");
14623
14624 ASSERT_NO_FATAL_FAILURE(InitState());
14625 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14626
14627 // Renderpass is started here so end it as Clear cmds can't be in renderpass
14628 BeginCommandBuffer();
14629 m_commandBuffer->EndRenderPass();
14630
14631 // Color image
14632 VkClearColorValue clear_color;
14633 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
14634 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
14635 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
14636 const int32_t img_width = 32;
14637 const int32_t img_height = 32;
14638 VkImageCreateInfo image_create_info = {};
14639 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14640 image_create_info.pNext = NULL;
14641 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14642 image_create_info.format = color_format;
14643 image_create_info.extent.width = img_width;
14644 image_create_info.extent.height = img_height;
14645 image_create_info.extent.depth = 1;
14646 image_create_info.mipLevels = 1;
14647 image_create_info.arrayLayers = 1;
14648 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14649 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14650 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14651
14652 vk_testing::Image color_image;
14653 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info,
14654 reqs);
14655
14656 const VkImageSubresourceRange color_range =
14657 vk_testing::Image::subresource_range(image_create_info,
14658 VK_IMAGE_ASPECT_COLOR_BIT);
14659
14660 // Depth/Stencil image
14661 VkClearDepthStencilValue clear_value = {0};
14662 reqs = 0; // don't need HOST_VISIBLE DS image
14663 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
14664 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
14665 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
14666 ds_image_create_info.extent.width = 64;
14667 ds_image_create_info.extent.height = 64;
14668 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14669 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
14670
14671 vk_testing::Image ds_image;
14672 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info,
14673 reqs);
14674
14675 const VkImageSubresourceRange ds_range =
14676 vk_testing::Image::subresource_range(ds_image_create_info,
14677 VK_IMAGE_ASPECT_DEPTH_BIT);
14678
14679 m_errorMonitor->SetDesiredFailureMsg(
14680 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14681 "vkCmdClearColorImage called with depth/stencil image.");
14682
14683 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
14684 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
14685 &color_range);
14686
14687 m_errorMonitor->VerifyFound();
14688
Tony Barbour26434b92016-06-02 09:43:50 -060014689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14690 "vkCmdClearColorImage called with "
14691 "image created without "
14692 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
14693
14694 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
14695 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
14696 &color_range);
14697
14698 m_errorMonitor->VerifyFound();
14699
Tobin Ehlis6e23d772016-05-19 11:08:34 -060014700 // Call CmdClearDepthStencilImage with color image
14701 m_errorMonitor->SetDesiredFailureMsg(
14702 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14703 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
14704
14705 vkCmdClearDepthStencilImage(
14706 m_commandBuffer->GetBufferHandle(), color_image.handle(),
14707 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
14708 &ds_range);
14709
14710 m_errorMonitor->VerifyFound();
14711}
Tobin Ehliscde08892015-09-22 10:11:37 -060014712#endif // IMAGE_TESTS
14713
Tony Barbour300a6082015-04-07 13:44:53 -060014714int main(int argc, char **argv) {
14715 int result;
14716
Cody Northrop8e54a402016-03-08 22:25:52 -070014717#ifdef ANDROID
14718 int vulkanSupport = InitVulkan();
14719 if (vulkanSupport == 0)
14720 return 1;
14721#endif
14722
Tony Barbour300a6082015-04-07 13:44:53 -060014723 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060014724 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060014725
14726 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
14727
14728 result = RUN_ALL_TESTS();
14729
Tony Barbour6918cd52015-04-09 12:58:51 -060014730 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060014731 return result;
14732}