blob: c6bbda471a4ea41de543d62f4a639a420cac9a86 [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 Lobodzinskicf0ae752016-06-23 10:02:24 -0600255 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700256 void QueueCommandBuffer(const VkFence &fence) {
257 m_commandBuffer->QueueCommandBuffer(fence);
258 }
259 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
260 VkDeviceSize offset, uint32_t binding) {
261 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
262 }
263 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
264 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
265 }
266
267 protected:
268 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600269 bool m_enableWSI;
Tony Barbour300a6082015-04-07 13:44:53 -0600270
271 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600272 std::vector<const char *> instance_layer_names;
273 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600274 std::vector<const char *> instance_extension_names;
275 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600276
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700277 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600278 /*
279 * Since CreateDbgMsgCallback is an instance level extension call
280 * any extension / layer that utilizes that feature also needs
281 * to be enabled at create instance time.
282 */
Karl Schultz6addd812016-02-02 17:17:23 -0700283 // Use Threading layer first to protect others from
284 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700285 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600286 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800287 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700288 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800289 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
290 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_device_limits");
299 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600300 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700301 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600302
Ian Elliott2c1daf52016-05-12 09:41:46 -0600303 if (m_enableWSI) {
304 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
305 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
306#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
307#if defined(VK_USE_PLATFORM_ANDROID_KHR)
308 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
309#endif // VK_USE_PLATFORM_ANDROID_KHR
310#if defined(VK_USE_PLATFORM_MIR_KHR)
311 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
312#endif // VK_USE_PLATFORM_MIR_KHR
313#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
314 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
315#endif // VK_USE_PLATFORM_WAYLAND_KHR
316#if defined(VK_USE_PLATFORM_WIN32_KHR)
317 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
318#endif // VK_USE_PLATFORM_WIN32_KHR
319#endif // NEED_TO_TEST_THIS_ON_PLATFORM
320#if defined(VK_USE_PLATFORM_XCB_KHR)
321 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
322#elif defined(VK_USE_PLATFORM_XLIB_KHR)
323 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
324#endif // VK_USE_PLATFORM_XLIB_KHR
325 }
326
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600327 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600328 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800329 this->app_info.pApplicationName = "layer_tests";
330 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600331 this->app_info.pEngineName = "unittest";
332 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600333 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600334
Tony Barbour15524c32015-04-29 17:34:29 -0600335 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600336 InitFramework(instance_layer_names, device_layer_names,
337 instance_extension_names, device_extension_names,
338 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600339 }
340
341 virtual void TearDown() {
342 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600343 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600344 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600345 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600346
347 VkLayerTest() {
348 m_enableWSI = false;
349 }
Tony Barbour300a6082015-04-07 13:44:53 -0600350};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500351
Karl Schultz6addd812016-02-02 17:17:23 -0700352VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600353 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600354
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800355 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600356
357 /*
358 * For render test all drawing happens in a single render pass
359 * on a single command buffer.
360 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200361 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800362 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600363 }
364
365 return result;
366}
367
Karl Schultz6addd812016-02-02 17:17:23 -0700368VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600369 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600370
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200371 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800372 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200373 }
Tony Barbour300a6082015-04-07 13:44:53 -0600374
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800375 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600376
377 return result;
378}
379
Karl Schultz6addd812016-02-02 17:17:23 -0700380void VkLayerTest::VKTriangleTest(const char *vertShaderText,
381 const char *fragShaderText,
382 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500383 // Create identity matrix
384 int i;
385 struct vktriangle_vs_uniform data;
386
387 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700388 glm::mat4 View = glm::mat4(1.0f);
389 glm::mat4 Model = glm::mat4(1.0f);
390 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500391 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700392 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500393
394 memcpy(&data.mvp, &MVP[0][0], matrixSize);
395
Karl Schultz6addd812016-02-02 17:17:23 -0700396 static const Vertex tri_data[] = {
397 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
398 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
399 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500400 };
401
Karl Schultz6addd812016-02-02 17:17:23 -0700402 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500403 data.position[i][0] = tri_data[i].posX;
404 data.position[i][1] = tri_data[i].posY;
405 data.position[i][2] = tri_data[i].posZ;
406 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700407 data.color[i][0] = tri_data[i].r;
408 data.color[i][1] = tri_data[i].g;
409 data.color[i][2] = tri_data[i].b;
410 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500411 }
412
413 ASSERT_NO_FATAL_FAILURE(InitState());
414 ASSERT_NO_FATAL_FAILURE(InitViewport());
415
Karl Schultz6addd812016-02-02 17:17:23 -0700416 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
417 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500418
Karl Schultz6addd812016-02-02 17:17:23 -0700419 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
420 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
421 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500422
423 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800424 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500425 pipelineobj.AddShader(&vs);
426 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600427 if (failMask & BsoFailLineWidth) {
428 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600429 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
430 ia_state.sType =
431 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
432 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
433 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600434 }
435 if (failMask & BsoFailDepthBias) {
436 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600437 VkPipelineRasterizationStateCreateInfo rs_state = {};
438 rs_state.sType =
439 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
440 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600441 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600442 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600443 }
Karl Schultz6addd812016-02-02 17:17:23 -0700444 // Viewport and scissors must stay in synch or other errors will occur than
445 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600446 if (failMask & BsoFailViewport) {
447 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600448 m_viewports.clear();
449 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600450 }
451 if (failMask & BsoFailScissor) {
452 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600453 m_scissors.clear();
454 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600455 }
456 if (failMask & BsoFailBlend) {
457 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600458 VkPipelineColorBlendAttachmentState att_state = {};
459 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
460 att_state.blendEnable = VK_TRUE;
461 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600462 }
463 if (failMask & BsoFailDepthBounds) {
464 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
465 }
466 if (failMask & BsoFailStencilReadMask) {
467 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
468 }
469 if (failMask & BsoFailStencilWriteMask) {
470 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
471 }
472 if (failMask & BsoFailStencilReference) {
473 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
474 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500475
476 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700477 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
478 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500479
480 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600481 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500482
Tony Barbourfe3351b2015-07-28 10:17:20 -0600483 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500484
485 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600486 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500487
Mark Muellerd4914412016-06-13 17:52:06 -0600488 if (failMask & BsoFailCmdClearAttachments) {
489 VkClearAttachment color_attachment = {};
490 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
491 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
492 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
493
494 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
495 &color_attachment, 1, &clear_rect);
496 }
497
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500498 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600499 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500500
Tony Barbourfe3351b2015-07-28 10:17:20 -0600501 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500502}
503
Karl Schultz6addd812016-02-02 17:17:23 -0700504void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
505 VkPipelineObj &pipelineobj,
506 VkDescriptorSetObj &descriptorSet,
507 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500508 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700509 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
510 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500511 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700512 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
513 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500514 }
515
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800516 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700517 // Make sure depthWriteEnable is set so that Depth fail test will work
518 // correctly
519 // Make sure stencilTestEnable is set so that Stencil fail test will work
520 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600521 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800522 stencil.failOp = VK_STENCIL_OP_KEEP;
523 stencil.passOp = VK_STENCIL_OP_KEEP;
524 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
525 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600526
527 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
528 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600529 ds_ci.pNext = NULL;
530 ds_ci.depthTestEnable = VK_FALSE;
531 ds_ci.depthWriteEnable = VK_TRUE;
532 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
533 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600534 if (failMask & BsoFailDepthBounds) {
535 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600536 ds_ci.maxDepthBounds = 0.0f;
537 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600538 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600539 ds_ci.stencilTestEnable = VK_TRUE;
540 ds_ci.front = stencil;
541 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600542
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600543 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600544 pipelineobj.SetViewport(m_viewports);
545 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800546 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700547 VkResult err = pipelineobj.CreateVKPipeline(
548 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600549 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800550 commandBuffer->BindPipeline(pipelineobj);
551 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500552}
553
Ian Elliott2c1daf52016-05-12 09:41:46 -0600554class VkWsiEnabledLayerTest : public VkLayerTest {
555 public:
556protected:
557 VkWsiEnabledLayerTest() {
558 m_enableWSI = true;
559 }
560};
561
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500562// ********************************************************************************************************************
563// ********************************************************************************************************************
564// ********************************************************************************************************************
565// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600566#if PARAMETER_VALIDATION_TESTS
567TEST_F(VkLayerTest, RequiredParameter) {
568 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
569 "pointer, array, and array count parameters");
570
571 ASSERT_NO_FATAL_FAILURE(InitState());
572
573 m_errorMonitor->SetDesiredFailureMsg(
574 VK_DEBUG_REPORT_ERROR_BIT_EXT,
575 "required parameter pFeatures specified as NULL");
576 // Specify NULL for a pointer to a handle
577 // Expected to trigger an error with
578 // parameter_validation::validate_required_pointer
579 vkGetPhysicalDeviceFeatures(gpu(), NULL);
580 m_errorMonitor->VerifyFound();
581
582 m_errorMonitor->SetDesiredFailureMsg(
583 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600584 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600585 // Specify NULL for pointer to array count
586 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600587 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600588 m_errorMonitor->VerifyFound();
589
590 m_errorMonitor->SetDesiredFailureMsg(
591 VK_DEBUG_REPORT_ERROR_BIT_EXT,
592 "parameter viewportCount must be greater than 0");
593 // Specify 0 for a required array count
594 // Expected to trigger an error with parameter_validation::validate_array
595 VkViewport view_port = {};
596 m_commandBuffer->SetViewport(0, 0, &view_port);
597 m_errorMonitor->VerifyFound();
598
599 m_errorMonitor->SetDesiredFailureMsg(
600 VK_DEBUG_REPORT_ERROR_BIT_EXT,
601 "required parameter pViewports specified as NULL");
602 // Specify NULL for a required array
603 // Expected to trigger an error with parameter_validation::validate_array
604 m_commandBuffer->SetViewport(0, 1, NULL);
605 m_errorMonitor->VerifyFound();
606
607 m_errorMonitor->SetDesiredFailureMsg(
608 VK_DEBUG_REPORT_ERROR_BIT_EXT,
609 "required parameter memory specified as VK_NULL_HANDLE");
610 // Specify VK_NULL_HANDLE for a required handle
611 // Expected to trigger an error with
612 // parameter_validation::validate_required_handle
613 vkUnmapMemory(device(), VK_NULL_HANDLE);
614 m_errorMonitor->VerifyFound();
615
616 m_errorMonitor->SetDesiredFailureMsg(
617 VK_DEBUG_REPORT_ERROR_BIT_EXT,
618 "required parameter pFences[0] specified as VK_NULL_HANDLE");
619 // Specify VK_NULL_HANDLE for a required handle array entry
620 // Expected to trigger an error with
621 // parameter_validation::validate_required_handle_array
622 VkFence fence = VK_NULL_HANDLE;
623 vkResetFences(device(), 1, &fence);
624 m_errorMonitor->VerifyFound();
625
626 m_errorMonitor->SetDesiredFailureMsg(
627 VK_DEBUG_REPORT_ERROR_BIT_EXT,
628 "required parameter pAllocateInfo specified as NULL");
629 // Specify NULL for a required struct pointer
630 // Expected to trigger an error with
631 // parameter_validation::validate_struct_type
632 VkDeviceMemory memory = VK_NULL_HANDLE;
633 vkAllocateMemory(device(), NULL, NULL, &memory);
634 m_errorMonitor->VerifyFound();
635
636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
637 "value of faceMask must not be 0");
638 // Specify 0 for a required VkFlags parameter
639 // Expected to trigger an error with parameter_validation::validate_flags
640 m_commandBuffer->SetStencilReference(0, 0);
641 m_errorMonitor->VerifyFound();
642
643 m_errorMonitor->SetDesiredFailureMsg(
644 VK_DEBUG_REPORT_ERROR_BIT_EXT,
645 "value of pSubmits[i].pWaitDstStageMask[0] must not be 0");
646 // Specify 0 for a required VkFlags array entry
647 // Expected to trigger an error with
648 // parameter_validation::validate_flags_array
649 VkSemaphore semaphore = VK_NULL_HANDLE;
650 VkPipelineStageFlags stageFlags = 0;
651 VkSubmitInfo submitInfo = {};
652 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
653 submitInfo.waitSemaphoreCount = 1;
654 submitInfo.pWaitSemaphores = &semaphore;
655 submitInfo.pWaitDstStageMask = &stageFlags;
656 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
657 m_errorMonitor->VerifyFound();
658}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600659
Dustin Gravesfce74c02016-05-10 11:42:58 -0600660TEST_F(VkLayerTest, ReservedParameter) {
661 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
662
663 ASSERT_NO_FATAL_FAILURE(InitState());
664
665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
666 " must be 0");
667 // Specify 0 for a reserved VkFlags parameter
668 // Expected to trigger an error with
669 // parameter_validation::validate_reserved_flags
670 VkEvent event_handle = VK_NULL_HANDLE;
671 VkEventCreateInfo event_info = {};
672 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
673 event_info.flags = 1;
674 vkCreateEvent(device(), &event_info, NULL, &event_handle);
675 m_errorMonitor->VerifyFound();
676}
677
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600678TEST_F(VkLayerTest, InvalidStructSType) {
679 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
680 "structure's sType field");
681
682 ASSERT_NO_FATAL_FAILURE(InitState());
683
684 m_errorMonitor->SetDesiredFailureMsg(
685 VK_DEBUG_REPORT_ERROR_BIT_EXT,
686 "parameter pAllocateInfo->sType must be");
687 // Zero struct memory, effectively setting sType to
688 // VK_STRUCTURE_TYPE_APPLICATION_INFO
689 // Expected to trigger an error with
690 // parameter_validation::validate_struct_type
691 VkMemoryAllocateInfo alloc_info = {};
692 VkDeviceMemory memory = VK_NULL_HANDLE;
693 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
694 m_errorMonitor->VerifyFound();
695
696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
697 "parameter pSubmits[0].sType must be");
698 // Zero struct memory, effectively setting sType to
699 // VK_STRUCTURE_TYPE_APPLICATION_INFO
700 // Expected to trigger an error with
701 // parameter_validation::validate_struct_type_array
702 VkSubmitInfo submit_info = {};
703 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
704 m_errorMonitor->VerifyFound();
705}
706
707TEST_F(VkLayerTest, InvalidStructPNext) {
708 TEST_DESCRIPTION(
709 "Specify an invalid value for a Vulkan structure's pNext field");
710
711 ASSERT_NO_FATAL_FAILURE(InitState());
712
713 m_errorMonitor->SetDesiredFailureMsg(
714 VK_DEBUG_REPORT_ERROR_BIT_EXT,
715 "value of pAllocateInfo->pNext must be NULL");
716 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be
717 // NULL
718 // Expected to trigger an error with
719 // parameter_validation::validate_struct_pnext
720 VkDeviceMemory memory = VK_NULL_HANDLE;
721 // Zero-initialization will provide the correct sType
722 VkApplicationInfo app_info = {};
Dustin Graves47b6cba2016-05-10 17:34:38 -0600723 VkMemoryAllocateInfo memory_alloc_info = {};
724 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
725 memory_alloc_info.pNext = &app_info;
726 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600727 m_errorMonitor->VerifyFound();
728
Dustin Graves47b6cba2016-05-10 17:34:38 -0600729 m_errorMonitor->SetDesiredFailureMsg(
730 VK_DEBUG_REPORT_ERROR_BIT_EXT,
731 " chain includes a structure with unexpected VkStructureType ");
732 // Set VkGraphicsPipelineCreateInfo::VkPipelineRasterizationStateCreateInfo::pNext to an invalid structure, when pNext is allowed to be a non-NULL value
733 // Expected to trigger an error with
734 // parameter_validation::validate_struct_pnext
735 VkDescriptorPoolSize ds_type_count = {};
736 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
737 ds_type_count.descriptorCount = 1;
738
739 VkDescriptorPoolCreateInfo ds_pool_ci = {};
740 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
741 ds_pool_ci.pNext = NULL;
742 ds_pool_ci.maxSets = 1;
743 ds_pool_ci.poolSizeCount = 1;
744 ds_pool_ci.pPoolSizes = &ds_type_count;
745
746 VkDescriptorPool ds_pool;
747 VkResult err =
748 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
749 ASSERT_VK_SUCCESS(err);
750
751 VkDescriptorSetLayoutBinding dsl_binding = {};
752 dsl_binding.binding = 0;
753 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
754 dsl_binding.descriptorCount = 1;
755 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
756 dsl_binding.pImmutableSamplers = NULL;
757
758 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
759 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
760 ds_layout_ci.pNext = NULL;
761 ds_layout_ci.bindingCount = 1;
762 ds_layout_ci.pBindings = &dsl_binding;
763
764 VkDescriptorSetLayout ds_layout;
765 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
766 &ds_layout);
767 ASSERT_VK_SUCCESS(err);
768
769 VkDescriptorSet descriptorSet;
770 VkDescriptorSetAllocateInfo ds_alloc_info = {};
771 ds_alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
772 ds_alloc_info.descriptorSetCount = 1;
773 ds_alloc_info.descriptorPool = ds_pool;
774 ds_alloc_info.pSetLayouts = &ds_layout;
775 err = vkAllocateDescriptorSets(m_device->device(), &ds_alloc_info,
776 &descriptorSet);
777 ASSERT_VK_SUCCESS(err);
778
779 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
780 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
781 pipeline_layout_ci.setLayoutCount = 1;
782 pipeline_layout_ci.pSetLayouts = &ds_layout;
783
784 VkPipelineLayout pipeline_layout;
785 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
786 &pipeline_layout);
787 ASSERT_VK_SUCCESS(err);
788
789 VkViewport vp = {}; // Just need dummy vp to point to
790 VkRect2D sc = {}; // dummy scissor to point to
791
792 VkPipelineViewportStateCreateInfo vp_state_ci = {};
793 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
794 vp_state_ci.scissorCount = 1;
795 vp_state_ci.pScissors = &sc;
796 vp_state_ci.viewportCount = 1;
797 vp_state_ci.pViewports = &vp;
798
799 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
800 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
801 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
802 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
803 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
804 rs_state_ci.depthClampEnable = VK_FALSE;
805 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
806 rs_state_ci.depthBiasEnable = VK_FALSE;
807
808 VkGraphicsPipelineCreateInfo gp_ci = {};
809 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
810 gp_ci.pViewportState = &vp_state_ci;
811 gp_ci.pRasterizationState = &rs_state_ci;
812 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
813 gp_ci.layout = pipeline_layout;
814 gp_ci.renderPass = renderPass();
815
816 VkPipelineCacheCreateInfo pc_ci = {};
817 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
818 pc_ci.initialDataSize = 0;
819 pc_ci.pInitialData = 0;
820
821 VkPipeline pipeline;
822 VkPipelineCache pipelineCache;
823
824 err =
825 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
826 ASSERT_VK_SUCCESS(err);
827
828 // Set VkPipelineRasterizationStateCreateInfo::pNext to an invalid value
829 VkApplicationInfo invalid_pnext_struct = {};
830 rs_state_ci.pNext = &invalid_pnext_struct;
831
832 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
833 &gp_ci, NULL, &pipeline);
834 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -0600835 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
836 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
837 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
838 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
839
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600840}
Dustin Graves5d33d532016-05-09 16:21:12 -0600841
842TEST_F(VkLayerTest, UnrecognizedValue) {
843 TEST_DESCRIPTION(
844 "Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
845
846 ASSERT_NO_FATAL_FAILURE(InitState());
847
848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
849 "does not fall within the begin..end "
850 "range of the core VkFormat "
851 "enumeration tokens");
852 // Specify an invalid VkFormat value
853 // Expected to trigger an error with
854 // parameter_validation::validate_ranged_enum
855 VkFormatProperties format_properties;
856 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000),
857 &format_properties);
858 m_errorMonitor->VerifyFound();
859
860 m_errorMonitor->SetDesiredFailureMsg(
861 VK_DEBUG_REPORT_ERROR_BIT_EXT,
862 "contains flag bits that are not recognized members of");
863 // Specify an invalid VkFlags bitmask value
864 // Expected to trigger an error with parameter_validation::validate_flags
865 VkImageFormatProperties image_format_properties;
866 vkGetPhysicalDeviceImageFormatProperties(
867 gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D,
868 VK_IMAGE_TILING_OPTIMAL, static_cast<VkImageUsageFlags>(1 << 25), 0,
869 &image_format_properties);
870 m_errorMonitor->VerifyFound();
871
872 m_errorMonitor->SetDesiredFailureMsg(
873 VK_DEBUG_REPORT_ERROR_BIT_EXT,
874 "contains flag bits that are not recognized members of");
875 // Specify an invalid VkFlags array entry
876 // Expected to trigger an error with
877 // parameter_validation::validate_flags_array
878 VkSemaphore semaphore = VK_NULL_HANDLE;
879 VkPipelineStageFlags stage_flags =
880 static_cast<VkPipelineStageFlags>(1 << 25);
881 VkSubmitInfo submit_info = {};
882 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
883 submit_info.waitSemaphoreCount = 1;
884 submit_info.pWaitSemaphores = &semaphore;
885 submit_info.pWaitDstStageMask = &stage_flags;
886 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
887 m_errorMonitor->VerifyFound();
888
889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
890 "is neither VK_TRUE nor VK_FALSE");
891 // Specify an invalid VkBool32 value
892 // Expected to trigger a warning with
893 // parameter_validation::validate_bool32
894 VkSampler sampler = VK_NULL_HANDLE;
895 VkSamplerCreateInfo sampler_info = {};
896 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
897 sampler_info.pNext = NULL;
898 sampler_info.magFilter = VK_FILTER_NEAREST;
899 sampler_info.minFilter = VK_FILTER_NEAREST;
900 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
901 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
902 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
903 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
904 sampler_info.mipLodBias = 1.0;
905 sampler_info.maxAnisotropy = 1;
906 sampler_info.compareEnable = VK_FALSE;
907 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
908 sampler_info.minLod = 1.0;
909 sampler_info.maxLod = 1.0;
910 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
911 sampler_info.unnormalizedCoordinates = VK_FALSE;
912 // Not VK_TRUE or VK_FALSE
913 sampler_info.anisotropyEnable = 3;
914 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
915 m_errorMonitor->VerifyFound();
916}
Dustin Gravesfce74c02016-05-10 11:42:58 -0600917
918TEST_F(VkLayerTest, FailedReturnValue) {
919 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
920
921 ASSERT_NO_FATAL_FAILURE(InitState());
922
Dustin Graves13c1e2b2016-05-16 15:31:02 -0600923 // Find an unsupported image format
924 VkFormat unsupported = VK_FORMAT_UNDEFINED;
925 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
926 VkFormat format = static_cast<VkFormat>(f);
927 VkFormatProperties fProps = m_device->format_properties(format);
928 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
929 fProps.optimalTilingFeatures == 0) {
930 unsupported = format;
931 break;
932 }
933 }
934
935 if (unsupported != VK_FORMAT_UNDEFINED) {
936 m_errorMonitor->SetDesiredFailureMsg(
937 VK_DEBUG_REPORT_WARNING_BIT_EXT,
938 "the requested format is not supported on this device");
939 // Specify an unsupported VkFormat value to generate a
940 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
941 // Expected to trigger a warning from
942 // parameter_validation::validate_result
943 VkImageFormatProperties image_format_properties;
944 VkResult err = vkGetPhysicalDeviceImageFormatProperties(
945 gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
946 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
947 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
948 m_errorMonitor->VerifyFound();
949 }
Dustin Gravesfce74c02016-05-10 11:42:58 -0600950}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -0600951
952TEST_F(VkLayerTest, UpdateBufferAlignment) {
953 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
954 uint32_t updateData[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
955
956 ASSERT_NO_FATAL_FAILURE(InitState());
957
958 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
959 vk_testing::Buffer buffer;
960 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
961
962 BeginCommandBuffer();
963 // Introduce failure by using dstOffset that is not multiple of 4
964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
965 " is not a multiple of 4");
966 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
967 m_errorMonitor->VerifyFound();
968
969 // Introduce failure by using dataSize that is not multiple of 4
970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
971 " is not a multiple of 4");
972 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
973 m_errorMonitor->VerifyFound();
974
975 // Introduce failure by using dataSize that is < 0
976 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
977 "must be greater than zero and less than or equal to 65536");
978 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
979 m_errorMonitor->VerifyFound();
980
981 // Introduce failure by using dataSize that is > 65536
982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
983 "must be greater than zero and less than or equal to 65536");
984 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
985 m_errorMonitor->VerifyFound();
986
987 EndCommandBuffer();
988}
989
990TEST_F(VkLayerTest, FillBufferAlignment) {
991 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
992
993 ASSERT_NO_FATAL_FAILURE(InitState());
994
995 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
996 vk_testing::Buffer buffer;
997 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
998
999 BeginCommandBuffer();
1000
1001 // Introduce failure by using dstOffset that is not multiple of 4
1002 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1003 " is not a multiple of 4");
1004 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1005 m_errorMonitor->VerifyFound();
1006
1007 // Introduce failure by using size that is not multiple of 4
1008 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1009 " is not a multiple of 4");
1010 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1011 m_errorMonitor->VerifyFound();
1012
1013 // Introduce failure by using size that is zero
1014 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1015 "must be greater than zero");
1016 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1017 m_errorMonitor->VerifyFound();
1018
1019 EndCommandBuffer();
1020}
Dustin Gravesffa90fa2016-05-06 11:20:38 -06001021#endif // PARAMETER_VALIDATION_TESTS
1022
Tobin Ehlis0788f522015-05-26 16:11:58 -06001023#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001024#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001025TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001026{
1027 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001028 VkFenceCreateInfo fenceInfo = {};
1029 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1030 fenceInfo.pNext = NULL;
1031 fenceInfo.flags = 0;
1032
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001033 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001034
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001035 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001036
1037 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1038 vk_testing::Buffer buffer;
1039 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001040
Tony Barbourfe3351b2015-07-28 10:17:20 -06001041 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001042 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001043 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001044
1045 testFence.init(*m_device, fenceInfo);
1046
1047 // Bypass framework since it does the waits automatically
1048 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001049 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001050 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1051 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001052 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001053 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001054 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001055 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001056 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001057 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001058 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001059
1060 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001061 ASSERT_VK_SUCCESS( err );
1062
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001063 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001064 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001065
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001066 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001067}
1068
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001069TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001070{
1071 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001072 VkFenceCreateInfo fenceInfo = {};
1073 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1074 fenceInfo.pNext = NULL;
1075 fenceInfo.flags = 0;
1076
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001078
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001079 ASSERT_NO_FATAL_FAILURE(InitState());
1080 ASSERT_NO_FATAL_FAILURE(InitViewport());
1081 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1082
Tony Barbourfe3351b2015-07-28 10:17:20 -06001083 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001084 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001085 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001086
1087 testFence.init(*m_device, fenceInfo);
1088
1089 // Bypass framework since it does the waits automatically
1090 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001091 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001092 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1093 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001094 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001095 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001096 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001097 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001098 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001099 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001100 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001101
1102 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001103 ASSERT_VK_SUCCESS( err );
1104
Jon Ashburnf19916e2016-01-11 13:12:43 -07001105 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001106 VkCommandBufferBeginInfo info = {};
1107 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1108 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001109 info.renderPass = VK_NULL_HANDLE;
1110 info.subpass = 0;
1111 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001112 info.occlusionQueryEnable = VK_FALSE;
1113 info.queryFlags = 0;
1114 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001115
1116 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001117 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001118
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001119 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001120}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001121#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001122
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001123// This is a positive test. No failures are expected.
1124TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
1125 VkResult err;
1126 bool pass;
1127
1128 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
1129 "the buffer, create an image, and bind the same memory to "
1130 "it");
1131
1132 m_errorMonitor->ExpectSuccess();
1133
1134 ASSERT_NO_FATAL_FAILURE(InitState());
1135
1136 VkBuffer buffer;
1137 VkImage image;
1138 VkDeviceMemory mem;
1139 VkMemoryRequirements mem_reqs;
1140
1141 VkBufferCreateInfo buf_info = {};
1142 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1143 buf_info.pNext = NULL;
1144 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1145 buf_info.size = 256;
1146 buf_info.queueFamilyIndexCount = 0;
1147 buf_info.pQueueFamilyIndices = NULL;
1148 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1149 buf_info.flags = 0;
1150 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1151 ASSERT_VK_SUCCESS(err);
1152
1153 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1154
1155 VkMemoryAllocateInfo alloc_info = {};
1156 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1157 alloc_info.pNext = NULL;
1158 alloc_info.memoryTypeIndex = 0;
1159
1160 // Ensure memory is big enough for both bindings
1161 alloc_info.allocationSize = 0x10000;
1162
1163 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1164 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1165 if (!pass) {
1166 vkDestroyBuffer(m_device->device(), buffer, NULL);
1167 return;
1168 }
1169
1170 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1171 ASSERT_VK_SUCCESS(err);
1172
1173 uint8_t *pData;
1174 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1175 (void **)&pData);
1176 ASSERT_VK_SUCCESS(err);
1177
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001178 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001179
1180 vkUnmapMemory(m_device->device(), mem);
1181
1182 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1183 ASSERT_VK_SUCCESS(err);
1184
1185 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1186 // memory. In fact, it was never used by the GPU.
1187 // Just be be sure, wait for idle.
1188 vkDestroyBuffer(m_device->device(), buffer, NULL);
1189 vkDeviceWaitIdle(m_device->device());
1190
1191 VkImageCreateInfo image_create_info = {};
1192 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1193 image_create_info.pNext = NULL;
1194 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1195 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1196 image_create_info.extent.width = 64;
1197 image_create_info.extent.height = 64;
1198 image_create_info.extent.depth = 1;
1199 image_create_info.mipLevels = 1;
1200 image_create_info.arrayLayers = 1;
1201 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1202 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1203 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1204 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1205 image_create_info.queueFamilyIndexCount = 0;
1206 image_create_info.pQueueFamilyIndices = NULL;
1207 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1208 image_create_info.flags = 0;
1209
1210 VkMemoryAllocateInfo mem_alloc = {};
1211 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1212 mem_alloc.pNext = NULL;
1213 mem_alloc.allocationSize = 0;
1214 mem_alloc.memoryTypeIndex = 0;
1215
1216 /* Create a mappable image. It will be the texture if linear images are ok
1217 * to be textures or it will be the staging image if they are not.
1218 */
1219 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1220 ASSERT_VK_SUCCESS(err);
1221
1222 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1223
1224 mem_alloc.allocationSize = mem_reqs.size;
1225
1226 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
1227 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1228 if (!pass) {
1229 vkDestroyImage(m_device->device(), image, NULL);
1230 return;
1231 }
1232
Tobin Ehlis077ded32016-05-12 17:39:13 -06001233 // VALIDATION FAILURE:
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001234 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1235 ASSERT_VK_SUCCESS(err);
1236
1237 m_errorMonitor->VerifyNotFound();
1238
Tony Barbourdf4c0042016-06-01 15:55:43 -06001239 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001240 vkDestroyBuffer(m_device->device(), buffer, NULL);
1241 vkDestroyImage(m_device->device(), image, NULL);
1242}
1243
Tobin Ehlisf11be982016-05-11 13:52:53 -06001244TEST_F(VkLayerTest, InvalidMemoryAliasing) {
1245 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
1246 "buffer and image to memory such that they will alias.");
1247 VkResult err;
1248 bool pass;
1249 ASSERT_NO_FATAL_FAILURE(InitState());
1250
Tobin Ehlis077ded32016-05-12 17:39:13 -06001251 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001252 VkImage image;
1253 VkDeviceMemory mem; // buffer will be bound first
1254 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001255 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001256
1257 VkBufferCreateInfo buf_info = {};
1258 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1259 buf_info.pNext = NULL;
1260 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1261 buf_info.size = 256;
1262 buf_info.queueFamilyIndexCount = 0;
1263 buf_info.pQueueFamilyIndices = NULL;
1264 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1265 buf_info.flags = 0;
1266 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1267 ASSERT_VK_SUCCESS(err);
1268
Tobin Ehlis077ded32016-05-12 17:39:13 -06001269 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001270
1271 VkImageCreateInfo image_create_info = {};
1272 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1273 image_create_info.pNext = NULL;
1274 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1275 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1276 image_create_info.extent.width = 64;
1277 image_create_info.extent.height = 64;
1278 image_create_info.extent.depth = 1;
1279 image_create_info.mipLevels = 1;
1280 image_create_info.arrayLayers = 1;
1281 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1282 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1283 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1284 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1285 image_create_info.queueFamilyIndexCount = 0;
1286 image_create_info.pQueueFamilyIndices = NULL;
1287 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1288 image_create_info.flags = 0;
1289
Tobin Ehlisf11be982016-05-11 13:52:53 -06001290 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1291 ASSERT_VK_SUCCESS(err);
1292
Tobin Ehlis077ded32016-05-12 17:39:13 -06001293 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1294
1295 VkMemoryAllocateInfo alloc_info = {};
1296 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1297 alloc_info.pNext = NULL;
1298 alloc_info.memoryTypeIndex = 0;
1299 // Ensure memory is big enough for both bindings
1300 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
1301 pass = m_device->phy().set_memory_type(
1302 buff_mem_reqs.memoryTypeBits | img_mem_reqs.memoryTypeBits, &alloc_info,
1303 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001304 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001305 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001306 vkDestroyImage(m_device->device(), image, NULL);
1307 return;
1308 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001309 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1310 ASSERT_VK_SUCCESS(err);
1311 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1312 ASSERT_VK_SUCCESS(err);
1313
Tobin Ehlisf11be982016-05-11 13:52:53 -06001314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1315 " is aliased with buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001316 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001317 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1318 m_errorMonitor->VerifyFound();
1319
1320 // Now correctly bind image to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001321 // aliasing buffer2
1322 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1323 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001324 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1325 ASSERT_VK_SUCCESS(err);
1326 err = vkBindImageMemory(m_device->device(), image, mem_img, 0);
1327 ASSERT_VK_SUCCESS(err);
1328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1329 " is aliased with image 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001330 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001331 m_errorMonitor->VerifyFound();
1332
1333 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001334 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001335 vkDestroyImage(m_device->device(), image, NULL);
1336 vkFreeMemory(m_device->device(), mem, NULL);
1337 vkFreeMemory(m_device->device(), mem_img, NULL);
1338}
1339
Tobin Ehlis35372522016-05-12 08:32:31 -06001340TEST_F(VkLayerTest, InvalidMemoryMapping) {
1341 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1342 VkResult err;
1343 bool pass;
1344 ASSERT_NO_FATAL_FAILURE(InitState());
1345
1346 VkBuffer buffer;
1347 VkDeviceMemory mem;
1348 VkMemoryRequirements mem_reqs;
1349
1350 VkBufferCreateInfo buf_info = {};
1351 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1352 buf_info.pNext = NULL;
1353 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1354 buf_info.size = 256;
1355 buf_info.queueFamilyIndexCount = 0;
1356 buf_info.pQueueFamilyIndices = NULL;
1357 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1358 buf_info.flags = 0;
1359 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1360 ASSERT_VK_SUCCESS(err);
1361
1362 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1363 VkMemoryAllocateInfo alloc_info = {};
1364 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1365 alloc_info.pNext = NULL;
1366 alloc_info.memoryTypeIndex = 0;
1367
1368 // Ensure memory is big enough for both bindings
1369 static const VkDeviceSize allocation_size = 0x10000;
1370 alloc_info.allocationSize = allocation_size;
1371 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1372 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1373 if (!pass) {
1374 vkDestroyBuffer(m_device->device(), buffer, NULL);
1375 return;
1376 }
1377 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1378 ASSERT_VK_SUCCESS(err);
1379
1380 uint8_t *pData;
1381 // Attempt to map memory size 0 is invalid
1382 m_errorMonitor->SetDesiredFailureMsg(
1383 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1384 "VkMapMemory: Attempting to map memory range of size zero");
1385 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1386 m_errorMonitor->VerifyFound();
1387 // Map memory twice
1388 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1389 (void **)&pData);
1390 ASSERT_VK_SUCCESS(err);
1391 m_errorMonitor->SetDesiredFailureMsg(
1392 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1393 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1394 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1395 (void **)&pData);
1396 m_errorMonitor->VerifyFound();
1397
1398 // Unmap the memory to avoid re-map error
1399 vkUnmapMemory(m_device->device(), mem);
1400 // overstep allocation with VK_WHOLE_SIZE
1401 m_errorMonitor->SetDesiredFailureMsg(
1402 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1403 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1404 err = vkMapMemory(m_device->device(), mem, allocation_size + 1,
1405 VK_WHOLE_SIZE, 0, (void **)&pData);
1406 m_errorMonitor->VerifyFound();
1407 // overstep allocation w/o VK_WHOLE_SIZE
1408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1409 " oversteps total array size 0x");
1410 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0,
1411 (void **)&pData);
1412 m_errorMonitor->VerifyFound();
1413 // Now error due to unmapping memory that's not mapped
1414 m_errorMonitor->SetDesiredFailureMsg(
1415 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1416 "Unmapping Memory without memory being mapped: ");
1417 vkUnmapMemory(m_device->device(), mem);
1418 m_errorMonitor->VerifyFound();
1419 // Now map memory and cause errors due to flushing invalid ranges
1420 err = vkMapMemory(m_device->device(), mem, 16, VK_WHOLE_SIZE, 0,
1421 (void **)&pData);
1422 ASSERT_VK_SUCCESS(err);
1423 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001424 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001425 mmr.memory = mem;
1426 mmr.offset = 15; // Error b/c offset less than offset of mapped mem
1427 m_errorMonitor->SetDesiredFailureMsg(
1428 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1429 ") is less than Memory Object's offset (");
1430 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1431 m_errorMonitor->VerifyFound();
1432 // Now flush range that oversteps mapped range
1433 vkUnmapMemory(m_device->device(), mem);
1434 err = vkMapMemory(m_device->device(), mem, 0, 256, 0, (void **)&pData);
1435 ASSERT_VK_SUCCESS(err);
1436 mmr.offset = 16;
1437 mmr.size = 256; // flushing bounds (272) exceed mapped bounds (256)
1438 m_errorMonitor->SetDesiredFailureMsg(
1439 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1440 ") exceeds the Memory Object's upper-bound (");
1441 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1442 m_errorMonitor->VerifyFound();
1443
1444 pass =
1445 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1446 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1447 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
1448 if (!pass) {
1449 vkFreeMemory(m_device->device(), mem, NULL);
1450 vkDestroyBuffer(m_device->device(), buffer, NULL);
1451 return;
1452 }
1453 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1454 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1455
1456 vkDestroyBuffer(m_device->device(), buffer, NULL);
1457 vkFreeMemory(m_device->device(), mem, NULL);
1458}
1459
Ian Elliott1c32c772016-04-28 14:47:13 -06001460TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1461 VkResult err;
1462 bool pass;
1463
Ian Elliott489eec02016-05-05 14:12:44 -06001464// FIXME: After we turn on this code for non-Linux platforms, uncomment the
1465// following declaration (which is temporarily being moved below):
1466// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001467 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
1468 VkSwapchainCreateInfoKHR swapchain_create_info = {};
1469 uint32_t swapchain_image_count = 0;
1470// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
1471 uint32_t image_index = 0;
1472// VkPresentInfoKHR present_info = {};
1473
1474 ASSERT_NO_FATAL_FAILURE(InitState());
1475
Ian Elliott3f06ce52016-04-29 14:46:21 -06001476#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1477#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1478 // Use the functions from the VK_KHR_android_surface extension without
1479 // enabling that extension:
1480
1481 // Create a surface:
1482 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06001483 m_errorMonitor->SetDesiredFailureMsg(
1484 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1485 "extension was not enabled for this");
1486 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
1487 &surface);
1488 pass = (err != VK_SUCCESS);
1489 ASSERT_TRUE(pass);
1490 m_errorMonitor->VerifyFound();
1491#endif // VK_USE_PLATFORM_ANDROID_KHR
1492
1493
1494#if defined(VK_USE_PLATFORM_MIR_KHR)
1495 // Use the functions from the VK_KHR_mir_surface extension without enabling
1496 // that extension:
1497
1498 // Create a surface:
1499 VkMirSurfaceCreateInfoKHR mir_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06001500 m_errorMonitor->SetDesiredFailureMsg(
1501 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1502 "extension was not enabled for this");
1503 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1504 pass = (err != VK_SUCCESS);
1505 ASSERT_TRUE(pass);
1506 m_errorMonitor->VerifyFound();
1507
1508 // Tell whether an mir_connection supports presentation:
1509 MirConnection *mir_connection = NULL;
1510 m_errorMonitor->SetDesiredFailureMsg(
1511 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1512 "extension was not enabled for this");
1513 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
1514 visual_id);
1515 m_errorMonitor->VerifyFound();
1516#endif // VK_USE_PLATFORM_MIR_KHR
1517
1518
1519#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1520 // Use the functions from the VK_KHR_wayland_surface extension without
1521 // enabling that extension:
1522
1523 // Create a surface:
1524 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06001525 m_errorMonitor->SetDesiredFailureMsg(
1526 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1527 "extension was not enabled for this");
1528 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
1529 &surface);
1530 pass = (err != VK_SUCCESS);
1531 ASSERT_TRUE(pass);
1532 m_errorMonitor->VerifyFound();
1533
1534 // Tell whether an wayland_display supports presentation:
1535 struct wl_display wayland_display = {};
1536 m_errorMonitor->SetDesiredFailureMsg(
1537 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1538 "extension was not enabled for this");
1539 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
1540 &wayland_display);
1541 m_errorMonitor->VerifyFound();
1542#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06001543#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001544
1545
1546#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06001547// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1548// TO NON-LINUX PLATFORMS:
1549VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001550 // Use the functions from the VK_KHR_win32_surface extension without
1551 // enabling that extension:
1552
1553 // Create a surface:
1554 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06001555 m_errorMonitor->SetDesiredFailureMsg(
1556 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1557 "extension was not enabled for this");
1558 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
1559 &surface);
1560 pass = (err != VK_SUCCESS);
1561 ASSERT_TRUE(pass);
1562 m_errorMonitor->VerifyFound();
1563
1564 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001565 m_errorMonitor->SetDesiredFailureMsg(
1566 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1567 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001568 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001569 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001570// Set this (for now, until all platforms are supported and tested):
1571#define NEED_TO_TEST_THIS_ON_PLATFORM
1572#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001573
1574
Ian Elliott1c32c772016-04-28 14:47:13 -06001575#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06001576// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1577// TO NON-LINUX PLATFORMS:
1578VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001579 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1580 // that extension:
1581
1582 // Create a surface:
1583 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001584 m_errorMonitor->SetDesiredFailureMsg(
1585 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1586 "extension was not enabled for this");
1587 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1588 pass = (err != VK_SUCCESS);
1589 ASSERT_TRUE(pass);
1590 m_errorMonitor->VerifyFound();
1591
1592 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001593 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001594 xcb_visualid_t visual_id = 0;
1595 m_errorMonitor->SetDesiredFailureMsg(
1596 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1597 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001598 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06001599 visual_id);
1600 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001601// Set this (for now, until all platforms are supported and tested):
1602#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001603#endif // VK_USE_PLATFORM_XCB_KHR
1604
1605
Ian Elliott12630812016-04-29 14:35:43 -06001606#if defined(VK_USE_PLATFORM_XLIB_KHR)
1607 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1608 // that extension:
1609
1610 // Create a surface:
1611 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
Ian Elliott12630812016-04-29 14:35:43 -06001612 m_errorMonitor->SetDesiredFailureMsg(
1613 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1614 "extension was not enabled for this");
1615 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1616 pass = (err != VK_SUCCESS);
1617 ASSERT_TRUE(pass);
1618 m_errorMonitor->VerifyFound();
1619
1620 // Tell whether an Xlib VisualID supports presentation:
1621 Display *dpy = NULL;
1622 VisualID visual = 0;
1623 m_errorMonitor->SetDesiredFailureMsg(
1624 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1625 "extension was not enabled for this");
1626 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1627 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001628// Set this (for now, until all platforms are supported and tested):
1629#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06001630#endif // VK_USE_PLATFORM_XLIB_KHR
1631
1632
Ian Elliott1c32c772016-04-28 14:47:13 -06001633 // Use the functions from the VK_KHR_surface extension without enabling
1634 // that extension:
1635
Ian Elliott489eec02016-05-05 14:12:44 -06001636#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001637 // Destroy a surface:
1638 m_errorMonitor->SetDesiredFailureMsg(
1639 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1640 "extension was not enabled for this");
1641 vkDestroySurfaceKHR(instance(), surface, NULL);
1642 m_errorMonitor->VerifyFound();
1643
1644 // Check if surface supports presentation:
1645 VkBool32 supported = false;
1646 m_errorMonitor->SetDesiredFailureMsg(
1647 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1648 "extension was not enabled for this");
1649 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1650 pass = (err != VK_SUCCESS);
1651 ASSERT_TRUE(pass);
1652 m_errorMonitor->VerifyFound();
1653
1654 // Check surface capabilities:
1655 VkSurfaceCapabilitiesKHR capabilities = {};
1656 m_errorMonitor->SetDesiredFailureMsg(
1657 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1658 "extension was not enabled for this");
1659 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
1660 &capabilities);
1661 pass = (err != VK_SUCCESS);
1662 ASSERT_TRUE(pass);
1663 m_errorMonitor->VerifyFound();
1664
1665 // Check surface formats:
1666 uint32_t format_count = 0;
1667 VkSurfaceFormatKHR *formats = NULL;
1668 m_errorMonitor->SetDesiredFailureMsg(
1669 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1670 "extension was not enabled for this");
1671 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1672 &format_count, formats);
1673 pass = (err != VK_SUCCESS);
1674 ASSERT_TRUE(pass);
1675 m_errorMonitor->VerifyFound();
1676
1677 // Check surface present modes:
1678 uint32_t present_mode_count = 0;
1679 VkSurfaceFormatKHR *present_modes = NULL;
1680 m_errorMonitor->SetDesiredFailureMsg(
1681 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1682 "extension was not enabled for this");
1683 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1684 &present_mode_count, present_modes);
1685 pass = (err != VK_SUCCESS);
1686 ASSERT_TRUE(pass);
1687 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001688#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001689
1690
1691 // Use the functions from the VK_KHR_swapchain extension without enabling
1692 // that extension:
1693
1694 // Create a swapchain:
1695 m_errorMonitor->SetDesiredFailureMsg(
1696 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1697 "extension was not enabled for this");
1698 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1699 swapchain_create_info.pNext = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001700 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1701 NULL, &swapchain);
1702 pass = (err != VK_SUCCESS);
1703 ASSERT_TRUE(pass);
1704 m_errorMonitor->VerifyFound();
1705
1706 // Get the images from the swapchain:
1707 m_errorMonitor->SetDesiredFailureMsg(
1708 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1709 "extension was not enabled for this");
1710 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
1711 &swapchain_image_count, NULL);
1712 pass = (err != VK_SUCCESS);
1713 ASSERT_TRUE(pass);
1714 m_errorMonitor->VerifyFound();
1715
1716 // Try to acquire an image:
1717 m_errorMonitor->SetDesiredFailureMsg(
1718 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1719 "extension was not enabled for this");
1720 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
1721 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
1722 pass = (err != VK_SUCCESS);
1723 ASSERT_TRUE(pass);
1724 m_errorMonitor->VerifyFound();
1725
1726 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001727 //
1728 // NOTE: Currently can't test this because a real swapchain is needed (as
1729 // opposed to the fake one we created) in order for the layer to lookup the
1730 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001731
1732 // Destroy the swapchain:
1733 m_errorMonitor->SetDesiredFailureMsg(
1734 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1735 "extension was not enabled for this");
1736 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1737 m_errorMonitor->VerifyFound();
1738}
1739
Ian Elliott2c1daf52016-05-12 09:41:46 -06001740TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
Ian Elliott2c1daf52016-05-12 09:41:46 -06001741
Dustin Graves6c6d8982016-05-17 10:09:21 -06001742#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott2c1daf52016-05-12 09:41:46 -06001743 VkSurfaceKHR surface = VK_NULL_HANDLE;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001744
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001745 VkResult err;
1746 bool pass;
Ian Elliott2c1daf52016-05-12 09:41:46 -06001747 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
1748 VkSwapchainCreateInfoKHR swapchain_create_info = {};
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001749 // uint32_t swapchain_image_count = 0;
1750 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
1751 // uint32_t image_index = 0;
1752 // VkPresentInfoKHR present_info = {};
Ian Elliott2c1daf52016-05-12 09:41:46 -06001753
1754 ASSERT_NO_FATAL_FAILURE(InitState());
1755
1756 // Use the create function from one of the VK_KHR_*_surface extension in
1757 // order to create a surface, testing all known errors in the process,
1758 // before successfully creating a surface:
1759 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1761 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06001762 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
1763 pass = (err != VK_SUCCESS);
1764 ASSERT_TRUE(pass);
1765 m_errorMonitor->VerifyFound();
1766
1767 // Next, try to create a surface with the wrong
1768 // VkXcbSurfaceCreateInfoKHR::sType:
1769 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
1770 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1772 "called with the wrong value for");
Ian Elliott2c1daf52016-05-12 09:41:46 -06001773 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1774 pass = (err != VK_SUCCESS);
1775 ASSERT_TRUE(pass);
1776 m_errorMonitor->VerifyFound();
1777
Ian Elliott2c1daf52016-05-12 09:41:46 -06001778 // Create a native window, and then correctly create a surface:
1779 xcb_connection_t *connection;
1780 xcb_screen_t *screen;
1781 xcb_window_t xcb_window;
1782 xcb_intern_atom_reply_t *atom_wm_delete_window;
1783
1784 const xcb_setup_t *setup;
1785 xcb_screen_iterator_t iter;
1786 int scr;
1787 uint32_t value_mask, value_list[32];
1788 int width = 1;
1789 int height = 1;
1790
1791 connection = xcb_connect(NULL, &scr);
1792 ASSERT_TRUE(connection != NULL);
1793 setup = xcb_get_setup(connection);
1794 iter = xcb_setup_roots_iterator(setup);
1795 while (scr-- > 0)
1796 xcb_screen_next(&iter);
1797 screen = iter.data;
1798
1799 xcb_window = xcb_generate_id(connection);
1800
1801 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
1802 value_list[0] = screen->black_pixel;
1803 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE |
1804 XCB_EVENT_MASK_STRUCTURE_NOTIFY;
1805
1806 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window,
1807 screen->root, 0, 0, width, height, 0,
1808 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual,
1809 value_mask, value_list);
1810
1811 /* Magic code that will send notification when window is destroyed */
1812 xcb_intern_atom_cookie_t cookie =
1813 xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
1814 xcb_intern_atom_reply_t *reply =
1815 xcb_intern_atom_reply(connection, cookie, 0);
1816
1817 xcb_intern_atom_cookie_t cookie2 =
1818 xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001819 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
Ian Elliott2c1daf52016-05-12 09:41:46 -06001820 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window,
1821 (*reply).atom, 4, 32, 1,
1822 &(*atom_wm_delete_window).atom);
1823 free(reply);
1824
1825 xcb_map_window(connection, xcb_window);
1826
1827 // Force the x/y coordinates to 100,100 results are identical in consecutive
1828 // runs
1829 const uint32_t coords[] = {100, 100};
1830 xcb_configure_window(connection, xcb_window,
1831 XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
1832
Ian Elliott2c1daf52016-05-12 09:41:46 -06001833 // Finally, try to correctly create a surface:
1834 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
1835 xcb_create_info.pNext = NULL;
1836 xcb_create_info.flags = 0;
1837 xcb_create_info.connection = connection;
1838 xcb_create_info.window = xcb_window;
1839 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1840 pass = (err == VK_SUCCESS);
1841 ASSERT_TRUE(pass);
1842
Ian Elliott2c1daf52016-05-12 09:41:46 -06001843 // Check if surface supports presentation:
1844
1845 // 1st, do so without having queried the queue families:
1846 VkBool32 supported = false;
1847 // TODO: Get the following error to come out:
1848 m_errorMonitor->SetDesiredFailureMsg(
1849 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1850 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
1851 "function");
1852 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1853 pass = (err != VK_SUCCESS);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001854 // ASSERT_TRUE(pass);
1855 // m_errorMonitor->VerifyFound();
Ian Elliott2c1daf52016-05-12 09:41:46 -06001856
1857 // Next, query a queue family index that's too large:
1858 m_errorMonitor->SetDesiredFailureMsg(
1859 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1860 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001861 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface,
1862 &supported);
Ian Elliott2c1daf52016-05-12 09:41:46 -06001863 pass = (err != VK_SUCCESS);
1864 ASSERT_TRUE(pass);
1865 m_errorMonitor->VerifyFound();
1866
1867 // Finally, do so correctly:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001868 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
1869 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06001870 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1871 pass = (err == VK_SUCCESS);
1872 ASSERT_TRUE(pass);
1873
Ian Elliott2c1daf52016-05-12 09:41:46 -06001874 // Before proceeding, try to create a swapchain without having called
1875 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
1876 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1877 swapchain_create_info.pNext = NULL;
1878 swapchain_create_info.flags = 0;
1879 m_errorMonitor->SetDesiredFailureMsg(
1880 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1881 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001882 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
1883 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06001884 pass = (err != VK_SUCCESS);
1885 ASSERT_TRUE(pass);
1886 m_errorMonitor->VerifyFound();
1887
Ian Elliott2c1daf52016-05-12 09:41:46 -06001888 // Get the surface capabilities:
1889 VkSurfaceCapabilitiesKHR surface_capabilities;
1890
1891 // Do so correctly (only error logged by this entrypoint is if the
1892 // extension isn't enabled):
1893 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
1894 &surface_capabilities);
1895 pass = (err == VK_SUCCESS);
1896 ASSERT_TRUE(pass);
1897
Ian Elliott2c1daf52016-05-12 09:41:46 -06001898 // Get the surface formats:
1899 uint32_t surface_format_count;
1900
1901 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1903 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06001904 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
1905 pass = (err == VK_SUCCESS);
1906 ASSERT_TRUE(pass);
1907 m_errorMonitor->VerifyFound();
1908
1909 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
1910 // correctly done a 1st try (to get the count):
1911 m_errorMonitor->SetDesiredFailureMsg(
1912 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1913 "but no prior positive value has been seen for");
1914 surface_format_count = 0;
1915 vkGetPhysicalDeviceSurfaceFormatsKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001916 gpu(), surface, &surface_format_count,
1917 (VkSurfaceFormatKHR *)&surface_format_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06001918 pass = (err == VK_SUCCESS);
1919 ASSERT_TRUE(pass);
1920 m_errorMonitor->VerifyFound();
1921
1922 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001923 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
1924 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06001925 pass = (err == VK_SUCCESS);
1926 ASSERT_TRUE(pass);
1927
1928 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001929 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(
1930 surface_format_count * sizeof(VkSurfaceFormatKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06001931
1932 // Next, do a 2nd try with surface_format_count being set too high:
1933 surface_format_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1935 "that is greater than the value");
1936 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06001937 surface_formats);
1938 pass = (err == VK_SUCCESS);
1939 ASSERT_TRUE(pass);
1940 m_errorMonitor->VerifyFound();
1941
1942 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001943 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
1944 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06001945 pass = (err == VK_SUCCESS);
1946 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001947 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06001948 surface_formats);
1949 pass = (err == VK_SUCCESS);
1950 ASSERT_TRUE(pass);
1951
Ian Elliott2c1daf52016-05-12 09:41:46 -06001952 // Get the surface present modes:
1953 uint32_t surface_present_mode_count;
1954
1955 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1957 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06001958 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
1959 pass = (err == VK_SUCCESS);
1960 ASSERT_TRUE(pass);
1961 m_errorMonitor->VerifyFound();
1962
1963 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
1964 // correctly done a 1st try (to get the count):
1965 m_errorMonitor->SetDesiredFailureMsg(
1966 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1967 "but no prior positive value has been seen for");
1968 surface_present_mode_count = 0;
1969 vkGetPhysicalDeviceSurfacePresentModesKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001970 gpu(), surface, &surface_present_mode_count,
1971 (VkPresentModeKHR *)&surface_present_mode_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06001972 pass = (err == VK_SUCCESS);
1973 ASSERT_TRUE(pass);
1974 m_errorMonitor->VerifyFound();
1975
1976 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001977 vkGetPhysicalDeviceSurfacePresentModesKHR(
1978 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06001979 pass = (err == VK_SUCCESS);
1980 ASSERT_TRUE(pass);
1981
1982 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001983 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(
1984 surface_present_mode_count * sizeof(VkPresentModeKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06001985
1986 // Next, do a 2nd try with surface_format_count being set too high:
1987 surface_present_mode_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001988 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1989 "that is greater than the value");
1990 vkGetPhysicalDeviceSurfacePresentModesKHR(
1991 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06001992 pass = (err == VK_SUCCESS);
1993 ASSERT_TRUE(pass);
1994 m_errorMonitor->VerifyFound();
1995
1996 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06001997 vkGetPhysicalDeviceSurfacePresentModesKHR(
1998 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06001999 pass = (err == VK_SUCCESS);
2000 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002001 vkGetPhysicalDeviceSurfacePresentModesKHR(
2002 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002003 pass = (err == VK_SUCCESS);
2004 ASSERT_TRUE(pass);
2005
Ian Elliott2c1daf52016-05-12 09:41:46 -06002006 // Create a swapchain:
2007
2008 // First, try without a pointer to swapchain_create_info:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002009 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2010 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002011 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
2012 pass = (err != VK_SUCCESS);
2013 ASSERT_TRUE(pass);
2014 m_errorMonitor->VerifyFound();
2015
2016 // Next, call with a non-NULL swapchain_create_info, that has the wrong
2017 // sType:
2018 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2020 "called with the wrong value for");
2021 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2022 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002023 pass = (err != VK_SUCCESS);
2024 ASSERT_TRUE(pass);
2025 m_errorMonitor->VerifyFound();
2026
2027 // Next, call with a NULL swapchain pointer:
2028 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2029 swapchain_create_info.pNext = NULL;
2030 swapchain_create_info.flags = 0;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2032 "called with NULL pointer");
2033 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2034 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002035 pass = (err != VK_SUCCESS);
2036 ASSERT_TRUE(pass);
2037 m_errorMonitor->VerifyFound();
2038
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002039 // TODO: Enhance swapchain layer so that
2040 // swapchain_create_info.queueFamilyIndexCount is checked against something?
Ian Elliott2c1daf52016-05-12 09:41:46 -06002041
2042 // Next, call with a queue family index that's too large:
2043 uint32_t queueFamilyIndex[2] = {100000, 0};
2044 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2045 swapchain_create_info.queueFamilyIndexCount = 2;
2046 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
2047 m_errorMonitor->SetDesiredFailureMsg(
2048 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2049 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002050 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2051 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002052 pass = (err != VK_SUCCESS);
2053 ASSERT_TRUE(pass);
2054 m_errorMonitor->VerifyFound();
2055
2056 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
2057 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2058 swapchain_create_info.queueFamilyIndexCount = 1;
2059 m_errorMonitor->SetDesiredFailureMsg(
2060 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2061 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
2062 "pCreateInfo->pQueueFamilyIndices).");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002063 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2064 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002065 pass = (err != VK_SUCCESS);
2066 ASSERT_TRUE(pass);
2067 m_errorMonitor->VerifyFound();
2068
2069 // Next, call with an invalid imageSharingMode:
2070 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
2071 swapchain_create_info.queueFamilyIndexCount = 1;
2072 m_errorMonitor->SetDesiredFailureMsg(
2073 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2074 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002075 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2076 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002077 pass = (err != VK_SUCCESS);
2078 ASSERT_TRUE(pass);
2079 m_errorMonitor->VerifyFound();
2080 // Fix for the future:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002081 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2082 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002083 swapchain_create_info.queueFamilyIndexCount = 0;
2084 queueFamilyIndex[0] = 0;
2085 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
2086
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002087 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
Ian Elliott2c1daf52016-05-12 09:41:46 -06002088 // Get the images from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002089 // Acquire an image from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002090 // Present an image to a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002091 // Destroy the swapchain:
2092
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002093 // TODOs:
2094 //
2095 // - Try destroying the device without first destroying the swapchain
2096 //
2097 // - Try destroying the device without first destroying the surface
2098 //
2099 // - Try destroying the surface without first destroying the swapchain
Ian Elliott2c1daf52016-05-12 09:41:46 -06002100
2101 // Destroy the surface:
2102 vkDestroySurfaceKHR(instance(), surface, NULL);
2103
Ian Elliott2c1daf52016-05-12 09:41:46 -06002104 // Tear down the window:
2105 xcb_destroy_window(connection, xcb_window);
2106 xcb_disconnect(connection);
2107
2108#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002109 return;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002110#endif // VK_USE_PLATFORM_XCB_KHR
2111}
2112
Karl Schultz6addd812016-02-02 17:17:23 -07002113TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2114 VkResult err;
2115 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002116
Karl Schultz6addd812016-02-02 17:17:23 -07002117 m_errorMonitor->SetDesiredFailureMsg(
2118 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002119 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
2120
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002121 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002122
2123 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002124 VkImage image;
2125 VkDeviceMemory mem;
2126 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002127
Karl Schultz6addd812016-02-02 17:17:23 -07002128 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2129 const int32_t tex_width = 32;
2130 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002131
Tony Barboureb254902015-07-15 12:50:33 -06002132 VkImageCreateInfo image_create_info = {};
2133 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002134 image_create_info.pNext = NULL;
2135 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2136 image_create_info.format = tex_format;
2137 image_create_info.extent.width = tex_width;
2138 image_create_info.extent.height = tex_height;
2139 image_create_info.extent.depth = 1;
2140 image_create_info.mipLevels = 1;
2141 image_create_info.arrayLayers = 1;
2142 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2143 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2144 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2145 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002146
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002147 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002148 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002149 mem_alloc.pNext = NULL;
2150 mem_alloc.allocationSize = 0;
2151 // Introduce failure, do NOT set memProps to
2152 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
2153 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002154
Chia-I Wuf7458c52015-10-26 21:10:41 +08002155 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002156 ASSERT_VK_SUCCESS(err);
2157
Karl Schultz6addd812016-02-02 17:17:23 -07002158 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002159
Mark Lobodzinski23065352015-05-29 09:32:35 -05002160 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002161
Karl Schultz6addd812016-02-02 17:17:23 -07002162 pass =
2163 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
2164 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2165 if (!pass) { // If we can't find any unmappable memory this test doesn't
2166 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002167 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002168 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002169 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002170
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002171 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002172 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002173 ASSERT_VK_SUCCESS(err);
2174
2175 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002176 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002177 ASSERT_VK_SUCCESS(err);
2178
2179 // Map memory as if to initialize the image
2180 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002181 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
2182 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002183
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002184 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002185
Chia-I Wuf7458c52015-10-26 21:10:41 +08002186 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002187 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002188}
2189
Karl Schultz6addd812016-02-02 17:17:23 -07002190TEST_F(VkLayerTest, RebindMemory) {
2191 VkResult err;
2192 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002193
Karl Schultz6addd812016-02-02 17:17:23 -07002194 m_errorMonitor->SetDesiredFailureMsg(
2195 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002196 "which has already been bound to mem object");
2197
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002198 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002199
2200 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002201 VkImage image;
2202 VkDeviceMemory mem1;
2203 VkDeviceMemory mem2;
2204 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002205
Karl Schultz6addd812016-02-02 17:17:23 -07002206 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2207 const int32_t tex_width = 32;
2208 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002209
Tony Barboureb254902015-07-15 12:50:33 -06002210 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002211 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2212 image_create_info.pNext = NULL;
2213 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2214 image_create_info.format = tex_format;
2215 image_create_info.extent.width = tex_width;
2216 image_create_info.extent.height = tex_height;
2217 image_create_info.extent.depth = 1;
2218 image_create_info.mipLevels = 1;
2219 image_create_info.arrayLayers = 1;
2220 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2221 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2222 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2223 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002224
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002225 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002226 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2227 mem_alloc.pNext = NULL;
2228 mem_alloc.allocationSize = 0;
2229 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002230
Karl Schultz6addd812016-02-02 17:17:23 -07002231 // Introduce failure, do NOT set memProps to
2232 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002233 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002234 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002235 ASSERT_VK_SUCCESS(err);
2236
Karl Schultz6addd812016-02-02 17:17:23 -07002237 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002238
2239 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002240 pass =
2241 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002242 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002243
2244 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002245 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002246 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002247 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002248 ASSERT_VK_SUCCESS(err);
2249
2250 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002251 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002252 ASSERT_VK_SUCCESS(err);
2253
Karl Schultz6addd812016-02-02 17:17:23 -07002254 // Introduce validation failure, try to bind a different memory object to
2255 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002256 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002257
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002258 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002259
Chia-I Wuf7458c52015-10-26 21:10:41 +08002260 vkDestroyImage(m_device->device(), image, NULL);
2261 vkFreeMemory(m_device->device(), mem1, NULL);
2262 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002263}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002264
Karl Schultz6addd812016-02-02 17:17:23 -07002265TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002266 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002267
Karl Schultz6addd812016-02-02 17:17:23 -07002268 m_errorMonitor->SetDesiredFailureMsg(
2269 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
2270 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002271
2272 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002273 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2274 fenceInfo.pNext = NULL;
2275 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002276
Tony Barbour300a6082015-04-07 13:44:53 -06002277 ASSERT_NO_FATAL_FAILURE(InitState());
2278 ASSERT_NO_FATAL_FAILURE(InitViewport());
2279 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2280
Tony Barbourfe3351b2015-07-28 10:17:20 -06002281 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002282 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2283 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06002284 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002285
2286 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002287
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002288 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002289 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2290 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002291 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002292 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002293 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002294 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002295 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002296 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002297 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002298
2299 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002300 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002301
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002302 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002303}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002304// This is a positive test. We used to expect error in this case but spec now
2305// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07002306TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002307 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002308 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002309 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002310 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2311 fenceInfo.pNext = NULL;
2312
Tony Barbour0b4d9562015-04-09 10:48:04 -06002313 ASSERT_NO_FATAL_FAILURE(InitState());
2314 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08002315 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002316 VkResult result = vkResetFences(m_device->device(), 1, fences);
2317 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06002318
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002319 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06002320}
Tobin Ehlis41376e12015-07-03 08:45:14 -06002321
Chris Forbese70b7d32016-06-15 15:49:12 +12002322#if 0
2323TEST_F(VkLayerTest, LongFenceChain)
2324{
2325 m_errorMonitor->ExpectSuccess();
2326
2327 ASSERT_NO_FATAL_FAILURE(InitState());
2328 VkResult err;
2329
2330 std::vector<VkFence> fences;
2331
2332 const int chainLength = 32768;
2333
2334 for (int i = 0; i < chainLength; i++) {
2335 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
2336 VkFence fence;
2337 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
2338 ASSERT_VK_SUCCESS(err);
2339
2340 fences.push_back(fence);
2341
2342 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
2343 0, nullptr, 0, nullptr };
2344 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
2345 ASSERT_VK_SUCCESS(err);
2346
2347 }
2348
2349 // BOOM, stack overflow.
2350 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
2351
2352 for (auto fence : fences)
2353 vkDestroyFence(m_device->device(), fence, nullptr);
2354
2355 m_errorMonitor->VerifyNotFound();
2356}
2357#endif
2358
Chris Forbes18127d12016-06-08 16:52:28 +12002359TEST_F(VkLayerTest, CommandBufferSimultaneousUseSync)
2360{
2361 m_errorMonitor->ExpectSuccess();
2362
2363 ASSERT_NO_FATAL_FAILURE(InitState());
2364 VkResult err;
2365
2366 // Record (empty!) command buffer that can be submitted multiple times
2367 // simultaneously.
2368 VkCommandBufferBeginInfo cbbi = {
2369 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
2370 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr
2371 };
2372 m_commandBuffer->BeginCommandBuffer(&cbbi);
2373 m_commandBuffer->EndCommandBuffer();
2374
2375 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
2376 VkFence fence;
2377 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
2378 ASSERT_VK_SUCCESS(err);
2379
2380 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
2381 VkSemaphore s1, s2;
2382 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
2383 ASSERT_VK_SUCCESS(err);
2384 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
2385 ASSERT_VK_SUCCESS(err);
2386
2387 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
2388 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
2389 1, &m_commandBuffer->handle(), 1, &s1 };
2390 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
2391 ASSERT_VK_SUCCESS(err);
2392
2393 // Submit CB again, signaling s2.
2394 si.pSignalSemaphores = &s2;
2395 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
2396 ASSERT_VK_SUCCESS(err);
2397
2398 // Wait for fence.
2399 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2400 ASSERT_VK_SUCCESS(err);
2401
2402 // CB is still in flight from second submission, but semaphore s1 is no
2403 // longer in flight. delete it.
2404 vkDestroySemaphore(m_device->device(), s1, nullptr);
2405
2406 m_errorMonitor->VerifyNotFound();
2407
2408 // Force device idle and clean up remaining objects
2409 vkDeviceWaitIdle(m_device->device());
2410 vkDestroySemaphore(m_device->device(), s2, nullptr);
2411 vkDestroyFence(m_device->device(), fence, nullptr);
2412}
2413
Chris Forbes4e44c912016-06-16 10:20:00 +12002414TEST_F(VkLayerTest, FenceCreateSignaledWaitHandling)
2415{
2416 m_errorMonitor->ExpectSuccess();
2417
2418 ASSERT_NO_FATAL_FAILURE(InitState());
2419 VkResult err;
2420
2421 // A fence created signaled
2422 VkFenceCreateInfo fci1 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
2423 VkFence f1;
2424 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
2425 ASSERT_VK_SUCCESS(err);
2426
2427 // A fence created not
2428 VkFenceCreateInfo fci2 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
2429 VkFence f2;
2430 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
2431 ASSERT_VK_SUCCESS(err);
2432
2433 // Submit the unsignaled fence
2434 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
2435 0, nullptr, 0, nullptr };
2436 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
2437
2438 // Wait on both fences, with signaled first.
2439 VkFence fences[] = { f1, f2 };
2440 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
2441
2442 // Should have both retired!
2443 vkDestroyFence(m_device->device(), f1, nullptr);
2444 vkDestroyFence(m_device->device(), f2, nullptr);
2445
2446 m_errorMonitor->VerifyNotFound();
2447}
2448
Tobin Ehlis41376e12015-07-03 08:45:14 -06002449TEST_F(VkLayerTest, InvalidUsageBits)
2450{
Tony Barbourf92621a2016-05-02 14:28:12 -06002451 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002452 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06002453 "Initialize buffer with wrong usage then perform copy expecting errors "
2454 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002456 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002457
2458 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06002459 VkImageObj image(m_device);
2460 // Initialize image with USAGE_INPUT_ATTACHMENT
Tobin Ehlis8b313c02016-05-25 15:01:52 -06002461 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002462 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2463 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002464
Tony Barbourf92621a2016-05-02 14:28:12 -06002465 VkImageView dsv;
2466 VkImageViewCreateInfo dsvci = {};
2467 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2468 dsvci.image = image.handle();
2469 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
2470 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
2471 dsvci.subresourceRange.layerCount = 1;
2472 dsvci.subresourceRange.baseMipLevel = 0;
2473 dsvci.subresourceRange.levelCount = 1;
2474 dsvci.subresourceRange.aspectMask =
2475 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002476
Tony Barbourf92621a2016-05-02 14:28:12 -06002477 // Create a view with depth / stencil aspect for image with different usage
2478 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002479
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002480 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002481
2482 // Initialize buffer with TRANSFER_DST usage
2483 vk_testing::Buffer buffer;
2484 VkMemoryPropertyFlags reqs = 0;
2485 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2486 VkBufferImageCopy region = {};
2487 region.bufferRowLength = 128;
2488 region.bufferImageHeight = 128;
2489 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2490 region.imageSubresource.layerCount = 1;
2491 region.imageExtent.height = 16;
2492 region.imageExtent.width = 16;
2493 region.imageExtent.depth = 1;
2494
2495 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2496 "Invalid usage flag for buffer ");
2497 // Buffer usage not set to TRANSFER_SRC and image usage not set to
2498 // TRANSFER_DST
2499 BeginCommandBuffer();
2500 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
2501 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
2502 1, &region);
2503 m_errorMonitor->VerifyFound();
2504
2505 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2506 "Invalid usage flag for image ");
2507 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
2508 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
2509 1, &region);
2510 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002511}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002512#endif // MEM_TRACKER_TESTS
2513
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06002514#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002515
2516TEST_F(VkLayerTest, LeakAnObject) {
2517 VkResult err;
2518
2519 TEST_DESCRIPTION(
2520 "Create a fence and destroy its device without first destroying the fence.");
2521
2522 // Note that we have to create a new device since destroying the
2523 // framework's device causes Teardown() to fail and just calling Teardown
2524 // will destroy the errorMonitor.
2525
2526 m_errorMonitor->SetDesiredFailureMsg(
2527 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2528 "OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT object");
2529
2530 ASSERT_NO_FATAL_FAILURE(InitState());
2531
2532 const std::vector<VkQueueFamilyProperties> queue_props =
2533 m_device->queue_props;
2534 std::vector<VkDeviceQueueCreateInfo> queue_info;
2535 queue_info.reserve(queue_props.size());
2536 std::vector<std::vector<float>> queue_priorities;
2537 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2538 VkDeviceQueueCreateInfo qi = {};
2539 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2540 qi.pNext = NULL;
2541 qi.queueFamilyIndex = i;
2542 qi.queueCount = queue_props[i].queueCount;
2543 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2544 qi.pQueuePriorities = queue_priorities[i].data();
2545 queue_info.push_back(qi);
2546 }
2547
2548 std::vector<const char *> device_layer_names;
2549 std::vector<const char *> device_extension_names;
2550 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
2551 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
2552 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
2553 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
2554 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
2555 device_layer_names.push_back("VK_LAYER_LUNARG_image");
2556 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
2557
2558 // The sacrificial device object
2559 VkDevice testDevice;
2560 VkDeviceCreateInfo device_create_info = {};
2561 auto features = m_device->phy().features();
2562 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2563 device_create_info.pNext = NULL;
2564 device_create_info.queueCreateInfoCount = queue_info.size();
2565 device_create_info.pQueueCreateInfos = queue_info.data();
2566 device_create_info.enabledLayerCount = device_layer_names.size();
2567 device_create_info.ppEnabledLayerNames = device_layer_names.data();
2568 device_create_info.pEnabledFeatures = &features;
2569 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2570 ASSERT_VK_SUCCESS(err);
2571
2572 VkFence fence;
2573 VkFenceCreateInfo fence_create_info = {};
2574 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2575 fence_create_info.pNext = NULL;
2576 fence_create_info.flags = 0;
2577 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2578 ASSERT_VK_SUCCESS(err);
2579
2580 // Induce failure by not calling vkDestroyFence
2581 vkDestroyDevice(testDevice, NULL);
2582 m_errorMonitor->VerifyFound();
2583}
2584
2585TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
2586
2587 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
2588 "attempt to delete them from another.");
2589
2590 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2591 "FreeCommandBuffers is attempting to free Command Buffer");
2592
2593 VkCommandPool command_pool_one;
2594 VkCommandPool command_pool_two;
2595
2596 VkCommandPoolCreateInfo pool_create_info{};
2597 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2598 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2599 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2600
2601 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2602 &command_pool_one);
2603
2604 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2605 &command_pool_two);
2606
2607 VkCommandBuffer command_buffer[9];
2608 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2609 command_buffer_allocate_info.sType =
2610 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2611 command_buffer_allocate_info.commandPool = command_pool_one;
2612 command_buffer_allocate_info.commandBufferCount = 9;
2613 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2614 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2615 command_buffer);
2616
2617 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
2618 &command_buffer[3]);
2619
2620 m_errorMonitor->VerifyFound();
2621
2622 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2623 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2624}
2625
2626TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2627 VkResult err;
2628
2629 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
2630 "attempt to delete them from another.");
2631
2632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2633 "FreeDescriptorSets is attempting to free descriptorSet");
2634
2635 ASSERT_NO_FATAL_FAILURE(InitState());
2636 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2637
2638 VkDescriptorPoolSize ds_type_count = {};
2639 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2640 ds_type_count.descriptorCount = 1;
2641
2642 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2643 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2644 ds_pool_ci.pNext = NULL;
2645 ds_pool_ci.flags = 0;
2646 ds_pool_ci.maxSets = 1;
2647 ds_pool_ci.poolSizeCount = 1;
2648 ds_pool_ci.pPoolSizes = &ds_type_count;
2649
2650 VkDescriptorPool ds_pool_one;
2651 err =
2652 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
2653 ASSERT_VK_SUCCESS(err);
2654
2655 // Create a second descriptor pool
2656 VkDescriptorPool ds_pool_two;
2657 err =
2658 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
2659 ASSERT_VK_SUCCESS(err);
2660
2661 VkDescriptorSetLayoutBinding dsl_binding = {};
2662 dsl_binding.binding = 0;
2663 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2664 dsl_binding.descriptorCount = 1;
2665 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2666 dsl_binding.pImmutableSamplers = NULL;
2667
2668 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2669 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2670 ds_layout_ci.pNext = NULL;
2671 ds_layout_ci.bindingCount = 1;
2672 ds_layout_ci.pBindings = &dsl_binding;
2673
2674 VkDescriptorSetLayout ds_layout;
2675 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2676 &ds_layout);
2677 ASSERT_VK_SUCCESS(err);
2678
2679 VkDescriptorSet descriptorSet;
2680 VkDescriptorSetAllocateInfo alloc_info = {};
2681 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2682 alloc_info.descriptorSetCount = 1;
2683 alloc_info.descriptorPool = ds_pool_one;
2684 alloc_info.pSetLayouts = &ds_layout;
2685 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2686 &descriptorSet);
2687 ASSERT_VK_SUCCESS(err);
2688
2689 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2690
2691 m_errorMonitor->VerifyFound();
2692
2693 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2694 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2695 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2696}
2697
2698TEST_F(VkLayerTest, CreateUnknownObject) {
2699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2700 "Invalid VkImage Object ");
2701
2702 TEST_DESCRIPTION(
2703 "Pass an invalid image object handle into a Vulkan API call.");
2704
2705 ASSERT_NO_FATAL_FAILURE(InitState());
2706
2707 // Pass bogus handle into GetImageMemoryRequirements
2708 VkMemoryRequirements mem_reqs;
2709 uint64_t fakeImageHandle = 0xCADECADE;
2710 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2711
2712 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2713
2714 m_errorMonitor->VerifyFound();
2715}
2716
Karl Schultz6addd812016-02-02 17:17:23 -07002717TEST_F(VkLayerTest, PipelineNotBound) {
2718 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002719
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002720 TEST_DESCRIPTION(
2721 "Pass in an invalid pipeline object handle into a Vulkan API call.");
2722
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002724 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002725
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002726 ASSERT_NO_FATAL_FAILURE(InitState());
2727 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002728
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002729 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002730 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2731 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002732
2733 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002734 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2735 ds_pool_ci.pNext = NULL;
2736 ds_pool_ci.maxSets = 1;
2737 ds_pool_ci.poolSizeCount = 1;
2738 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002739
2740 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002741 err =
2742 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002743 ASSERT_VK_SUCCESS(err);
2744
2745 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002746 dsl_binding.binding = 0;
2747 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2748 dsl_binding.descriptorCount = 1;
2749 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2750 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002751
2752 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002753 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2754 ds_layout_ci.pNext = NULL;
2755 ds_layout_ci.bindingCount = 1;
2756 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002757
2758 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002759 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2760 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002761 ASSERT_VK_SUCCESS(err);
2762
2763 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002764 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002765 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002766 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002767 alloc_info.descriptorPool = ds_pool;
2768 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002769 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2770 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002771 ASSERT_VK_SUCCESS(err);
2772
2773 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002774 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2775 pipeline_layout_ci.pNext = NULL;
2776 pipeline_layout_ci.setLayoutCount = 1;
2777 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002778
2779 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002780 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2781 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002782 ASSERT_VK_SUCCESS(err);
2783
Mark Youngad779052016-01-06 14:26:04 -07002784 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002785
2786 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002787 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2788 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002789
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002790 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002791
Chia-I Wuf7458c52015-10-26 21:10:41 +08002792 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2793 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2794 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002795}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002796
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002797TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2798 VkResult err;
2799
2800 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
2801 "during bind[Buffer|Image]Memory time");
2802
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002803 ASSERT_NO_FATAL_FAILURE(InitState());
2804
2805 // Create an image, allocate memory, set a bad typeIndex and then try to
2806 // bind it
2807 VkImage image;
2808 VkDeviceMemory mem;
2809 VkMemoryRequirements mem_reqs;
2810 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2811 const int32_t tex_width = 32;
2812 const int32_t tex_height = 32;
2813
2814 VkImageCreateInfo image_create_info = {};
2815 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2816 image_create_info.pNext = NULL;
2817 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2818 image_create_info.format = tex_format;
2819 image_create_info.extent.width = tex_width;
2820 image_create_info.extent.height = tex_height;
2821 image_create_info.extent.depth = 1;
2822 image_create_info.mipLevels = 1;
2823 image_create_info.arrayLayers = 1;
2824 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2825 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2826 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2827 image_create_info.flags = 0;
2828
2829 VkMemoryAllocateInfo mem_alloc = {};
2830 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2831 mem_alloc.pNext = NULL;
2832 mem_alloc.allocationSize = 0;
2833 mem_alloc.memoryTypeIndex = 0;
2834
2835 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2836 ASSERT_VK_SUCCESS(err);
2837
2838 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2839 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002840
2841 // Introduce Failure, select invalid TypeIndex
2842 VkPhysicalDeviceMemoryProperties memory_info;
2843
2844 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2845 unsigned int i;
2846 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2847 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2848 mem_alloc.memoryTypeIndex = i;
2849 break;
2850 }
2851 }
2852 if (i >= memory_info.memoryTypeCount) {
2853 printf("No invalid memory type index could be found; skipped.\n");
2854 vkDestroyImage(m_device->device(), image, NULL);
2855 return;
2856 }
2857
2858 m_errorMonitor->SetDesiredFailureMsg(
2859 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2860 "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002861
2862 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2863 ASSERT_VK_SUCCESS(err);
2864
2865 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2866 (void)err;
2867
2868 m_errorMonitor->VerifyFound();
2869
2870 vkDestroyImage(m_device->device(), image, NULL);
2871 vkFreeMemory(m_device->device(), mem, NULL);
2872}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002873
Karl Schultz6addd812016-02-02 17:17:23 -07002874TEST_F(VkLayerTest, BindInvalidMemory) {
2875 VkResult err;
2876 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002877
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002879 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002880
Tobin Ehlisec598302015-09-15 15:02:17 -06002881 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002882
2883 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002884 VkImage image;
2885 VkDeviceMemory mem;
2886 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002887
Karl Schultz6addd812016-02-02 17:17:23 -07002888 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2889 const int32_t tex_width = 32;
2890 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002891
2892 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002893 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2894 image_create_info.pNext = NULL;
2895 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2896 image_create_info.format = tex_format;
2897 image_create_info.extent.width = tex_width;
2898 image_create_info.extent.height = tex_height;
2899 image_create_info.extent.depth = 1;
2900 image_create_info.mipLevels = 1;
2901 image_create_info.arrayLayers = 1;
2902 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2903 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2904 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2905 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002906
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002907 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002908 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2909 mem_alloc.pNext = NULL;
2910 mem_alloc.allocationSize = 0;
2911 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002912
Chia-I Wuf7458c52015-10-26 21:10:41 +08002913 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002914 ASSERT_VK_SUCCESS(err);
2915
Karl Schultz6addd812016-02-02 17:17:23 -07002916 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002917
2918 mem_alloc.allocationSize = mem_reqs.size;
2919
Karl Schultz6addd812016-02-02 17:17:23 -07002920 pass =
2921 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002922 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002923
2924 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002925 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002926 ASSERT_VK_SUCCESS(err);
2927
2928 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002929 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002930
2931 // Try to bind free memory that has been freed
2932 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2933 // This may very well return an error.
2934 (void)err;
2935
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002936 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002937
Chia-I Wuf7458c52015-10-26 21:10:41 +08002938 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002939}
2940
Karl Schultz6addd812016-02-02 17:17:23 -07002941TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2942 VkResult err;
2943 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002944
Karl Schultz6addd812016-02-02 17:17:23 -07002945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2946 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002947
Tobin Ehlisec598302015-09-15 15:02:17 -06002948 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002949
Karl Schultz6addd812016-02-02 17:17:23 -07002950 // Create an image object, allocate memory, destroy the object and then try
2951 // to bind it
2952 VkImage image;
2953 VkDeviceMemory mem;
2954 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002955
Karl Schultz6addd812016-02-02 17:17:23 -07002956 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2957 const int32_t tex_width = 32;
2958 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002959
2960 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002961 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2962 image_create_info.pNext = NULL;
2963 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2964 image_create_info.format = tex_format;
2965 image_create_info.extent.width = tex_width;
2966 image_create_info.extent.height = tex_height;
2967 image_create_info.extent.depth = 1;
2968 image_create_info.mipLevels = 1;
2969 image_create_info.arrayLayers = 1;
2970 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2971 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2972 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2973 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002974
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002975 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002976 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2977 mem_alloc.pNext = NULL;
2978 mem_alloc.allocationSize = 0;
2979 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002980
Chia-I Wuf7458c52015-10-26 21:10:41 +08002981 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002982 ASSERT_VK_SUCCESS(err);
2983
Karl Schultz6addd812016-02-02 17:17:23 -07002984 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002985
2986 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002987 pass =
2988 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002989 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002990
2991 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002992 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002993 ASSERT_VK_SUCCESS(err);
2994
2995 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002996 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002997 ASSERT_VK_SUCCESS(err);
2998
2999 // Now Try to bind memory to this destroyed object
3000 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3001 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003002 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003003
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003004 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003005
Chia-I Wuf7458c52015-10-26 21:10:41 +08003006 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003007}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003008
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003009#endif // OBJ_TRACKER_TESTS
3010
Tobin Ehlis0788f522015-05-26 16:11:58 -06003011#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003012
Chris Forbes48a53902016-06-30 11:46:27 +12003013TEST_F(VkLayerTest, RenderPassInitialLayoutUndefined) {
3014 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
3015 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
3016 "the command buffer has prior knowledge of that "
3017 "attachment's layout.");
3018
3019 m_errorMonitor->ExpectSuccess();
3020
3021 ASSERT_NO_FATAL_FAILURE(InitState());
3022
3023 // A renderpass with one color attachment.
3024 VkAttachmentDescription attachment = {
3025 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3026 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3027 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3028 VK_IMAGE_LAYOUT_UNDEFINED,
3029 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3030 };
3031
3032 VkAttachmentReference att_ref = {
3033 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3034 };
3035
3036 VkSubpassDescription subpass = {
3037 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3038 1, &att_ref, nullptr, nullptr, 0, nullptr
3039 };
3040
3041 VkRenderPassCreateInfo rpci = {
3042 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3043 0, 1, &attachment, 1, &subpass, 0, nullptr
3044 };
3045
3046 VkRenderPass rp;
3047 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3048 ASSERT_VK_SUCCESS(err);
3049
3050 // A compatible framebuffer.
3051 VkImageObj image(m_device);
3052 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3053 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3054 VK_IMAGE_TILING_OPTIMAL, 0);
3055 ASSERT_TRUE(image.initialized());
3056
3057 VkImageViewCreateInfo ivci = {
3058 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3059 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3060 {
3061 VK_COMPONENT_SWIZZLE_IDENTITY,
3062 VK_COMPONENT_SWIZZLE_IDENTITY,
3063 VK_COMPONENT_SWIZZLE_IDENTITY,
3064 VK_COMPONENT_SWIZZLE_IDENTITY
3065 },
3066 {
3067 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3068 },
3069 };
3070 VkImageView view;
3071 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3072 ASSERT_VK_SUCCESS(err);
3073
3074 VkFramebufferCreateInfo fci = {
3075 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3076 0, rp, 1, &view,
3077 32, 32, 1
3078 };
3079 VkFramebuffer fb;
3080 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3081 ASSERT_VK_SUCCESS(err);
3082
3083 // Record a single command buffer which uses this renderpass twice. The
3084 // bug is triggered at the beginning of the second renderpass, when the
3085 // command buffer already has a layout recorded for the attachment.
3086 VkRenderPassBeginInfo rpbi = {
3087 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
3088 rp, fb, { 0, 0, 32, 32 },
3089 0, nullptr
3090 };
3091 BeginCommandBuffer();
3092 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3093 VK_SUBPASS_CONTENTS_INLINE);
3094 vkCmdEndRenderPass(m_commandBuffer->handle());
3095 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3096 VK_SUBPASS_CONTENTS_INLINE);
3097
3098 m_errorMonitor->VerifyNotFound();
3099
3100 vkCmdEndRenderPass(m_commandBuffer->handle());
3101 EndCommandBuffer();
3102
3103 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3104 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3105 vkDestroyImageView(m_device->device(), view, nullptr);
3106}
3107
Chris Forbes51bf7c92016-06-30 15:22:08 +12003108TEST_F(VkLayerTest, RenderPassSubpassZeroTransitionsApplied) {
3109 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
3110 "transitions for the first subpass");
3111
3112 m_errorMonitor->ExpectSuccess();
3113
3114 ASSERT_NO_FATAL_FAILURE(InitState());
3115
3116 // A renderpass with one color attachment.
3117 VkAttachmentDescription attachment = {
3118 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3119 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3120 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3121 VK_IMAGE_LAYOUT_UNDEFINED,
3122 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3123 };
3124
3125 VkAttachmentReference att_ref = {
3126 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3127 };
3128
3129 VkSubpassDescription subpass = {
3130 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3131 1, &att_ref, nullptr, nullptr, 0, nullptr
3132 };
3133
3134 VkSubpassDependency dep = {
3135 0, 0, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3136 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3137 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3138 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3139 VK_DEPENDENCY_BY_REGION_BIT
3140 };
3141
3142 VkRenderPassCreateInfo rpci = {
3143 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3144 0, 1, &attachment, 1, &subpass, 1, &dep
3145 };
3146
3147 VkResult err;
3148 VkRenderPass rp;
3149 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3150 ASSERT_VK_SUCCESS(err);
3151
3152 // A compatible framebuffer.
3153 VkImageObj image(m_device);
3154 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3155 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3156 VK_IMAGE_TILING_OPTIMAL, 0);
3157 ASSERT_TRUE(image.initialized());
3158
3159 VkImageViewCreateInfo ivci = {
3160 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3161 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3162 {
3163 VK_COMPONENT_SWIZZLE_IDENTITY,
3164 VK_COMPONENT_SWIZZLE_IDENTITY,
3165 VK_COMPONENT_SWIZZLE_IDENTITY,
3166 VK_COMPONENT_SWIZZLE_IDENTITY
3167 },
3168 {
3169 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3170 },
3171 };
3172 VkImageView view;
3173 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3174 ASSERT_VK_SUCCESS(err);
3175
3176 VkFramebufferCreateInfo fci = {
3177 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3178 0, rp, 1, &view,
3179 32, 32, 1
3180 };
3181 VkFramebuffer fb;
3182 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3183 ASSERT_VK_SUCCESS(err);
3184
3185 // Record a single command buffer which issues a pipeline barrier w/
3186 // image memory barrier for the attachment. This detects the previously
3187 // missing tracking of the subpass layout by throwing a validation error
3188 // if it doesn't occur.
3189 VkRenderPassBeginInfo rpbi = {
3190 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
3191 rp, fb, { 0, 0, 32, 32 },
3192 0, nullptr
3193 };
3194 BeginCommandBuffer();
3195 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3196 VK_SUBPASS_CONTENTS_INLINE);
3197
3198 VkImageMemoryBarrier imb = {
3199 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, nullptr,
3200 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3201 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3202 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3203 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3204 VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
3205 image.handle(),
3206 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
3207 };
3208 vkCmdPipelineBarrier(m_commandBuffer->handle(),
3209 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3210 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3211 VK_DEPENDENCY_BY_REGION_BIT,
3212 0, nullptr, 0, nullptr, 1, &imb);
3213
3214 vkCmdEndRenderPass(m_commandBuffer->handle());
3215 m_errorMonitor->VerifyNotFound();
3216 EndCommandBuffer();
3217
3218 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3219 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3220 vkDestroyImageView(m_device->device(), view, nullptr);
3221}
3222
Chris Forbes6b3d3f42016-06-30 16:09:47 +12003223TEST_F(VkLayerTest, RenderPassTransitionsAttachmentUnused) {
3224 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
3225 "errors, when an attachment reference is "
3226 "VK_ATTACHMENT_UNUSED");
3227
3228 m_errorMonitor->ExpectSuccess();
3229
3230 ASSERT_NO_FATAL_FAILURE(InitState());
3231
3232 // A renderpass with no attachments
3233 VkAttachmentReference att_ref = {
3234 VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3235 };
3236
3237 VkSubpassDescription subpass = {
3238 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3239 1, &att_ref, nullptr, nullptr, 0, nullptr
3240 };
3241
3242 VkRenderPassCreateInfo rpci = {
3243 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3244 0, 0, nullptr, 1, &subpass, 0, nullptr
3245 };
3246
3247 VkRenderPass rp;
3248 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3249 ASSERT_VK_SUCCESS(err);
3250
3251 // A compatible framebuffer.
3252 VkFramebufferCreateInfo fci = {
3253 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3254 0, rp, 0, nullptr,
3255 32, 32, 1
3256 };
3257 VkFramebuffer fb;
3258 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3259 ASSERT_VK_SUCCESS(err);
3260
3261 // Record a command buffer which just begins and ends the renderpass. The
3262 // bug manifests in BeginRenderPass.
3263 VkRenderPassBeginInfo rpbi = {
3264 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
3265 rp, fb, { 0, 0, 32, 32 },
3266 0, nullptr
3267 };
3268 BeginCommandBuffer();
3269 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3270 VK_SUBPASS_CONTENTS_INLINE);
3271 vkCmdEndRenderPass(m_commandBuffer->handle());
3272 m_errorMonitor->VerifyNotFound();
3273 EndCommandBuffer();
3274
3275 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3276 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3277}
3278
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06003279// This is a positive test. No errors are expected.
3280TEST_F(VkLayerTest, StencilLoadOp) {
3281 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
3282 "CLEAR. stencil[Load|Store]Op used to be ignored.");
3283 VkResult result = VK_SUCCESS;
3284 VkImageFormatProperties formatProps;
3285 vkGetPhysicalDeviceImageFormatProperties(
3286 gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D,
3287 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
3288 VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
3289 0, &formatProps);
3290 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
3291 return;
3292 }
3293
3294 ASSERT_NO_FATAL_FAILURE(InitState());
3295 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
3296 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
3297 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
3298 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
3299 VkAttachmentDescription att = {};
3300 VkAttachmentReference ref = {};
3301 att.format = depth_stencil_fmt;
3302 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
3303 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
3304 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
3305 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
3306 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3307 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3308
3309 VkClearValue clear;
3310 clear.depthStencil.depth = 1.0;
3311 clear.depthStencil.stencil = 0;
3312 ref.attachment = 0;
3313 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3314
3315 VkSubpassDescription subpass = {};
3316 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
3317 subpass.flags = 0;
3318 subpass.inputAttachmentCount = 0;
3319 subpass.pInputAttachments = NULL;
3320 subpass.colorAttachmentCount = 0;
3321 subpass.pColorAttachments = NULL;
3322 subpass.pResolveAttachments = NULL;
3323 subpass.pDepthStencilAttachment = &ref;
3324 subpass.preserveAttachmentCount = 0;
3325 subpass.pPreserveAttachments = NULL;
3326
3327 VkRenderPass rp;
3328 VkRenderPassCreateInfo rp_info = {};
3329 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3330 rp_info.attachmentCount = 1;
3331 rp_info.pAttachments = &att;
3332 rp_info.subpassCount = 1;
3333 rp_info.pSubpasses = &subpass;
3334 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
3335 ASSERT_VK_SUCCESS(result);
3336
3337 VkImageView *depthView = m_depthStencil->BindInfo();
3338 VkFramebufferCreateInfo fb_info = {};
3339 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3340 fb_info.pNext = NULL;
3341 fb_info.renderPass = rp;
3342 fb_info.attachmentCount = 1;
3343 fb_info.pAttachments = depthView;
3344 fb_info.width = 100;
3345 fb_info.height = 100;
3346 fb_info.layers = 1;
3347 VkFramebuffer fb;
3348 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3349 ASSERT_VK_SUCCESS(result);
3350
3351
3352 VkRenderPassBeginInfo rpbinfo = {};
3353 rpbinfo.clearValueCount = 1;
3354 rpbinfo.pClearValues = &clear;
3355 rpbinfo.pNext = NULL;
3356 rpbinfo.renderPass = rp;
3357 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
3358 rpbinfo.renderArea.extent.width = 100;
3359 rpbinfo.renderArea.extent.height = 100;
3360 rpbinfo.renderArea.offset.x = 0;
3361 rpbinfo.renderArea.offset.y = 0;
3362 rpbinfo.framebuffer = fb;
3363
3364 VkFence fence = {};
3365 VkFenceCreateInfo fence_ci = {};
3366 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3367 fence_ci.pNext = nullptr;
3368 fence_ci.flags = 0;
3369 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
3370 ASSERT_VK_SUCCESS(result);
3371
3372
3373 m_commandBuffer->BeginCommandBuffer();
3374 m_commandBuffer->BeginRenderPass(rpbinfo);
3375 m_commandBuffer->EndRenderPass();
3376 m_commandBuffer->EndCommandBuffer();
3377 m_commandBuffer->QueueCommandBuffer(fence);
3378
3379 VkImageObj destImage(m_device);
3380 destImage.init(100, 100, depth_stencil_fmt,
3381 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
3382 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
3383 VK_IMAGE_TILING_OPTIMAL, 0);
3384 VkImageMemoryBarrier barrier = {};
3385 VkImageSubresourceRange range;
3386 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
3387 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
3388 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
3389 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT |
3390 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
3391 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3392 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
3393 barrier.image = m_depthStencil->handle();
3394 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
3395 range.baseMipLevel = 0;
3396 range.levelCount = 1;
3397 range.baseArrayLayer = 0;
3398 range.layerCount = 1;
3399 barrier.subresourceRange = range;
3400 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3401 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
3402 cmdbuf.BeginCommandBuffer();
3403 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3404 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
3405 nullptr, 1, &barrier);
3406 barrier.srcAccessMask = 0;
3407 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3408 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
3409 barrier.image = destImage.handle();
3410 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
3411 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
3412 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3413 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
3414 nullptr, 1, &barrier);
3415 VkImageCopy cregion;
3416 cregion.srcSubresource.aspectMask =
3417 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
3418 cregion.srcSubresource.mipLevel = 0;
3419 cregion.srcSubresource.baseArrayLayer = 0;
3420 cregion.srcSubresource.layerCount = 1;
3421 cregion.srcOffset.x = 0;
3422 cregion.srcOffset.y = 0;
3423 cregion.srcOffset.z = 0;
3424 cregion.dstSubresource.aspectMask =
3425 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
3426 cregion.dstSubresource.mipLevel = 0;
3427 cregion.dstSubresource.baseArrayLayer = 0;
3428 cregion.dstSubresource.layerCount = 1;
3429 cregion.dstOffset.x = 0;
3430 cregion.dstOffset.y = 0;
3431 cregion.dstOffset.z = 0;
3432 cregion.extent.width = 100;
3433 cregion.extent.height = 100;
3434 cregion.extent.depth = 1;
3435 cmdbuf.CopyImage(m_depthStencil->handle(),
3436 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
3437 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
3438 cmdbuf.EndCommandBuffer();
3439
3440 VkSubmitInfo submit_info;
3441 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3442 submit_info.pNext = NULL;
3443 submit_info.waitSemaphoreCount = 0;
3444 submit_info.pWaitSemaphores = NULL;
3445 submit_info.pWaitDstStageMask = NULL;
3446 submit_info.commandBufferCount = 1;
3447 submit_info.pCommandBuffers = &cmdbuf.handle();
3448 submit_info.signalSemaphoreCount = 0;
3449 submit_info.pSignalSemaphores = NULL;
3450
3451 m_errorMonitor->ExpectSuccess();
3452 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
3453 m_errorMonitor->VerifyNotFound();
3454
Mark Lobodzinskid0440da2016-06-17 15:10:03 -06003455 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06003456 vkDestroyFence(m_device->device(), fence, nullptr);
3457 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3458 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3459}
3460
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003461TEST_F(VkLayerTest, UnusedPreserveAttachment) {
3462 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
3463 "attachment reference of VK_ATTACHMENT_UNUSED");
3464
3465 ASSERT_NO_FATAL_FAILURE(InitState());
3466 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3467
3468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3469 "must not be VK_ATTACHMENT_UNUSED");
3470
3471 VkAttachmentReference color_attach = {};
3472 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3473 color_attach.attachment = 0;
3474 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3475 VkSubpassDescription subpass = {};
3476 subpass.colorAttachmentCount = 1;
3477 subpass.pColorAttachments = &color_attach;
3478 subpass.preserveAttachmentCount = 1;
3479 subpass.pPreserveAttachments = &preserve_attachment;
3480
3481 VkRenderPassCreateInfo rpci = {};
3482 rpci.subpassCount = 1;
3483 rpci.pSubpasses = &subpass;
3484 rpci.attachmentCount = 1;
3485 VkAttachmentDescription attach_desc = {};
3486 attach_desc.format = VK_FORMAT_UNDEFINED;
3487 rpci.pAttachments = &attach_desc;
3488 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3489 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003490 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003491
3492 m_errorMonitor->VerifyFound();
3493
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003494 if (result == VK_SUCCESS) {
3495 vkDestroyRenderPass(m_device->device(), rp, NULL);
3496 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003497}
3498
Chris Forbesc5389742016-06-29 11:49:23 +12003499TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
3500 ASSERT_NO_FATAL_FAILURE(InitState());
3501
3502 m_errorMonitor->SetDesiredFailureMsg(
3503 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3504 "Subpass 0 requests multisample resolve, but renders to "
3505 "attachment 0 which has VK_SAMPLE_COUNT_1_BIT");
3506
3507 VkAttachmentDescription attachments[] = {
3508 {
3509 0, VK_FORMAT_R8G8B8A8_UNORM,
3510 VK_SAMPLE_COUNT_1_BIT,
3511 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3512 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3513 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3514 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3515 },
3516 {
3517 0, VK_FORMAT_R8G8B8A8_UNORM,
3518 VK_SAMPLE_COUNT_1_BIT,
3519 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3520 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3521 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3522 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3523 },
3524 };
3525
3526 VkAttachmentReference color = {
3527 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3528 };
3529
3530 VkAttachmentReference resolve = {
3531 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3532 };
3533
3534 VkSubpassDescription subpass = {
3535 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
3536 0, nullptr,
3537 1, &color,
3538 &resolve,
3539 nullptr,
3540 0, nullptr
3541 };
3542
3543 VkRenderPassCreateInfo rpci = {
3544 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3545 0, 2, attachments, 1, &subpass, 0, nullptr
3546 };
3547
3548 VkRenderPass rp;
3549 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3550
3551 m_errorMonitor->VerifyFound();
3552
3553 if (err == VK_SUCCESS)
3554 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3555}
3556
3557TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
3558 ASSERT_NO_FATAL_FAILURE(InitState());
3559
3560 m_errorMonitor->SetDesiredFailureMsg(
3561 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3562 "Subpass 0 requests multisample resolve into attachment 1, which "
3563 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
3564
3565 VkAttachmentDescription attachments[] = {
3566 {
3567 0, VK_FORMAT_R8G8B8A8_UNORM,
3568 VK_SAMPLE_COUNT_4_BIT,
3569 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3570 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3571 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3572 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3573 },
3574 {
3575 0, VK_FORMAT_R8G8B8A8_UNORM,
3576 VK_SAMPLE_COUNT_4_BIT,
3577 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3578 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3579 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3580 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3581 },
3582 };
3583
3584 VkAttachmentReference color = {
3585 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3586 };
3587
3588 VkAttachmentReference resolve = {
3589 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3590 };
3591
3592 VkSubpassDescription subpass = {
3593 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
3594 0, nullptr,
3595 1, &color,
3596 &resolve,
3597 nullptr,
3598 0, nullptr
3599 };
3600
3601 VkRenderPassCreateInfo rpci = {
3602 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3603 0, 2, attachments, 1, &subpass, 0, nullptr
3604 };
3605
3606 VkRenderPass rp;
3607 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3608
3609 m_errorMonitor->VerifyFound();
3610
3611 if (err == VK_SUCCESS)
3612 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3613}
3614
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003615TEST_F(VkLayerTest, FramebufferCreateErrors) {
3616 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
3617 " 1. Mismatch between fb & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003618 " 2. Use a color image as depthStencil attachment\n"
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003619 " 3. Mismatch fb & renderPass attachment formats\n"
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003620 " 4. Mismatch fb & renderPass attachment #samples\n"
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003621 " 5. FB attachment w/ non-1 mip-levels\n"
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06003622 " 6. FB attachment where dimensions don't match\n"
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003623 " 7. FB attachment w/o identity swizzle\n"
3624 " 8. FB dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003625
3626 ASSERT_NO_FATAL_FAILURE(InitState());
3627 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3628
3629 m_errorMonitor->SetDesiredFailureMsg(
3630 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003631 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
3632 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003633
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003634 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003635 VkAttachmentReference attach = {};
3636 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3637 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003638 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003639 VkRenderPassCreateInfo rpci = {};
3640 rpci.subpassCount = 1;
3641 rpci.pSubpasses = &subpass;
3642 rpci.attachmentCount = 1;
3643 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003644 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003645 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003646 rpci.pAttachments = &attach_desc;
3647 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3648 VkRenderPass rp;
3649 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3650 ASSERT_VK_SUCCESS(err);
3651
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003652 VkImageView ivs[2];
3653 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3654 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003655 VkFramebufferCreateInfo fb_info = {};
3656 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3657 fb_info.pNext = NULL;
3658 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003659 // Set mis-matching attachmentCount
3660 fb_info.attachmentCount = 2;
3661 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003662 fb_info.width = 100;
3663 fb_info.height = 100;
3664 fb_info.layers = 1;
3665
3666 VkFramebuffer fb;
3667 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3668
3669 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003670 if (err == VK_SUCCESS) {
3671 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3672 }
3673 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003674
3675 // Create a renderPass with a depth-stencil attachment created with
3676 // IMAGE_USAGE_COLOR_ATTACHMENT
3677 // Add our color attachment to pDepthStencilAttachment
3678 subpass.pDepthStencilAttachment = &attach;
3679 subpass.pColorAttachments = NULL;
3680 VkRenderPass rp_ds;
3681 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3682 ASSERT_VK_SUCCESS(err);
3683 // Set correct attachment count, but attachment has COLOR usage bit set
3684 fb_info.attachmentCount = 1;
3685 fb_info.renderPass = rp_ds;
3686
3687 m_errorMonitor->SetDesiredFailureMsg(
3688 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3689 " conflicts with the image's IMAGE_USAGE flags ");
3690 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3691
3692 m_errorMonitor->VerifyFound();
3693 if (err == VK_SUCCESS) {
3694 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3695 }
3696 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003697
3698 // Create new renderpass with alternate attachment format from fb
3699 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3700 subpass.pDepthStencilAttachment = NULL;
3701 subpass.pColorAttachments = &attach;
3702 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3703 ASSERT_VK_SUCCESS(err);
3704
3705 // Cause error due to mis-matched formats between rp & fb
3706 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3707 fb_info.renderPass = rp;
3708 m_errorMonitor->SetDesiredFailureMsg(
3709 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3710 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
3711 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3712
3713 m_errorMonitor->VerifyFound();
3714 if (err == VK_SUCCESS) {
3715 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3716 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003717 vkDestroyRenderPass(m_device->device(), rp, NULL);
3718
3719 // Create new renderpass with alternate sample count from fb
3720 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3721 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3722 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3723 ASSERT_VK_SUCCESS(err);
3724
3725 // Cause error due to mis-matched sample count between rp & fb
3726 fb_info.renderPass = rp;
3727 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3728 " has VK_SAMPLE_COUNT_1_BIT samples "
3729 "that do not match the "
3730 "VK_SAMPLE_COUNT_4_BIT ");
3731 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3732
3733 m_errorMonitor->VerifyFound();
3734 if (err == VK_SUCCESS) {
3735 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3736 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003737
3738 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003739
3740 // Create a custom imageView with non-1 mip levels
3741 VkImageObj image(m_device);
3742 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
3743 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3744 ASSERT_TRUE(image.initialized());
3745
3746 VkImageView view;
3747 VkImageViewCreateInfo ivci = {};
3748 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3749 ivci.image = image.handle();
3750 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3751 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3752 ivci.subresourceRange.layerCount = 1;
3753 ivci.subresourceRange.baseMipLevel = 0;
3754 // Set level count 2 (only 1 is allowed for FB attachment)
3755 ivci.subresourceRange.levelCount = 2;
3756 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3757 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3758 ASSERT_VK_SUCCESS(err);
3759 // Re-create renderpass to have matching sample count
3760 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3761 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3762 ASSERT_VK_SUCCESS(err);
3763
3764 fb_info.renderPass = rp;
3765 fb_info.pAttachments = &view;
3766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3767 " has mip levelCount of 2 but only ");
3768 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3769
3770 m_errorMonitor->VerifyFound();
3771 if (err == VK_SUCCESS) {
3772 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3773 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003774 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003775 // Update view to original color buffer and grow FB dimensions too big
3776 fb_info.pAttachments = ivs;
3777 fb_info.height = 1024;
3778 fb_info.width = 1024;
3779 fb_info.layers = 2;
3780 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3781 " Attachment dimensions must be at "
3782 "least as large. ");
3783 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3784
3785 m_errorMonitor->VerifyFound();
3786 if (err == VK_SUCCESS) {
3787 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3788 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06003789 // Create view attachment with non-identity swizzle
3790 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3791 ivci.image = image.handle();
3792 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3793 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3794 ivci.subresourceRange.layerCount = 1;
3795 ivci.subresourceRange.baseMipLevel = 0;
3796 ivci.subresourceRange.levelCount = 1;
3797 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3798 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
3799 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
3800 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
3801 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
3802 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3803 ASSERT_VK_SUCCESS(err);
3804
3805 fb_info.pAttachments = &view;
3806 fb_info.height = 100;
3807 fb_info.width = 100;
3808 fb_info.layers = 1;
3809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3810 " has non-identy swizzle. All "
3811 "framebuffer attachments must have "
3812 "been created with the identity "
3813 "swizzle. ");
3814 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3815
3816 m_errorMonitor->VerifyFound();
3817 if (err == VK_SUCCESS) {
3818 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3819 }
3820 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003821 // Request fb that exceeds max dimensions
3822 // reset attachment to color attachment
3823 fb_info.pAttachments = ivs;
3824 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
3825 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
3826 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
3827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3828 " Requested VkFramebufferCreateInfo "
3829 "dimensions exceed physical device "
3830 "limits. ");
3831 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3832
3833 m_errorMonitor->VerifyFound();
3834 if (err == VK_SUCCESS) {
3835 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3836 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003837
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003838 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003839}
3840
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003841// This is a positive test. No errors should be generated.
Michael Lentine860b0fe2016-05-20 10:14:00 -05003842TEST_F(VkLayerTest, WaitEventThenSet) {
3843 TEST_DESCRIPTION(
3844 "Wait on a event then set it after the wait has been submitted.");
3845
Michael Lentine860b0fe2016-05-20 10:14:00 -05003846 m_errorMonitor->ExpectSuccess();
3847
3848 VkEvent event;
3849 VkEventCreateInfo event_create_info{};
3850 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
3851 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
3852
3853 VkCommandPool command_pool;
3854 VkCommandPoolCreateInfo pool_create_info{};
3855 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3856 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3857 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3858 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3859 &command_pool);
3860
3861 VkCommandBuffer command_buffer;
3862 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3863 command_buffer_allocate_info.sType =
3864 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3865 command_buffer_allocate_info.commandPool = command_pool;
3866 command_buffer_allocate_info.commandBufferCount = 1;
3867 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3868 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3869 &command_buffer);
3870
3871 VkQueue queue = VK_NULL_HANDLE;
3872 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06003873 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05003874
3875 {
3876 VkCommandBufferBeginInfo begin_info{};
3877 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3878 vkBeginCommandBuffer(command_buffer, &begin_info);
3879
3880 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT,
3881 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
3882 nullptr, 0, nullptr);
3883 vkCmdResetEvent(command_buffer, event,
3884 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
3885 vkEndCommandBuffer(command_buffer);
3886 }
3887 {
3888 VkSubmitInfo submit_info{};
3889 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3890 submit_info.commandBufferCount = 1;
3891 submit_info.pCommandBuffers = &command_buffer;
3892 submit_info.signalSemaphoreCount = 0;
3893 submit_info.pSignalSemaphores = nullptr;
3894 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
3895 }
3896 { vkSetEvent(m_device->device(), event); }
3897
3898 vkQueueWaitIdle(queue);
3899
3900 vkDestroyEvent(m_device->device(), event, nullptr);
3901 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
3902 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3903
3904 m_errorMonitor->VerifyNotFound();
3905}
Michael Lentine5627e692016-05-20 17:45:02 -05003906// This is a positive test. No errors should be generated.
3907TEST_F(VkLayerTest, QueryAndCopyMultipleCommandBuffers) {
3908 TEST_DESCRIPTION(
3909 "Issue a query and copy from it on a second command buffer.");
3910
3911 if ((m_device->queue_props.empty()) ||
3912 (m_device->queue_props[0].queueCount < 2))
3913 return;
3914
3915 m_errorMonitor->ExpectSuccess();
3916
3917 VkQueryPool query_pool;
3918 VkQueryPoolCreateInfo query_pool_create_info{};
3919 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
3920 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
3921 query_pool_create_info.queryCount = 1;
3922 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
3923 &query_pool);
3924
3925 VkCommandPool command_pool;
3926 VkCommandPoolCreateInfo pool_create_info{};
3927 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3928 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3929 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3930 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3931 &command_pool);
3932
3933 VkCommandBuffer command_buffer[2];
3934 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3935 command_buffer_allocate_info.sType =
3936 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3937 command_buffer_allocate_info.commandPool = command_pool;
3938 command_buffer_allocate_info.commandBufferCount = 2;
3939 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3940 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3941 command_buffer);
3942
3943 VkQueue queue = VK_NULL_HANDLE;
3944 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
3945 1, &queue);
3946
3947 uint32_t qfi = 0;
3948 VkBufferCreateInfo buff_create_info = {};
3949 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3950 buff_create_info.size = 1024;
3951 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
3952 buff_create_info.queueFamilyIndexCount = 1;
3953 buff_create_info.pQueueFamilyIndices = &qfi;
3954
3955 VkResult err;
3956 VkBuffer buffer;
3957 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
3958 ASSERT_VK_SUCCESS(err);
3959 VkMemoryAllocateInfo mem_alloc = {};
3960 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3961 mem_alloc.pNext = NULL;
3962 mem_alloc.allocationSize = 1024;
3963 mem_alloc.memoryTypeIndex = 0;
3964
3965 VkMemoryRequirements memReqs;
3966 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
3967 bool pass =
3968 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
3969 if (!pass) {
3970 vkDestroyBuffer(m_device->device(), buffer, NULL);
3971 return;
3972 }
3973
3974 VkDeviceMemory mem;
3975 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3976 ASSERT_VK_SUCCESS(err);
3977 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
3978 ASSERT_VK_SUCCESS(err);
3979
3980 {
3981 VkCommandBufferBeginInfo begin_info{};
3982 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3983 vkBeginCommandBuffer(command_buffer[0], &begin_info);
3984
3985 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
3986 vkCmdWriteTimestamp(command_buffer[0],
3987 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
3988
3989 vkEndCommandBuffer(command_buffer[0]);
3990
3991 vkBeginCommandBuffer(command_buffer[1], &begin_info);
3992
3993 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer,
3994 0, 0, 0);
3995
3996 vkEndCommandBuffer(command_buffer[1]);
3997 }
3998 {
3999 VkSubmitInfo submit_info{};
4000 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4001 submit_info.commandBufferCount = 2;
4002 submit_info.pCommandBuffers = command_buffer;
4003 submit_info.signalSemaphoreCount = 0;
4004 submit_info.pSignalSemaphores = nullptr;
4005 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4006 }
4007
4008 vkQueueWaitIdle(queue);
4009
4010 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
4011 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
4012 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06004013 vkDestroyBuffer(m_device->device(), buffer, NULL);
4014 vkFreeMemory(m_device->device(), mem, NULL);
Michael Lentine5627e692016-05-20 17:45:02 -05004015
4016 m_errorMonitor->VerifyNotFound();
4017}
Michael Lentine860b0fe2016-05-20 10:14:00 -05004018
4019TEST_F(VkLayerTest, ResetEventThenSet) {
4020 TEST_DESCRIPTION(
4021 "Reset an event then set it after the reset has been submitted.");
4022
Michael Lentine860b0fe2016-05-20 10:14:00 -05004023 m_errorMonitor->ExpectSuccess();
4024
4025 VkEvent event;
4026 VkEventCreateInfo event_create_info{};
4027 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4028 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
4029
4030 VkCommandPool command_pool;
4031 VkCommandPoolCreateInfo pool_create_info{};
4032 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4033 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4034 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4035 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4036 &command_pool);
4037
4038 VkCommandBuffer command_buffer;
4039 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4040 command_buffer_allocate_info.sType =
4041 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4042 command_buffer_allocate_info.commandPool = command_pool;
4043 command_buffer_allocate_info.commandBufferCount = 1;
4044 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4045 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4046 &command_buffer);
4047
4048 VkQueue queue = VK_NULL_HANDLE;
4049 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06004050 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05004051
4052 {
4053 VkCommandBufferBeginInfo begin_info{};
4054 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4055 vkBeginCommandBuffer(command_buffer, &begin_info);
4056
4057 vkCmdResetEvent(command_buffer, event,
4058 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
4059 vkCmdWaitEvents(command_buffer, 1, &event,
4060 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4061 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
4062 nullptr, 0, nullptr);
4063 vkEndCommandBuffer(command_buffer);
4064 }
4065 {
4066 VkSubmitInfo submit_info{};
4067 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4068 submit_info.commandBufferCount = 1;
4069 submit_info.pCommandBuffers = &command_buffer;
4070 submit_info.signalSemaphoreCount = 0;
4071 submit_info.pSignalSemaphores = nullptr;
4072 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4073 }
4074 {
4075 m_errorMonitor->SetDesiredFailureMsg(
4076 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkSetEvent() on event "
4077 "0x1 that is already in use by a "
4078 "command buffer.");
4079 vkSetEvent(m_device->device(), event);
4080 m_errorMonitor->VerifyFound();
4081 }
4082
4083 vkQueueWaitIdle(queue);
4084
4085 vkDestroyEvent(m_device->device(), event, nullptr);
4086 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
4087 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4088}
4089
4090// This is a positive test. No errors should be generated.
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004091TEST_F(VkLayerTest, TwoFencesThreeFrames) {
4092 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
4093 "run through a Submit & WaitForFences cycle 3 times. This "
4094 "previously revealed a bug so running this positive test "
4095 "to prevent a regression.");
4096 m_errorMonitor->ExpectSuccess();
4097
4098 ASSERT_NO_FATAL_FAILURE(InitState());
4099 VkQueue queue = VK_NULL_HANDLE;
4100 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4101 0, &queue);
4102
4103 static const uint32_t NUM_OBJECTS = 2;
4104 static const uint32_t NUM_FRAMES = 3;
4105 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
4106 VkFence fences[NUM_OBJECTS] = {};
4107
4108 VkCommandPool cmd_pool;
4109 VkCommandPoolCreateInfo cmd_pool_ci = {};
4110 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4111 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
4112 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4113 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci,
4114 nullptr, &cmd_pool);
4115 ASSERT_VK_SUCCESS(err);
4116
4117 VkCommandBufferAllocateInfo cmd_buf_info = {};
4118 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4119 cmd_buf_info.commandPool = cmd_pool;
4120 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4121 cmd_buf_info.commandBufferCount = 1;
4122
4123 VkFenceCreateInfo fence_ci = {};
4124 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4125 fence_ci.pNext = nullptr;
4126 fence_ci.flags = 0;
4127
4128 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
4129 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info,
4130 &cmd_buffers[i]);
4131 ASSERT_VK_SUCCESS(err);
4132 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
4133 ASSERT_VK_SUCCESS(err);
4134 }
4135
4136 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
Tobin Ehlisf9025162016-05-26 06:55:21 -06004137 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
4138 // Create empty cmd buffer
4139 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
4140 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004141
Tobin Ehlisf9025162016-05-26 06:55:21 -06004142 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
4143 ASSERT_VK_SUCCESS(err);
4144 err = vkEndCommandBuffer(cmd_buffers[obj]);
4145 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004146
Tobin Ehlisf9025162016-05-26 06:55:21 -06004147 VkSubmitInfo submit_info = {};
4148 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4149 submit_info.commandBufferCount = 1;
4150 submit_info.pCommandBuffers = &cmd_buffers[obj];
4151 // Submit cmd buffer and wait for fence
4152 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
4153 ASSERT_VK_SUCCESS(err);
4154 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE,
4155 UINT64_MAX);
4156 ASSERT_VK_SUCCESS(err);
4157 err = vkResetFences(m_device->device(), 1, &fences[obj]);
4158 ASSERT_VK_SUCCESS(err);
4159 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004160 }
4161 m_errorMonitor->VerifyNotFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06004162 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
4163 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
4164 vkDestroyFence(m_device->device(), fences[i], nullptr);
4165 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004166}
4167// This is a positive test. No errors should be generated.
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004168TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
4169
4170 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
4171 "submitted on separate queues followed by a QueueWaitIdle.");
4172
Dustin Graves48458142016-04-29 16:11:55 -06004173 if ((m_device->queue_props.empty()) ||
4174 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06004175 return;
4176
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004177 m_errorMonitor->ExpectSuccess();
4178
4179 VkSemaphore semaphore;
4180 VkSemaphoreCreateInfo semaphore_create_info{};
4181 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
4182 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
4183 &semaphore);
4184
4185 VkCommandPool command_pool;
4186 VkCommandPoolCreateInfo pool_create_info{};
4187 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4188 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4189 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4190 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4191 &command_pool);
4192
4193 VkCommandBuffer command_buffer[2];
4194 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4195 command_buffer_allocate_info.sType =
4196 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4197 command_buffer_allocate_info.commandPool = command_pool;
4198 command_buffer_allocate_info.commandBufferCount = 2;
4199 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4200 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4201 command_buffer);
4202
4203 VkQueue queue = VK_NULL_HANDLE;
4204 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4205 1, &queue);
4206
4207 {
4208 VkCommandBufferBeginInfo begin_info{};
4209 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4210 vkBeginCommandBuffer(command_buffer[0], &begin_info);
4211
4212 vkCmdPipelineBarrier(command_buffer[0],
4213 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4214 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
4215 0, nullptr, 0, nullptr);
4216
4217 VkViewport viewport{};
4218 viewport.maxDepth = 1.0f;
4219 viewport.minDepth = 0.0f;
4220 viewport.width = 512;
4221 viewport.height = 512;
4222 viewport.x = 0;
4223 viewport.y = 0;
4224 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
4225 vkEndCommandBuffer(command_buffer[0]);
4226 }
4227 {
4228 VkCommandBufferBeginInfo begin_info{};
4229 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4230 vkBeginCommandBuffer(command_buffer[1], &begin_info);
4231
4232 VkViewport viewport{};
4233 viewport.maxDepth = 1.0f;
4234 viewport.minDepth = 0.0f;
4235 viewport.width = 512;
4236 viewport.height = 512;
4237 viewport.x = 0;
4238 viewport.y = 0;
4239 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
4240 vkEndCommandBuffer(command_buffer[1]);
4241 }
4242 {
4243 VkSubmitInfo submit_info{};
4244 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4245 submit_info.commandBufferCount = 1;
4246 submit_info.pCommandBuffers = &command_buffer[0];
4247 submit_info.signalSemaphoreCount = 1;
4248 submit_info.pSignalSemaphores = &semaphore;
4249 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4250 }
4251 {
4252 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
4253 VkSubmitInfo submit_info{};
4254 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4255 submit_info.commandBufferCount = 1;
4256 submit_info.pCommandBuffers = &command_buffer[1];
4257 submit_info.waitSemaphoreCount = 1;
4258 submit_info.pWaitSemaphores = &semaphore;
4259 submit_info.pWaitDstStageMask = flags;
4260 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4261 }
4262
4263 vkQueueWaitIdle(m_device->m_queue);
4264
4265 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
4266 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
4267 &command_buffer[0]);
4268 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4269
4270 m_errorMonitor->VerifyNotFound();
4271}
4272
4273// This is a positive test. No errors should be generated.
4274TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
4275
4276 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
4277 "submitted on separate queues, the second having a fence"
4278 "followed by a QueueWaitIdle.");
4279
Dustin Graves48458142016-04-29 16:11:55 -06004280 if ((m_device->queue_props.empty()) ||
4281 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06004282 return;
4283
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004284 m_errorMonitor->ExpectSuccess();
4285
4286 VkFence fence;
4287 VkFenceCreateInfo fence_create_info{};
4288 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4289 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
4290
4291 VkSemaphore semaphore;
4292 VkSemaphoreCreateInfo semaphore_create_info{};
4293 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
4294 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
4295 &semaphore);
4296
4297 VkCommandPool command_pool;
4298 VkCommandPoolCreateInfo pool_create_info{};
4299 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4300 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4301 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4302 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4303 &command_pool);
4304
4305 VkCommandBuffer command_buffer[2];
4306 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4307 command_buffer_allocate_info.sType =
4308 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4309 command_buffer_allocate_info.commandPool = command_pool;
4310 command_buffer_allocate_info.commandBufferCount = 2;
4311 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4312 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4313 command_buffer);
4314
4315 VkQueue queue = VK_NULL_HANDLE;
4316 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4317 1, &queue);
4318
4319 {
4320 VkCommandBufferBeginInfo begin_info{};
4321 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4322 vkBeginCommandBuffer(command_buffer[0], &begin_info);
4323
4324 vkCmdPipelineBarrier(command_buffer[0],
4325 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4326 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
4327 0, nullptr, 0, nullptr);
4328
4329 VkViewport viewport{};
4330 viewport.maxDepth = 1.0f;
4331 viewport.minDepth = 0.0f;
4332 viewport.width = 512;
4333 viewport.height = 512;
4334 viewport.x = 0;
4335 viewport.y = 0;
4336 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
4337 vkEndCommandBuffer(command_buffer[0]);
4338 }
4339 {
4340 VkCommandBufferBeginInfo begin_info{};
4341 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4342 vkBeginCommandBuffer(command_buffer[1], &begin_info);
4343
4344 VkViewport viewport{};
4345 viewport.maxDepth = 1.0f;
4346 viewport.minDepth = 0.0f;
4347 viewport.width = 512;
4348 viewport.height = 512;
4349 viewport.x = 0;
4350 viewport.y = 0;
4351 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
4352 vkEndCommandBuffer(command_buffer[1]);
4353 }
4354 {
4355 VkSubmitInfo submit_info{};
4356 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4357 submit_info.commandBufferCount = 1;
4358 submit_info.pCommandBuffers = &command_buffer[0];
4359 submit_info.signalSemaphoreCount = 1;
4360 submit_info.pSignalSemaphores = &semaphore;
4361 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4362 }
4363 {
4364 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
4365 VkSubmitInfo submit_info{};
4366 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4367 submit_info.commandBufferCount = 1;
4368 submit_info.pCommandBuffers = &command_buffer[1];
4369 submit_info.waitSemaphoreCount = 1;
4370 submit_info.pWaitSemaphores = &semaphore;
4371 submit_info.pWaitDstStageMask = flags;
4372 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
4373 }
4374
4375 vkQueueWaitIdle(m_device->m_queue);
4376
4377 vkDestroyFence(m_device->device(), fence, nullptr);
4378 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
4379 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
4380 &command_buffer[0]);
4381 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4382
4383 m_errorMonitor->VerifyNotFound();
4384}
4385
4386// This is a positive test. No errors should be generated.
4387TEST_F(VkLayerTest,
4388 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
4389
4390 TEST_DESCRIPTION(
4391 "Two command buffers, each in a separate QueueSubmit call "
4392 "submitted on separate queues, the second having a fence"
4393 "followed by two consecutive WaitForFences calls on the same fence.");
4394
Dustin Graves48458142016-04-29 16:11:55 -06004395 if ((m_device->queue_props.empty()) ||
4396 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06004397 return;
4398
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004399 m_errorMonitor->ExpectSuccess();
4400
4401 VkFence fence;
4402 VkFenceCreateInfo fence_create_info{};
4403 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4404 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
4405
4406 VkSemaphore semaphore;
4407 VkSemaphoreCreateInfo semaphore_create_info{};
4408 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
4409 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
4410 &semaphore);
4411
4412 VkCommandPool command_pool;
4413 VkCommandPoolCreateInfo pool_create_info{};
4414 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4415 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4416 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4417 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4418 &command_pool);
4419
4420 VkCommandBuffer command_buffer[2];
4421 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4422 command_buffer_allocate_info.sType =
4423 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4424 command_buffer_allocate_info.commandPool = command_pool;
4425 command_buffer_allocate_info.commandBufferCount = 2;
4426 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4427 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4428 command_buffer);
4429
4430 VkQueue queue = VK_NULL_HANDLE;
4431 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4432 1, &queue);
4433
4434 {
4435 VkCommandBufferBeginInfo begin_info{};
4436 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4437 vkBeginCommandBuffer(command_buffer[0], &begin_info);
4438
4439 vkCmdPipelineBarrier(command_buffer[0],
4440 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4441 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
4442 0, nullptr, 0, nullptr);
4443
4444 VkViewport viewport{};
4445 viewport.maxDepth = 1.0f;
4446 viewport.minDepth = 0.0f;
4447 viewport.width = 512;
4448 viewport.height = 512;
4449 viewport.x = 0;
4450 viewport.y = 0;
4451 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
4452 vkEndCommandBuffer(command_buffer[0]);
4453 }
4454 {
4455 VkCommandBufferBeginInfo begin_info{};
4456 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4457 vkBeginCommandBuffer(command_buffer[1], &begin_info);
4458
4459 VkViewport viewport{};
4460 viewport.maxDepth = 1.0f;
4461 viewport.minDepth = 0.0f;
4462 viewport.width = 512;
4463 viewport.height = 512;
4464 viewport.x = 0;
4465 viewport.y = 0;
4466 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
4467 vkEndCommandBuffer(command_buffer[1]);
4468 }
4469 {
4470 VkSubmitInfo submit_info{};
4471 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4472 submit_info.commandBufferCount = 1;
4473 submit_info.pCommandBuffers = &command_buffer[0];
4474 submit_info.signalSemaphoreCount = 1;
4475 submit_info.pSignalSemaphores = &semaphore;
4476 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4477 }
4478 {
4479 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
4480 VkSubmitInfo submit_info{};
4481 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4482 submit_info.commandBufferCount = 1;
4483 submit_info.pCommandBuffers = &command_buffer[1];
4484 submit_info.waitSemaphoreCount = 1;
4485 submit_info.pWaitSemaphores = &semaphore;
4486 submit_info.pWaitDstStageMask = flags;
4487 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
4488 }
4489
4490 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4491 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4492
4493 vkDestroyFence(m_device->device(), fence, nullptr);
4494 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
4495 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
4496 &command_buffer[0]);
4497 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4498
4499 m_errorMonitor->VerifyNotFound();
4500}
4501
Chris Forbes0f8126b2016-06-20 17:48:22 +12004502#if 0
4503TEST_F(VkLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
4504 if ((m_device->queue_props.empty()) ||
4505 (m_device->queue_props[0].queueCount < 2)) {
4506 printf("Test requires two queues, skipping\n");
4507 return;
4508 }
4509
4510 VkResult err;
4511
4512 m_errorMonitor->ExpectSuccess();
4513
4514 VkQueue q0 = m_device->m_queue;
4515 VkQueue q1 = nullptr;
4516 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
4517 ASSERT_NE(q1, nullptr);
4518
4519 // An (empty) command buffer. We must have work in the first submission --
4520 // the layer treats unfenced work differently from fenced work.
4521 VkCommandPoolCreateInfo cpci = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0 };
4522 VkCommandPool pool;
4523 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
4524 ASSERT_VK_SUCCESS(err);
4525 VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr,
4526 pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1
4527 };
4528 VkCommandBuffer cb;
4529 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
4530 ASSERT_VK_SUCCESS(err);
4531 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
4532 0, nullptr
4533 };
4534 err = vkBeginCommandBuffer(cb, &cbbi);
4535 ASSERT_VK_SUCCESS(err);
4536 err = vkEndCommandBuffer(cb);
4537 ASSERT_VK_SUCCESS(err);
4538
4539 // A semaphore
4540 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
4541 VkSemaphore s;
4542 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
4543 ASSERT_VK_SUCCESS(err);
4544
4545 // First submission, to q0
4546 VkSubmitInfo s0 = {
4547 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
4548 0, nullptr, nullptr,
4549 1, &cb,
4550 1, &s
4551 };
4552
4553 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
4554 ASSERT_VK_SUCCESS(err);
4555
4556 // Second submission, to q1, waiting on s
4557 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
4558 VkSubmitInfo s1 = {
4559 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
4560 1, &s, &waitmask,
4561 0, nullptr,
4562 0, nullptr
4563 };
4564
4565 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
4566 ASSERT_VK_SUCCESS(err);
4567
4568 // Wait for q0 idle
4569 err = vkQueueWaitIdle(q0);
4570 ASSERT_VK_SUCCESS(err);
4571
4572 // Command buffer should have been completed (it was on q0); reset the pool.
4573 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
4574
4575 m_errorMonitor->VerifyNotFound();
4576
4577 // Force device completely idle and clean up resources
4578 vkDeviceWaitIdle(m_device->device());
4579 vkDestroyCommandPool(m_device->device(), pool, nullptr);
4580 vkDestroySemaphore(m_device->device(), s, nullptr);
4581}
4582#endif
4583
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004584// This is a positive test. No errors should be generated.
4585TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
4586
4587 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
4588 "submitted on separate queues, the second having a fence, "
4589 "followed by a WaitForFences call.");
4590
Dustin Graves48458142016-04-29 16:11:55 -06004591 if ((m_device->queue_props.empty()) ||
4592 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06004593 return;
4594
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004595 m_errorMonitor->ExpectSuccess();
4596
4597 VkFence fence;
4598 VkFenceCreateInfo fence_create_info{};
4599 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4600 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
4601
4602 VkSemaphore semaphore;
4603 VkSemaphoreCreateInfo semaphore_create_info{};
4604 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
4605 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
4606 &semaphore);
4607
4608 VkCommandPool command_pool;
4609 VkCommandPoolCreateInfo pool_create_info{};
4610 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4611 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4612 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4613 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4614 &command_pool);
4615
4616 VkCommandBuffer command_buffer[2];
4617 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4618 command_buffer_allocate_info.sType =
4619 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4620 command_buffer_allocate_info.commandPool = command_pool;
4621 command_buffer_allocate_info.commandBufferCount = 2;
4622 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4623 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4624 command_buffer);
4625
4626 VkQueue queue = VK_NULL_HANDLE;
4627 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4628 1, &queue);
4629
4630
4631 {
4632 VkCommandBufferBeginInfo begin_info{};
4633 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4634 vkBeginCommandBuffer(command_buffer[0], &begin_info);
4635
4636 vkCmdPipelineBarrier(command_buffer[0],
4637 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4638 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
4639 0, nullptr, 0, nullptr);
4640
4641 VkViewport viewport{};
4642 viewport.maxDepth = 1.0f;
4643 viewport.minDepth = 0.0f;
4644 viewport.width = 512;
4645 viewport.height = 512;
4646 viewport.x = 0;
4647 viewport.y = 0;
4648 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
4649 vkEndCommandBuffer(command_buffer[0]);
4650 }
4651 {
4652 VkCommandBufferBeginInfo begin_info{};
4653 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4654 vkBeginCommandBuffer(command_buffer[1], &begin_info);
4655
4656 VkViewport viewport{};
4657 viewport.maxDepth = 1.0f;
4658 viewport.minDepth = 0.0f;
4659 viewport.width = 512;
4660 viewport.height = 512;
4661 viewport.x = 0;
4662 viewport.y = 0;
4663 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
4664 vkEndCommandBuffer(command_buffer[1]);
4665 }
4666 {
4667 VkSubmitInfo submit_info{};
4668 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4669 submit_info.commandBufferCount = 1;
4670 submit_info.pCommandBuffers = &command_buffer[0];
4671 submit_info.signalSemaphoreCount = 1;
4672 submit_info.pSignalSemaphores = &semaphore;
4673 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4674 }
4675 {
4676 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
4677 VkSubmitInfo submit_info{};
4678 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4679 submit_info.commandBufferCount = 1;
4680 submit_info.pCommandBuffers = &command_buffer[1];
4681 submit_info.waitSemaphoreCount = 1;
4682 submit_info.pWaitSemaphores = &semaphore;
4683 submit_info.pWaitDstStageMask = flags;
4684 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
4685 }
4686
4687 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4688
4689 vkDestroyFence(m_device->device(), fence, nullptr);
4690 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
4691 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
4692 &command_buffer[0]);
4693 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4694
4695 m_errorMonitor->VerifyNotFound();
4696}
4697
4698// This is a positive test. No errors should be generated.
4699TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
4700
4701 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
4702 "on the same queue, sharing a signal/wait semaphore, the "
4703 "second having a fence, "
4704 "followed by a WaitForFences call.");
4705
4706 m_errorMonitor->ExpectSuccess();
4707
4708 VkFence fence;
4709 VkFenceCreateInfo fence_create_info{};
4710 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4711 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
4712
4713 VkSemaphore semaphore;
4714 VkSemaphoreCreateInfo semaphore_create_info{};
4715 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
4716 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
4717 &semaphore);
4718
4719 VkCommandPool command_pool;
4720 VkCommandPoolCreateInfo pool_create_info{};
4721 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4722 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4723 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4724 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4725 &command_pool);
4726
4727 VkCommandBuffer command_buffer[2];
4728 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4729 command_buffer_allocate_info.sType =
4730 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4731 command_buffer_allocate_info.commandPool = command_pool;
4732 command_buffer_allocate_info.commandBufferCount = 2;
4733 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4734 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4735 command_buffer);
4736
4737 {
4738 VkCommandBufferBeginInfo begin_info{};
4739 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4740 vkBeginCommandBuffer(command_buffer[0], &begin_info);
4741
4742 vkCmdPipelineBarrier(command_buffer[0],
4743 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4744 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
4745 0, nullptr, 0, nullptr);
4746
4747 VkViewport viewport{};
4748 viewport.maxDepth = 1.0f;
4749 viewport.minDepth = 0.0f;
4750 viewport.width = 512;
4751 viewport.height = 512;
4752 viewport.x = 0;
4753 viewport.y = 0;
4754 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
4755 vkEndCommandBuffer(command_buffer[0]);
4756 }
4757 {
4758 VkCommandBufferBeginInfo begin_info{};
4759 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4760 vkBeginCommandBuffer(command_buffer[1], &begin_info);
4761
4762 VkViewport viewport{};
4763 viewport.maxDepth = 1.0f;
4764 viewport.minDepth = 0.0f;
4765 viewport.width = 512;
4766 viewport.height = 512;
4767 viewport.x = 0;
4768 viewport.y = 0;
4769 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
4770 vkEndCommandBuffer(command_buffer[1]);
4771 }
4772 {
4773 VkSubmitInfo submit_info{};
4774 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4775 submit_info.commandBufferCount = 1;
4776 submit_info.pCommandBuffers = &command_buffer[0];
4777 submit_info.signalSemaphoreCount = 1;
4778 submit_info.pSignalSemaphores = &semaphore;
4779 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4780 }
4781 {
4782 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
4783 VkSubmitInfo submit_info{};
4784 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4785 submit_info.commandBufferCount = 1;
4786 submit_info.pCommandBuffers = &command_buffer[1];
4787 submit_info.waitSemaphoreCount = 1;
4788 submit_info.pWaitSemaphores = &semaphore;
4789 submit_info.pWaitDstStageMask = flags;
4790 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
4791 }
4792
4793 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4794
4795 vkDestroyFence(m_device->device(), fence, nullptr);
4796 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
4797 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
4798 &command_buffer[0]);
4799 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4800
4801 m_errorMonitor->VerifyNotFound();
4802}
4803
4804// This is a positive test. No errors should be generated.
4805TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
4806
4807 TEST_DESCRIPTION(
4808 "Two command buffers, each in a separate QueueSubmit call "
4809 "on the same queue, no fences, followed by a third QueueSubmit with NO "
4810 "SubmitInfos but with a fence, followed by a WaitForFences call.");
4811
4812 m_errorMonitor->ExpectSuccess();
4813
4814 VkFence fence;
4815 VkFenceCreateInfo fence_create_info{};
4816 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4817 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
4818
4819 VkCommandPool command_pool;
4820 VkCommandPoolCreateInfo pool_create_info{};
4821 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4822 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4823 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4824 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4825 &command_pool);
4826
4827 VkCommandBuffer command_buffer[2];
4828 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4829 command_buffer_allocate_info.sType =
4830 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4831 command_buffer_allocate_info.commandPool = command_pool;
4832 command_buffer_allocate_info.commandBufferCount = 2;
4833 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4834 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4835 command_buffer);
4836
4837 {
4838 VkCommandBufferBeginInfo begin_info{};
4839 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4840 vkBeginCommandBuffer(command_buffer[0], &begin_info);
4841
4842 vkCmdPipelineBarrier(command_buffer[0],
4843 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4844 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
4845 0, nullptr, 0, nullptr);
4846
4847 VkViewport viewport{};
4848 viewport.maxDepth = 1.0f;
4849 viewport.minDepth = 0.0f;
4850 viewport.width = 512;
4851 viewport.height = 512;
4852 viewport.x = 0;
4853 viewport.y = 0;
4854 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
4855 vkEndCommandBuffer(command_buffer[0]);
4856 }
4857 {
4858 VkCommandBufferBeginInfo begin_info{};
4859 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4860 vkBeginCommandBuffer(command_buffer[1], &begin_info);
4861
4862 VkViewport viewport{};
4863 viewport.maxDepth = 1.0f;
4864 viewport.minDepth = 0.0f;
4865 viewport.width = 512;
4866 viewport.height = 512;
4867 viewport.x = 0;
4868 viewport.y = 0;
4869 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
4870 vkEndCommandBuffer(command_buffer[1]);
4871 }
4872 {
4873 VkSubmitInfo submit_info{};
4874 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4875 submit_info.commandBufferCount = 1;
4876 submit_info.pCommandBuffers = &command_buffer[0];
4877 submit_info.signalSemaphoreCount = 0;
4878 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
4879 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4880 }
4881 {
4882 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
4883 VkSubmitInfo submit_info{};
4884 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4885 submit_info.commandBufferCount = 1;
4886 submit_info.pCommandBuffers = &command_buffer[1];
4887 submit_info.waitSemaphoreCount = 0;
4888 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
4889 submit_info.pWaitDstStageMask = flags;
4890 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4891 }
4892
4893 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
4894
Mike Stroyancd1c3e52016-06-21 09:20:01 -06004895 VkResult err =
4896 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4897 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004898
4899 vkDestroyFence(m_device->device(), fence, nullptr);
4900 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
4901 &command_buffer[0]);
4902 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4903
4904 m_errorMonitor->VerifyNotFound();
4905}
4906
4907// This is a positive test. No errors should be generated.
4908TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
4909
4910 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
4911 "on the same queue, the second having a fence, followed "
4912 "by a WaitForFences call.");
4913
4914 m_errorMonitor->ExpectSuccess();
4915
4916 VkFence fence;
4917 VkFenceCreateInfo fence_create_info{};
4918 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4919 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
4920
4921 VkCommandPool command_pool;
4922 VkCommandPoolCreateInfo pool_create_info{};
4923 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4924 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4925 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4926 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4927 &command_pool);
4928
4929 VkCommandBuffer command_buffer[2];
4930 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4931 command_buffer_allocate_info.sType =
4932 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4933 command_buffer_allocate_info.commandPool = command_pool;
4934 command_buffer_allocate_info.commandBufferCount = 2;
4935 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4936 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4937 command_buffer);
4938
4939 {
4940 VkCommandBufferBeginInfo begin_info{};
4941 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4942 vkBeginCommandBuffer(command_buffer[0], &begin_info);
4943
4944 vkCmdPipelineBarrier(command_buffer[0],
4945 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4946 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
4947 0, nullptr, 0, nullptr);
4948
4949 VkViewport viewport{};
4950 viewport.maxDepth = 1.0f;
4951 viewport.minDepth = 0.0f;
4952 viewport.width = 512;
4953 viewport.height = 512;
4954 viewport.x = 0;
4955 viewport.y = 0;
4956 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
4957 vkEndCommandBuffer(command_buffer[0]);
4958 }
4959 {
4960 VkCommandBufferBeginInfo begin_info{};
4961 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4962 vkBeginCommandBuffer(command_buffer[1], &begin_info);
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[1], 0, 1, &viewport);
4972 vkEndCommandBuffer(command_buffer[1]);
4973 }
4974 {
4975 VkSubmitInfo submit_info{};
4976 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4977 submit_info.commandBufferCount = 1;
4978 submit_info.pCommandBuffers = &command_buffer[0];
4979 submit_info.signalSemaphoreCount = 0;
4980 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
4981 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4982 }
4983 {
4984 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
4985 VkSubmitInfo submit_info{};
4986 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4987 submit_info.commandBufferCount = 1;
4988 submit_info.pCommandBuffers = &command_buffer[1];
4989 submit_info.waitSemaphoreCount = 0;
4990 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
4991 submit_info.pWaitDstStageMask = flags;
4992 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
4993 }
4994
4995 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4996
4997 vkDestroyFence(m_device->device(), fence, nullptr);
4998 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
4999 &command_buffer[0]);
5000 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5001
5002 m_errorMonitor->VerifyNotFound();
5003}
5004
5005// This is a positive test. No errors should be generated.
5006TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
5007
5008 TEST_DESCRIPTION(
5009 "Two command buffers each in a separate SubmitInfo sent in a single "
5010 "QueueSubmit call followed by a WaitForFences call.");
5011
5012 m_errorMonitor->ExpectSuccess();
5013
5014 VkFence fence;
5015 VkFenceCreateInfo fence_create_info{};
5016 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5017 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5018
5019 VkSemaphore semaphore;
5020 VkSemaphoreCreateInfo semaphore_create_info{};
5021 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5022 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5023 &semaphore);
5024
5025 VkCommandPool command_pool;
5026 VkCommandPoolCreateInfo pool_create_info{};
5027 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5028 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5029 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5030 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5031 &command_pool);
5032
5033 VkCommandBuffer command_buffer[2];
5034 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5035 command_buffer_allocate_info.sType =
5036 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5037 command_buffer_allocate_info.commandPool = command_pool;
5038 command_buffer_allocate_info.commandBufferCount = 2;
5039 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5040 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5041 command_buffer);
5042
5043 {
5044 VkCommandBufferBeginInfo begin_info{};
5045 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5046 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5047
5048 vkCmdPipelineBarrier(command_buffer[0],
5049 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5050 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5051 0, nullptr, 0, nullptr);
5052
5053 VkViewport viewport{};
5054 viewport.maxDepth = 1.0f;
5055 viewport.minDepth = 0.0f;
5056 viewport.width = 512;
5057 viewport.height = 512;
5058 viewport.x = 0;
5059 viewport.y = 0;
5060 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5061 vkEndCommandBuffer(command_buffer[0]);
5062 }
5063 {
5064 VkCommandBufferBeginInfo begin_info{};
5065 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5066 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5067
5068 VkViewport viewport{};
5069 viewport.maxDepth = 1.0f;
5070 viewport.minDepth = 0.0f;
5071 viewport.width = 512;
5072 viewport.height = 512;
5073 viewport.x = 0;
5074 viewport.y = 0;
5075 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5076 vkEndCommandBuffer(command_buffer[1]);
5077 }
5078 {
5079 VkSubmitInfo submit_info[2];
5080 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5081
5082 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5083 submit_info[0].pNext = NULL;
5084 submit_info[0].commandBufferCount = 1;
5085 submit_info[0].pCommandBuffers = &command_buffer[0];
5086 submit_info[0].signalSemaphoreCount = 1;
5087 submit_info[0].pSignalSemaphores = &semaphore;
5088 submit_info[0].waitSemaphoreCount = 0;
5089 submit_info[0].pWaitSemaphores = NULL;
5090 submit_info[0].pWaitDstStageMask = 0;
5091
5092 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5093 submit_info[1].pNext = NULL;
5094 submit_info[1].commandBufferCount = 1;
5095 submit_info[1].pCommandBuffers = &command_buffer[1];
5096 submit_info[1].waitSemaphoreCount = 1;
5097 submit_info[1].pWaitSemaphores = &semaphore;
5098 submit_info[1].pWaitDstStageMask = flags;
5099 submit_info[1].signalSemaphoreCount = 0;
5100 submit_info[1].pSignalSemaphores = NULL;
5101 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
5102 }
5103
5104 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5105
5106 vkDestroyFence(m_device->device(), fence, nullptr);
5107 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5108 &command_buffer[0]);
5109 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06005110 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005111
5112 m_errorMonitor->VerifyNotFound();
5113}
5114
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005115TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005116 TEST_DESCRIPTION(
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005117 "Run a simple draw calls to validate failure when Depth Bias dynamic "
5118 "state is required but not correctly bound.");
5119
5120 // Dynamic depth bias
5121 m_errorMonitor->SetDesiredFailureMsg(
5122 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5123 "Dynamic depth bias state not set for this command buffer");
5124 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5125 BsoFailDepthBias);
5126 m_errorMonitor->VerifyFound();
5127}
5128
5129TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
5130 TEST_DESCRIPTION(
5131 "Run a simple draw calls to validate failure when Line Width dynamic "
5132 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005133
5134 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07005135 m_errorMonitor->SetDesiredFailureMsg(
5136 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005137 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005138 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5139 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005140 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005141}
5142
5143TEST_F(VkLayerTest, DynamicViewportNotBound) {
5144 TEST_DESCRIPTION(
5145 "Run a simple draw calls to validate failure when Viewport dynamic "
5146 "state is required but not correctly bound.");
5147
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005148 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07005149 m_errorMonitor->SetDesiredFailureMsg(
5150 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005151 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005152 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5153 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005154 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005155}
5156
5157TEST_F(VkLayerTest, DynamicScissorNotBound) {
5158 TEST_DESCRIPTION(
5159 "Run a simple draw calls to validate failure when Scissor dynamic "
5160 "state is required but not correctly bound.");
5161
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005162 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07005163 m_errorMonitor->SetDesiredFailureMsg(
5164 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005165 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005166 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5167 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005168 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005169}
5170
Tobin Ehlis21c88352016-05-26 06:15:45 -06005171TEST_F(VkLayerTest, DynamiBlendConstantsNotBound) {
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005172 TEST_DESCRIPTION(
Tobin Ehlis21c88352016-05-26 06:15:45 -06005173 "Run a simple draw calls to validate failure when Blend Constants "
5174 "dynamic state is required but not correctly bound.");
5175 // Dynamic blend constant state
5176 m_errorMonitor->SetDesiredFailureMsg(
5177 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5178 "Dynamic blend constants state not set for this command buffer");
5179 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5180 BsoFailBlend);
5181 m_errorMonitor->VerifyFound();
5182}
5183
5184TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
5185 TEST_DESCRIPTION(
5186 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005187 "state is required but not correctly bound.");
Tobin Ehlis21c88352016-05-26 06:15:45 -06005188 if (!m_device->phy().features().depthBounds) {
5189 printf("Device does not support depthBounds test; skipped.\n");
5190 return;
5191 }
5192 // Dynamic depth bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005193 m_errorMonitor->SetDesiredFailureMsg(
5194 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005195 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005196 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5197 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005198 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005199}
5200
5201TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
5202 TEST_DESCRIPTION(
5203 "Run a simple draw calls to validate failure when Stencil Read dynamic "
5204 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005205 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07005206 m_errorMonitor->SetDesiredFailureMsg(
5207 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005208 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005209 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5210 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005211 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005212}
5213
5214TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
5215 TEST_DESCRIPTION(
5216 "Run a simple draw calls to validate failure when Stencil Write dynamic"
5217 " state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005218 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07005219 m_errorMonitor->SetDesiredFailureMsg(
5220 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005221 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005222 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5223 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005224 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005225}
5226
5227TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
5228 TEST_DESCRIPTION(
5229 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
5230 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005231 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07005232 m_errorMonitor->SetDesiredFailureMsg(
5233 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005234 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005235 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5236 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005237 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06005238}
5239
Karl Schultz6addd812016-02-02 17:17:23 -07005240TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Karl Schultz6addd812016-02-02 17:17:23 -07005241 m_errorMonitor->SetDesiredFailureMsg(
5242 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5243 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
5244 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06005245
Tobin Ehlis59278bf2015-08-18 07:10:58 -06005246 ASSERT_NO_FATAL_FAILURE(InitState());
5247 ASSERT_NO_FATAL_FAILURE(InitViewport());
5248 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5249
Karl Schultz6addd812016-02-02 17:17:23 -07005250 // We luck out b/c by default the framework creates CB w/ the
5251 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06005252 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005253 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
5254 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06005255 EndCommandBuffer();
5256
Tobin Ehlis59278bf2015-08-18 07:10:58 -06005257 // Bypass framework since it does the waits automatically
5258 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06005259 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08005260 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5261 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005262 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06005263 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07005264 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005265 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005266 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08005267 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06005268 submit_info.pSignalSemaphores = NULL;
5269
Chris Forbes40028e22016-06-13 09:59:34 +12005270 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07005271 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06005272
Karl Schultz6addd812016-02-02 17:17:23 -07005273 // Cause validation error by re-submitting cmd buffer that should only be
5274 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12005275 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06005276
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005277 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06005278}
5279
Karl Schultz6addd812016-02-02 17:17:23 -07005280TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06005281 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07005282 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06005283
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005284 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005285 "Unable to allocate 1 descriptors of "
5286 "type "
5287 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005288
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06005289 ASSERT_NO_FATAL_FAILURE(InitState());
5290 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06005291
Karl Schultz6addd812016-02-02 17:17:23 -07005292 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
5293 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005294 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005295 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
5296 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06005297
5298 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005299 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5300 ds_pool_ci.pNext = NULL;
5301 ds_pool_ci.flags = 0;
5302 ds_pool_ci.maxSets = 1;
5303 ds_pool_ci.poolSizeCount = 1;
5304 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06005305
5306 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005307 err =
5308 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06005309 ASSERT_VK_SUCCESS(err);
5310
5311 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005312 dsl_binding.binding = 0;
5313 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5314 dsl_binding.descriptorCount = 1;
5315 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5316 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06005317
5318 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005319 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5320 ds_layout_ci.pNext = NULL;
5321 ds_layout_ci.bindingCount = 1;
5322 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06005323
5324 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005325 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5326 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06005327 ASSERT_VK_SUCCESS(err);
5328
5329 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005330 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005331 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005332 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005333 alloc_info.descriptorPool = ds_pool;
5334 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005335 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5336 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06005337
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005338 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06005339
Chia-I Wuf7458c52015-10-26 21:10:41 +08005340 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5341 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06005342}
5343
Karl Schultz6addd812016-02-02 17:17:23 -07005344TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
5345 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06005346
Karl Schultz6addd812016-02-02 17:17:23 -07005347 m_errorMonitor->SetDesiredFailureMsg(
5348 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5349 "It is invalid to call vkFreeDescriptorSets() with a pool created "
5350 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005351
Tobin Ehlise735c692015-10-08 13:13:50 -06005352 ASSERT_NO_FATAL_FAILURE(InitState());
5353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06005354
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005355 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005356 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5357 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06005358
5359 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005360 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5361 ds_pool_ci.pNext = NULL;
5362 ds_pool_ci.maxSets = 1;
5363 ds_pool_ci.poolSizeCount = 1;
5364 ds_pool_ci.flags = 0;
5365 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
5366 // app can only call vkResetDescriptorPool on this pool.;
5367 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06005368
5369 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005370 err =
5371 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06005372 ASSERT_VK_SUCCESS(err);
5373
5374 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005375 dsl_binding.binding = 0;
5376 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5377 dsl_binding.descriptorCount = 1;
5378 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5379 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06005380
5381 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005382 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5383 ds_layout_ci.pNext = NULL;
5384 ds_layout_ci.bindingCount = 1;
5385 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06005386
5387 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005388 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5389 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06005390 ASSERT_VK_SUCCESS(err);
5391
5392 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005393 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005394 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005395 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005396 alloc_info.descriptorPool = ds_pool;
5397 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005398 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5399 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06005400 ASSERT_VK_SUCCESS(err);
5401
5402 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005403 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06005404
Chia-I Wuf7458c52015-10-26 21:10:41 +08005405 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5406 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06005407}
5408
Karl Schultz6addd812016-02-02 17:17:23 -07005409TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06005410 // Attempt to clear Descriptor Pool with bad object.
5411 // ObjectTracker should catch this.
5412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5413 "Invalid VkDescriptorPool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06005414 uint64_t fake_pool_handle = 0xbaad6001;
5415 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
5416 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06005417 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005418}
5419
Karl Schultz6addd812016-02-02 17:17:23 -07005420TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06005421 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
5422 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005423 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06005424 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06005425
5426 uint64_t fake_set_handle = 0xbaad6001;
5427 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06005428 VkResult err;
5429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5430 "Invalid VkDescriptorSet Object 0xbaad6001");
5431
5432 ASSERT_NO_FATAL_FAILURE(InitState());
5433
5434 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
5435 layout_bindings[0].binding = 0;
5436 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5437 layout_bindings[0].descriptorCount = 1;
5438 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
5439 layout_bindings[0].pImmutableSamplers = NULL;
5440
5441 VkDescriptorSetLayout descriptor_set_layout;
5442 VkDescriptorSetLayoutCreateInfo dslci = {};
5443 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5444 dslci.pNext = NULL;
5445 dslci.bindingCount = 1;
5446 dslci.pBindings = layout_bindings;
5447 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06005448 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06005449
5450 VkPipelineLayout pipeline_layout;
5451 VkPipelineLayoutCreateInfo plci = {};
5452 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5453 plci.pNext = NULL;
5454 plci.setLayoutCount = 1;
5455 plci.pSetLayouts = &descriptor_set_layout;
5456 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06005457 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06005458
5459 BeginCommandBuffer();
5460 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06005461 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06005462 m_errorMonitor->VerifyFound();
5463 EndCommandBuffer();
5464 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
5465 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005466}
5467
Karl Schultz6addd812016-02-02 17:17:23 -07005468TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06005469 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
5470 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06005471 uint64_t fake_layout_handle = 0xbaad6001;
5472 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06005473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5474 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
5475
5476 VkPipelineLayout pipeline_layout;
5477 VkPipelineLayoutCreateInfo plci = {};
5478 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5479 plci.pNext = NULL;
5480 plci.setLayoutCount = 1;
5481 plci.pSetLayouts = &bad_layout;
5482 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
5483
5484 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005485}
5486
Mark Muellerd4914412016-06-13 17:52:06 -06005487TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
5488 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
5489 "1) A uniform buffer update must have a valid buffer index."
5490 "2) When using an array of descriptors in a single WriteDescriptor,"
5491 " the descriptor types and stageflags must all be the same."
5492 "3) Immutable Sampler state must match across descriptors");
5493
5494 const char *invalid_BufferInfo_ErrorMessage =
5495 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
5496 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
5497 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
5498 const char *stateFlag_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06005499 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06005500 const char *immutable_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06005501 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06005502
Mark Muellerd4914412016-06-13 17:52:06 -06005503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
5504
5505 ASSERT_NO_FATAL_FAILURE(InitState());
5506 VkDescriptorPoolSize ds_type_count[4] = {};
5507 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5508 ds_type_count[0].descriptorCount = 1;
5509 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5510 ds_type_count[1].descriptorCount = 1;
5511 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5512 ds_type_count[2].descriptorCount = 1;
5513 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
5514 ds_type_count[3].descriptorCount = 1;
5515
5516 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5517 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5518 ds_pool_ci.maxSets = 1;
5519 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
5520 ds_pool_ci.pPoolSizes = ds_type_count;
5521
5522 VkDescriptorPool ds_pool;
5523 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5524 ASSERT_VK_SUCCESS(err);
5525
Mark Muellerb9896722016-06-16 09:54:29 -06005526 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06005527 layout_binding[0].binding = 0;
5528 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5529 layout_binding[0].descriptorCount = 1;
5530 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
5531 layout_binding[0].pImmutableSamplers = NULL;
5532
5533 layout_binding[1].binding = 1;
5534 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5535 layout_binding[1].descriptorCount = 1;
5536 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
5537 layout_binding[1].pImmutableSamplers = NULL;
5538
5539 VkSamplerCreateInfo sampler_ci = {};
5540 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5541 sampler_ci.pNext = NULL;
5542 sampler_ci.magFilter = VK_FILTER_NEAREST;
5543 sampler_ci.minFilter = VK_FILTER_NEAREST;
5544 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5545 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5546 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5547 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5548 sampler_ci.mipLodBias = 1.0;
5549 sampler_ci.anisotropyEnable = VK_FALSE;
5550 sampler_ci.maxAnisotropy = 1;
5551 sampler_ci.compareEnable = VK_FALSE;
5552 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5553 sampler_ci.minLod = 1.0;
5554 sampler_ci.maxLod = 1.0;
5555 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5556 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5557 VkSampler sampler;
5558
5559 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5560 ASSERT_VK_SUCCESS(err);
5561
5562 layout_binding[2].binding = 2;
5563 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5564 layout_binding[2].descriptorCount = 1;
5565 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
5566 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
5567
Mark Muellerd4914412016-06-13 17:52:06 -06005568 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5569 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5570 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
5571 ds_layout_ci.pBindings = layout_binding;
5572 VkDescriptorSetLayout ds_layout;
5573 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
5574 ASSERT_VK_SUCCESS(err);
5575
5576 VkDescriptorSetAllocateInfo alloc_info = {};
5577 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5578 alloc_info.descriptorSetCount = 1;
5579 alloc_info.descriptorPool = ds_pool;
5580 alloc_info.pSetLayouts = &ds_layout;
5581 VkDescriptorSet descriptorSet;
5582 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
5583 ASSERT_VK_SUCCESS(err);
5584
5585 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5586 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5587 pipeline_layout_ci.pNext = NULL;
5588 pipeline_layout_ci.setLayoutCount = 1;
5589 pipeline_layout_ci.pSetLayouts = &ds_layout;
5590
5591 VkPipelineLayout pipeline_layout;
5592 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5593 ASSERT_VK_SUCCESS(err);
5594
Mark Mueller5c838ce2016-06-16 09:54:29 -06005595 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06005596 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5597 descriptor_write.dstSet = descriptorSet;
5598 descriptor_write.dstBinding = 0;
5599 descriptor_write.descriptorCount = 1;
5600 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5601
Mark Mueller5c838ce2016-06-16 09:54:29 -06005602 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06005603 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5604 m_errorMonitor->VerifyFound();
5605
5606 // Create a buffer to update the descriptor with
5607 uint32_t qfi = 0;
5608 VkBufferCreateInfo buffCI = {};
5609 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5610 buffCI.size = 1024;
5611 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5612 buffCI.queueFamilyIndexCount = 1;
5613 buffCI.pQueueFamilyIndices = &qfi;
5614
5615 VkBuffer dyub;
5616 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
5617 ASSERT_VK_SUCCESS(err);
5618 VkDescriptorBufferInfo buffInfo = {};
5619 buffInfo.buffer = dyub;
5620 buffInfo.offset = 0;
5621 buffInfo.range = 1024;
5622
5623 descriptor_write.pBufferInfo = &buffInfo;
5624 descriptor_write.descriptorCount = 2;
5625
Mark Mueller5c838ce2016-06-16 09:54:29 -06005626 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06005627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
5628 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5629 m_errorMonitor->VerifyFound();
5630
Mark Mueller5c838ce2016-06-16 09:54:29 -06005631 // 3) The second descriptor has a null_ptr pImmutableSamplers and
5632 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06005633 descriptor_write.dstBinding = 1;
5634 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06005635
5636
5637 // Make pImageInfo index non-null to avoid complaints of it missing
5638 VkDescriptorImageInfo imageInfo = {};
5639 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5640 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06005641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
5642 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5643 m_errorMonitor->VerifyFound();
5644
Mark Muellerd4914412016-06-13 17:52:06 -06005645 vkDestroyBuffer(m_device->device(), dyub, NULL);
5646 vkDestroySampler(m_device->device(), sampler, NULL);
5647 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5648 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5649 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5650}
5651
Karl Schultz6addd812016-02-02 17:17:23 -07005652TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06005653 // Attempt to bind an invalid Pipeline to a valid Command Buffer
5654 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005655 // Create a valid cmd buffer
5656 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06005657 uint64_t fake_pipeline_handle = 0xbaad6001;
5658 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06005659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5660 "Invalid VkPipeline Object 0xbaad6001");
5661 ASSERT_NO_FATAL_FAILURE(InitState());
5662 BeginCommandBuffer();
5663 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5664 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
5665 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005666 // Now issue a draw call with no pipeline bound
5667 m_errorMonitor->SetDesiredFailureMsg(
5668 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5669 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tony Barbourdf4c0042016-06-01 15:55:43 -06005670
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005671 BeginCommandBuffer();
5672 Draw(1, 0, 0, 0);
5673 m_errorMonitor->VerifyFound();
5674 // Finally same check once more but with Dispatch/Compute
5675 m_errorMonitor->SetDesiredFailureMsg(
5676 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5677 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005678 BeginCommandBuffer();
5679 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
5680 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005681}
5682
Karl Schultz6addd812016-02-02 17:17:23 -07005683TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
5684 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
5685 // CommandBuffer
5686 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005687
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005689 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005690
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005691 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06005692 ASSERT_NO_FATAL_FAILURE(InitViewport());
5693 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005694 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005695 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5696 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005697
5698 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005699 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5700 ds_pool_ci.pNext = NULL;
5701 ds_pool_ci.maxSets = 1;
5702 ds_pool_ci.poolSizeCount = 1;
5703 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06005704
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005705 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005706 err =
5707 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005708 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005709
Tony Barboureb254902015-07-15 12:50:33 -06005710 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005711 dsl_binding.binding = 0;
5712 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5713 dsl_binding.descriptorCount = 1;
5714 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5715 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005716
Tony Barboureb254902015-07-15 12:50:33 -06005717 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005718 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5719 ds_layout_ci.pNext = NULL;
5720 ds_layout_ci.bindingCount = 1;
5721 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005722 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005723 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5724 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005725 ASSERT_VK_SUCCESS(err);
5726
5727 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005728 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005729 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005730 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005731 alloc_info.descriptorPool = ds_pool;
5732 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005733 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5734 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005735 ASSERT_VK_SUCCESS(err);
5736
Tony Barboureb254902015-07-15 12:50:33 -06005737 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005738 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5739 pipeline_layout_ci.pNext = NULL;
5740 pipeline_layout_ci.setLayoutCount = 1;
5741 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005742
5743 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005744 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5745 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005746 ASSERT_VK_SUCCESS(err);
5747
Karl Schultz6addd812016-02-02 17:17:23 -07005748 VkShaderObj vs(m_device, bindStateVertShaderText,
5749 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06005750 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07005751 // on more devices
5752 VkShaderObj fs(m_device, bindStateFragShaderText,
5753 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005754
Tony Barbourc95e4ac2015-08-04 17:05:26 -06005755 VkPipelineObj pipe(m_device);
5756 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005757 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005758 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06005759 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005760
5761 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005762 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5763 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5764 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
5765 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
5766 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005767
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005768 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005769
Chia-I Wuf7458c52015-10-26 21:10:41 +08005770 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5771 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5772 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005773}
5774
Karl Schultz6addd812016-02-02 17:17:23 -07005775TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005776 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07005777 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005778
Karl Schultz6addd812016-02-02 17:17:23 -07005779 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005780 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
5781 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005782
5783 ASSERT_NO_FATAL_FAILURE(InitState());
5784 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005785 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
5786 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005787
5788 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005789 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5790 ds_pool_ci.pNext = NULL;
5791 ds_pool_ci.maxSets = 1;
5792 ds_pool_ci.poolSizeCount = 1;
5793 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005794
5795 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005796 err =
5797 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005798 ASSERT_VK_SUCCESS(err);
5799
5800 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005801 dsl_binding.binding = 0;
5802 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
5803 dsl_binding.descriptorCount = 1;
5804 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5805 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005806
5807 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005808 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5809 ds_layout_ci.pNext = NULL;
5810 ds_layout_ci.bindingCount = 1;
5811 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005812 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005813 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5814 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005815 ASSERT_VK_SUCCESS(err);
5816
5817 VkDescriptorSet descriptorSet;
5818 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005819 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005820 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005821 alloc_info.descriptorPool = ds_pool;
5822 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005823 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5824 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005825 ASSERT_VK_SUCCESS(err);
5826
Karl Schultz6addd812016-02-02 17:17:23 -07005827 VkBufferView view =
5828 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005829 VkWriteDescriptorSet descriptor_write;
5830 memset(&descriptor_write, 0, sizeof(descriptor_write));
5831 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5832 descriptor_write.dstSet = descriptorSet;
5833 descriptor_write.dstBinding = 0;
5834 descriptor_write.descriptorCount = 1;
5835 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
5836 descriptor_write.pTexelBufferView = &view;
5837
5838 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5839
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005840 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005841
5842 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5843 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5844}
5845
Karl Schultz6addd812016-02-02 17:17:23 -07005846TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
5847 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
5848 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07005849 // 1. No dynamicOffset supplied
5850 // 2. Too many dynamicOffsets supplied
5851 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07005852 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005854 " requires 1 dynamicOffsets, but only "
5855 "0 dynamicOffsets are left in "
5856 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005857
5858 ASSERT_NO_FATAL_FAILURE(InitState());
5859 ASSERT_NO_FATAL_FAILURE(InitViewport());
5860 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5861
5862 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005863 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
5864 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005865
5866 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005867 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5868 ds_pool_ci.pNext = NULL;
5869 ds_pool_ci.maxSets = 1;
5870 ds_pool_ci.poolSizeCount = 1;
5871 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005872
5873 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005874 err =
5875 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005876 ASSERT_VK_SUCCESS(err);
5877
5878 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005879 dsl_binding.binding = 0;
5880 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
5881 dsl_binding.descriptorCount = 1;
5882 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5883 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005884
5885 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005886 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5887 ds_layout_ci.pNext = NULL;
5888 ds_layout_ci.bindingCount = 1;
5889 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005890 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005891 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5892 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005893 ASSERT_VK_SUCCESS(err);
5894
5895 VkDescriptorSet descriptorSet;
5896 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005897 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005898 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005899 alloc_info.descriptorPool = ds_pool;
5900 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005901 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5902 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005903 ASSERT_VK_SUCCESS(err);
5904
5905 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005906 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5907 pipeline_layout_ci.pNext = NULL;
5908 pipeline_layout_ci.setLayoutCount = 1;
5909 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005910
5911 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005912 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5913 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005914 ASSERT_VK_SUCCESS(err);
5915
5916 // Create a buffer to update the descriptor with
5917 uint32_t qfi = 0;
5918 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005919 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5920 buffCI.size = 1024;
5921 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5922 buffCI.queueFamilyIndexCount = 1;
5923 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005924
5925 VkBuffer dyub;
5926 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
5927 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005928 // Allocate memory and bind to buffer so we can make it to the appropriate
5929 // error
5930 VkMemoryAllocateInfo mem_alloc = {};
5931 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5932 mem_alloc.pNext = NULL;
5933 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12005934 mem_alloc.memoryTypeIndex = 0;
5935
5936 VkMemoryRequirements memReqs;
5937 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
5938 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
5939 0);
5940 if (!pass) {
5941 vkDestroyBuffer(m_device->device(), dyub, NULL);
5942 return;
5943 }
5944
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005945 VkDeviceMemory mem;
5946 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5947 ASSERT_VK_SUCCESS(err);
5948 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
5949 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005950 // Correctly update descriptor to avoid "NOT_UPDATED" error
5951 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005952 buffInfo.buffer = dyub;
5953 buffInfo.offset = 0;
5954 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005955
5956 VkWriteDescriptorSet descriptor_write;
5957 memset(&descriptor_write, 0, sizeof(descriptor_write));
5958 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5959 descriptor_write.dstSet = descriptorSet;
5960 descriptor_write.dstBinding = 0;
5961 descriptor_write.descriptorCount = 1;
5962 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
5963 descriptor_write.pBufferInfo = &buffInfo;
5964
5965 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5966
5967 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005968 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
5969 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
5970 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005971 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07005972 uint32_t pDynOff[2] = {512, 756};
5973 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07005974 m_errorMonitor->SetDesiredFailureMsg(
5975 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07005976 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07005977 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
5978 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
5979 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12005980 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07005981 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5983 " dynamic offset 512 combined with "
5984 "offset 0 and range 1024 that "
5985 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07005986 // Create PSO to be used for draw-time errors below
5987 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12005988 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07005989 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005990 "out gl_PerVertex { \n"
5991 " vec4 gl_Position;\n"
5992 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07005993 "void main(){\n"
5994 " gl_Position = vec4(1);\n"
5995 "}\n";
5996 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12005997 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07005998 "\n"
5999 "layout(location=0) out vec4 x;\n"
6000 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6001 "void main(){\n"
6002 " x = vec4(bar.y);\n"
6003 "}\n";
6004 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6005 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6006 VkPipelineObj pipe(m_device);
6007 pipe.AddShader(&vs);
6008 pipe.AddShader(&fs);
6009 pipe.AddColorAttachment();
6010 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6011
Karl Schultz6addd812016-02-02 17:17:23 -07006012 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6013 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6014 // This update should succeed, but offset size of 512 will overstep buffer
6015 // /w range 1024 & size 1024
6016 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6017 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
6018 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006019 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006020 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006021
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006022 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006023 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006024
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006025 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006026 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006027 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6028}
6029
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006030TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006031 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006032 ASSERT_NO_FATAL_FAILURE(InitState());
6033 ASSERT_NO_FATAL_FAILURE(InitViewport());
6034 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6035
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006036 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006037 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006038 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6039 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6040 pipeline_layout_ci.pushConstantRangeCount = 1;
6041 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6042
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006043 //
6044 // Check for invalid push constant ranges in pipeline layouts.
6045 //
6046 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006047 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006048 char const *msg;
6049 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006050
Karl Schultzc81037d2016-05-12 08:11:23 -06006051 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6052 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6053 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6054 "vkCreatePipelineLayout() call has push constants index 0 with "
6055 "size 0."},
6056 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6057 "vkCreatePipelineLayout() call has push constants index 0 with "
6058 "size 1."},
6059 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
6060 "vkCreatePipelineLayout() call has push constants index 0 with "
6061 "size 1."},
6062 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
6063 "vkCreatePipelineLayout() call has push constants index 0 with "
6064 "size 0."},
6065 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6066 "vkCreatePipelineLayout() call has push constants index 0 with "
6067 "offset 1. Offset must"},
6068 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6069 "vkCreatePipelineLayout() call has push constants index 0 "
6070 "with offset "},
6071 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6072 "vkCreatePipelineLayout() call has push constants "
6073 "index 0 with offset "},
6074 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
6075 "vkCreatePipelineLayout() call has push constants index 0 "
6076 "with offset "},
6077 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6078 "vkCreatePipelineLayout() call has push "
6079 "constants index 0 with offset "},
6080 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6081 "vkCreatePipelineLayout() call has push "
6082 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006083 }};
6084
6085 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006086 for (const auto &iter : range_tests) {
6087 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6089 iter.msg);
6090 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
6091 NULL, &pipeline_layout);
6092 m_errorMonitor->VerifyFound();
6093 if (VK_SUCCESS == err) {
6094 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6095 }
6096 }
6097
6098 // Check for invalid stage flag
6099 pc_range.offset = 0;
6100 pc_range.size = 16;
6101 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006102 m_errorMonitor->SetDesiredFailureMsg(
6103 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006104 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006105 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6106 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006107 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006108 if (VK_SUCCESS == err) {
6109 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6110 }
6111
6112 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06006113 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006114 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006115 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006116 char const *msg;
6117 };
6118
Karl Schultzc81037d2016-05-12 08:11:23 -06006119 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006120 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6121 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6122 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6123 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6124 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
6125 "vkCreatePipelineLayout() call has push constants with overlapping "
6126 "ranges: 0:[0, 4), 1:[0, 4)"},
6127 {
6128 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6129 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6130 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6131 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6132 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
6133 "vkCreatePipelineLayout() call has push constants with "
6134 "overlapping "
6135 "ranges: 3:[12, 20), 4:[16, 20)",
6136 },
6137 {
6138 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6139 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6140 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6141 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6142 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
6143 "vkCreatePipelineLayout() call has push constants with "
6144 "overlapping "
6145 "ranges: 0:[16, 20), 1:[12, 20)",
6146 },
6147 {
6148 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6149 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6150 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6151 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6152 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
6153 "vkCreatePipelineLayout() call has push constants with "
6154 "overlapping "
6155 "ranges: 0:[16, 20), 3:[12, 20)",
6156 },
6157 {
6158 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6159 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
6160 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
6161 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
6162 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
6163 "vkCreatePipelineLayout() call has push constants with "
6164 "overlapping "
6165 "ranges: 0:[16, 20), 2:[4, 100)",
6166 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006167
Karl Schultzc81037d2016-05-12 08:11:23 -06006168 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006169 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006170 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
6171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006172 iter.msg);
6173 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
6174 NULL, &pipeline_layout);
6175 m_errorMonitor->VerifyFound();
6176 if (VK_SUCCESS == err) {
6177 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6178 }
6179 }
6180
6181 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06006182 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
6183 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6184 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6185 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6186 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
6187 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
6188 ""},
6189 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
6190 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
6191 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
6192 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
6193 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
6194 ""}}};
6195 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006196 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
6197 m_errorMonitor->ExpectSuccess();
6198 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
6199 NULL, &pipeline_layout);
6200 m_errorMonitor->VerifyNotFound();
6201 if (VK_SUCCESS == err) {
6202 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6203 }
6204 }
6205
6206 //
6207 // CmdPushConstants tests
6208 //
Karl Schultzc81037d2016-05-12 08:11:23 -06006209 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006210
6211 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06006212 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
6213 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6214 "vkCmdPushConstants() call has push constants with size 0. Size "
6215 "must be greater than zero and a multiple of 4."},
6216 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6217 "vkCmdPushConstants() call has push constants with size 1. Size "
6218 "must be greater than zero and a multiple of 4."},
6219 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
6220 "vkCmdPushConstants() call has push constants with size 1. Size "
6221 "must be greater than zero and a multiple of 4."},
6222 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
6223 "vkCmdPushConstants() call has push constants with offset 1. "
6224 "Offset must be a multiple of 4."},
6225 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6226 "vkCmdPushConstants() call has push constants with offset 1. "
6227 "Offset must be a multiple of 4."},
6228 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
6229 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
6230 "0x1 not within flag-matching ranges in pipeline layout"},
6231 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
6232 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
6233 "0x1 not within flag-matching ranges in pipeline layout"},
6234 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
6235 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
6236 "0x1 not within flag-matching ranges in pipeline layout"},
6237 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
6238 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
6239 "0x1 not within flag-matching ranges in pipeline layout"},
6240 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6241 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
6242 "any of the ranges in pipeline layout"},
6243 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
6244 0, 16},
6245 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
6246 "any of the ranges in pipeline layout"},
6247 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006248 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06006249 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006250 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06006251 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006252 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06006253 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006254 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06006255 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006256 "vkCmdPushConstants() call has push constants with offset "},
6257 }};
6258
6259 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06006260 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006261 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06006262 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006263 };
Karl Schultzc81037d2016-05-12 08:11:23 -06006264 pipeline_layout_ci.pushConstantRangeCount =
6265 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006266 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006267 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6268 &pipeline_layout);
6269 ASSERT_VK_SUCCESS(err);
6270 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06006271 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6273 iter.msg);
6274 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06006275 iter.range.stageFlags, iter.range.offset,
6276 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006277 m_errorMonitor->VerifyFound();
6278 }
6279
6280 // Check for invalid stage flag
6281 m_errorMonitor->SetDesiredFailureMsg(
6282 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6283 "vkCmdPushConstants() call has no stageFlags set.");
6284 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06006285 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006286 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06006287 EndCommandBuffer();
6288 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
6289 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006290
Karl Schultzc81037d2016-05-12 08:11:23 -06006291 // overlapping range tests with cmd
6292 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
6293 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
6294 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
6295 "0x1 not within flag-matching ranges in pipeline layout"},
6296 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6297 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
6298 "0x1 not within flag-matching ranges in pipeline layout"},
6299 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
6300 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
6301 "0x1 not within flag-matching ranges in pipeline layout"},
6302 }};
6303 const VkPushConstantRange pc_range3[] = {
6304 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
6305 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
6306 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6307 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
6308 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
6309 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
6310 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
6311 };
6312 pipeline_layout_ci.pushConstantRangeCount =
6313 sizeof(pc_range3) / sizeof(VkPushConstantRange);
6314 pipeline_layout_ci.pPushConstantRanges = pc_range3;
6315 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6316 &pipeline_layout);
6317 ASSERT_VK_SUCCESS(err);
6318 BeginCommandBuffer();
6319 for (const auto &iter : cmd_overlap_tests) {
6320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6321 iter.msg);
6322 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
6323 iter.range.stageFlags, iter.range.offset,
6324 iter.range.size, dummy_values);
6325 m_errorMonitor->VerifyFound();
6326 }
6327 EndCommandBuffer();
6328 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
6329 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6330
6331 // positive overlapping range tests with cmd
6332 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
6333 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
6334 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
6335 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
6336 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
6337 }};
6338 const VkPushConstantRange pc_range4[] = {
6339 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
6340 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
6341 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
6342 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6343 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
6344 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
6345 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
6346 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
6347 };
6348 pipeline_layout_ci.pushConstantRangeCount =
6349 sizeof(pc_range4) / sizeof(VkPushConstantRange);
6350 pipeline_layout_ci.pPushConstantRanges = pc_range4;
6351 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6352 &pipeline_layout);
6353 ASSERT_VK_SUCCESS(err);
6354 BeginCommandBuffer();
6355 for (const auto &iter : cmd_overlap_tests_pos) {
6356 m_errorMonitor->ExpectSuccess();
6357 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
6358 iter.range.stageFlags, iter.range.offset,
6359 iter.range.size, dummy_values);
6360 m_errorMonitor->VerifyNotFound();
6361 }
6362 EndCommandBuffer();
6363 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006364 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6365}
6366
Karl Schultz6addd812016-02-02 17:17:23 -07006367TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07006368 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07006369 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006370
6371 ASSERT_NO_FATAL_FAILURE(InitState());
6372 ASSERT_NO_FATAL_FAILURE(InitViewport());
6373 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6374
Mike Stroyanb8a61002016-06-20 16:00:28 -06006375 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
6376 VkImageTiling tiling;
6377 VkFormatProperties format_properties;
6378 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
6379 if (format_properties.linearTilingFeatures &
6380 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
6381 tiling = VK_IMAGE_TILING_LINEAR;
6382 } else if (format_properties.optimalTilingFeatures &
6383 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
6384 tiling = VK_IMAGE_TILING_OPTIMAL;
6385 } else {
6386 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
6387 "skipped.\n");
6388 return;
6389 }
6390
Tobin Ehlis559c6382015-11-05 09:52:49 -07006391 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
6392 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006393 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6394 ds_type_count[0].descriptorCount = 10;
6395 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6396 ds_type_count[1].descriptorCount = 2;
6397 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
6398 ds_type_count[2].descriptorCount = 2;
6399 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
6400 ds_type_count[3].descriptorCount = 5;
6401 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
6402 // type
6403 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6404 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
6405 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006406
6407 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006408 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6409 ds_pool_ci.pNext = NULL;
6410 ds_pool_ci.maxSets = 5;
6411 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
6412 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006413
6414 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006415 err =
6416 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006417 ASSERT_VK_SUCCESS(err);
6418
6419 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
6420 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006421 dsl_binding[0].binding = 0;
6422 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6423 dsl_binding[0].descriptorCount = 5;
6424 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6425 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006426
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006427 // Create layout identical to set0 layout but w/ different stageFlags
6428 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006429 dsl_fs_stage_only.binding = 0;
6430 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6431 dsl_fs_stage_only.descriptorCount = 5;
6432 dsl_fs_stage_only.stageFlags =
6433 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
6434 // bind time
6435 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006436 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006437 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6438 ds_layout_ci.pNext = NULL;
6439 ds_layout_ci.bindingCount = 1;
6440 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006441 static const uint32_t NUM_LAYOUTS = 4;
6442 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006443 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006444 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
6445 // layout for error case
6446 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6447 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006448 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006449 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07006450 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6451 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006452 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006453 dsl_binding[0].binding = 0;
6454 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006455 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006456 dsl_binding[1].binding = 1;
6457 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
6458 dsl_binding[1].descriptorCount = 2;
6459 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
6460 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006461 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006462 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07006463 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6464 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006465 ASSERT_VK_SUCCESS(err);
6466 dsl_binding[0].binding = 0;
6467 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006468 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006469 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006470 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6471 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006472 ASSERT_VK_SUCCESS(err);
6473 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006474 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07006475 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6476 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006477 ASSERT_VK_SUCCESS(err);
6478
6479 static const uint32_t NUM_SETS = 4;
6480 VkDescriptorSet descriptorSet[NUM_SETS] = {};
6481 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006482 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006483 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006484 alloc_info.descriptorPool = ds_pool;
6485 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006486 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6487 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006488 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006489 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07006490 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006491 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07006492 err =
6493 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006494 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006495
6496 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006497 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6498 pipeline_layout_ci.pNext = NULL;
6499 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
6500 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006501
6502 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006503 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6504 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006505 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006506 // Create pipelineLayout with only one setLayout
6507 pipeline_layout_ci.setLayoutCount = 1;
6508 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006509 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6510 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006511 ASSERT_VK_SUCCESS(err);
6512 // Create pipelineLayout with 2 descriptor setLayout at index 0
6513 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
6514 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07006515 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6516 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006517 ASSERT_VK_SUCCESS(err);
6518 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
6519 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
6520 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07006521 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6522 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006523 ASSERT_VK_SUCCESS(err);
6524 // Create pipelineLayout with UB type, but stageFlags for FS only
6525 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
6526 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07006527 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6528 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006529 ASSERT_VK_SUCCESS(err);
6530 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
6531 VkDescriptorSetLayout pl_bad_s0[2] = {};
6532 pl_bad_s0[0] = ds_layout_fs_only;
6533 pl_bad_s0[1] = ds_layout[1];
6534 pipeline_layout_ci.setLayoutCount = 2;
6535 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
6536 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07006537 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6538 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006539 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006540
6541 // Create a buffer to update the descriptor with
6542 uint32_t qfi = 0;
6543 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006544 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6545 buffCI.size = 1024;
6546 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6547 buffCI.queueFamilyIndexCount = 1;
6548 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006549
6550 VkBuffer dyub;
6551 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6552 ASSERT_VK_SUCCESS(err);
6553 // Correctly update descriptor to avoid "NOT_UPDATED" error
6554 static const uint32_t NUM_BUFFS = 5;
6555 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006556 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07006557 buffInfo[i].buffer = dyub;
6558 buffInfo[i].offset = 0;
6559 buffInfo[i].range = 1024;
6560 }
Karl Schultz6addd812016-02-02 17:17:23 -07006561 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07006562 const int32_t tex_width = 32;
6563 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006564 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006565 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6566 image_create_info.pNext = NULL;
6567 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6568 image_create_info.format = tex_format;
6569 image_create_info.extent.width = tex_width;
6570 image_create_info.extent.height = tex_height;
6571 image_create_info.extent.depth = 1;
6572 image_create_info.mipLevels = 1;
6573 image_create_info.arrayLayers = 1;
6574 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06006575 image_create_info.tiling = tiling;
6576 image_create_info.usage =
6577 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07006578 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006579 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6580 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006581
Karl Schultz6addd812016-02-02 17:17:23 -07006582 VkMemoryRequirements memReqs;
6583 VkDeviceMemory imageMem;
6584 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006585 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006586 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6587 memAlloc.pNext = NULL;
6588 memAlloc.allocationSize = 0;
6589 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006590 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
6591 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006592 pass =
6593 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006594 ASSERT_TRUE(pass);
6595 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
6596 ASSERT_VK_SUCCESS(err);
6597 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
6598 ASSERT_VK_SUCCESS(err);
6599
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006600 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006601 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6602 image_view_create_info.image = image;
6603 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6604 image_view_create_info.format = tex_format;
6605 image_view_create_info.subresourceRange.layerCount = 1;
6606 image_view_create_info.subresourceRange.baseMipLevel = 0;
6607 image_view_create_info.subresourceRange.levelCount = 1;
6608 image_view_create_info.subresourceRange.aspectMask =
6609 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006610
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006611 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07006612 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6613 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006614 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006615 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006616 imageInfo[0].imageView = view;
6617 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6618 imageInfo[1].imageView = view;
6619 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006620 imageInfo[2].imageView = view;
6621 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6622 imageInfo[3].imageView = view;
6623 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006624
6625 static const uint32_t NUM_SET_UPDATES = 3;
6626 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
6627 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6628 descriptor_write[0].dstSet = descriptorSet[0];
6629 descriptor_write[0].dstBinding = 0;
6630 descriptor_write[0].descriptorCount = 5;
6631 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6632 descriptor_write[0].pBufferInfo = buffInfo;
6633 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6634 descriptor_write[1].dstSet = descriptorSet[1];
6635 descriptor_write[1].dstBinding = 0;
6636 descriptor_write[1].descriptorCount = 2;
6637 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6638 descriptor_write[1].pImageInfo = imageInfo;
6639 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6640 descriptor_write[2].dstSet = descriptorSet[1];
6641 descriptor_write[2].dstBinding = 1;
6642 descriptor_write[2].descriptorCount = 2;
6643 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006644 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006645
6646 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006647
Tobin Ehlis88452832015-12-03 09:40:56 -07006648 // Create PSO to be used for draw-time errors below
6649 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12006650 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07006651 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006652 "out gl_PerVertex {\n"
6653 " vec4 gl_Position;\n"
6654 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07006655 "void main(){\n"
6656 " gl_Position = vec4(1);\n"
6657 "}\n";
6658 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12006659 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07006660 "\n"
6661 "layout(location=0) out vec4 x;\n"
6662 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6663 "void main(){\n"
6664 " x = vec4(bar.y);\n"
6665 "}\n";
6666 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6667 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006668 VkPipelineObj pipe(m_device);
6669 pipe.AddShader(&vs);
6670 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07006671 pipe.AddColorAttachment();
6672 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07006673
6674 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07006675
Karl Schultz6addd812016-02-02 17:17:23 -07006676 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6677 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6678 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
6679 // of PSO
6680 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
6681 // cmd_pipeline.c
6682 // due to the fact that cmd_alloc_dset_data() has not been called in
6683 // cmd_bind_graphics_pipeline()
6684 // TODO : Want to cause various binding incompatibility issues here to test
6685 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07006686 // First cause various verify_layout_compatibility() fails
6687 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006688 // verify_set_layout_compatibility fail cases:
6689 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07006690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6691 " due to: invalid VkPipelineLayout ");
6692 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6693 VK_PIPELINE_BIND_POINT_GRAPHICS,
6694 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
6695 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006696 m_errorMonitor->VerifyFound();
6697
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006698 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07006699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6700 " attempting to bind set to index 1");
6701 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6702 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
6703 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006704 m_errorMonitor->VerifyFound();
6705
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006706 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07006707 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
6708 // descriptors
6709 m_errorMonitor->SetDesiredFailureMsg(
6710 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06006711 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07006712 vkCmdBindDescriptorSets(
6713 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
6714 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006715 m_errorMonitor->VerifyFound();
6716
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006717 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
6718 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07006719 m_errorMonitor->SetDesiredFailureMsg(
6720 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06006721 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07006722 vkCmdBindDescriptorSets(
6723 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
6724 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006725 m_errorMonitor->VerifyFound();
6726
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006727 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
6728 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07006729 m_errorMonitor->SetDesiredFailureMsg(
6730 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06006731 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07006732 vkCmdBindDescriptorSets(
6733 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
6734 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006735 m_errorMonitor->VerifyFound();
6736
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006737 // Cause INFO messages due to disturbing previously bound Sets
6738 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07006739 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6740 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
6741 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006742 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07006743 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006744 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006745 " previously bound as set #0 was disturbed ");
6746 vkCmdBindDescriptorSets(
6747 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
6748 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006749 m_errorMonitor->VerifyFound();
6750
Karl Schultz6addd812016-02-02 17:17:23 -07006751 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6752 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
6753 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006754 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006756 " newly bound as set #0 so set #1 and "
6757 "any subsequent sets were disturbed ");
6758 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6759 VK_PIPELINE_BIND_POINT_GRAPHICS,
6760 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006761 m_errorMonitor->VerifyFound();
6762
Tobin Ehlis88452832015-12-03 09:40:56 -07006763 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07006764 // 1. Error due to not binding required set (we actually use same code as
6765 // above to disturb set0)
6766 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6767 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
6768 2, &descriptorSet[0], 0, NULL);
6769 vkCmdBindDescriptorSets(
6770 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
6771 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
6772 m_errorMonitor->SetDesiredFailureMsg(
6773 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6774 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07006775 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006776 m_errorMonitor->VerifyFound();
6777
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006778 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07006779 // 2. Error due to bound set not being compatible with PSO's
6780 // VkPipelineLayout (diff stageFlags in this case)
6781 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6782 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
6783 2, &descriptorSet[0], 0, NULL);
6784 m_errorMonitor->SetDesiredFailureMsg(
6785 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6786 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07006787 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006788 m_errorMonitor->VerifyFound();
6789
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006790 // Remaining clean-up
6791 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07006792 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006793 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
6794 }
6795 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06006796 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
6797 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006798 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006799 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6800 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006801 vkFreeMemory(m_device->device(), imageMem, NULL);
6802 vkDestroyImage(m_device->device(), image, NULL);
6803 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006804}
Tobin Ehlis559c6382015-11-05 09:52:49 -07006805
Karl Schultz6addd812016-02-02 17:17:23 -07006806TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006807
Karl Schultz6addd812016-02-02 17:17:23 -07006808 m_errorMonitor->SetDesiredFailureMsg(
6809 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006810 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006811
6812 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006813 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006814 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006815 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006816
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006817 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006818}
6819
Karl Schultz6addd812016-02-02 17:17:23 -07006820TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
6821 VkResult err;
6822 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006823
Karl Schultz6addd812016-02-02 17:17:23 -07006824 m_errorMonitor->SetDesiredFailureMsg(
6825 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07006826 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006827
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006828 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006829
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006830 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006831 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06006832 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006833 cmd.commandPool = m_commandPool;
6834 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006835 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06006836
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006837 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06006838 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006839
6840 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006841 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07006842 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006843 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06006844 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006845 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
6846 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006847 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006848
6849 // The error should be caught by validation of the BeginCommandBuffer call
6850 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
6851
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006852 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006853 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006854}
6855
Karl Schultz6addd812016-02-02 17:17:23 -07006856TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006857 // Cause error due to Begin while recording CB
6858 // Then cause 2 errors for attempting to reset CB w/o having
6859 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
6860 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006862 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006863
6864 ASSERT_NO_FATAL_FAILURE(InitState());
6865
6866 // Calls AllocateCommandBuffers
6867 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
6868
Karl Schultz6addd812016-02-02 17:17:23 -07006869 // Force the failure by setting the Renderpass and Framebuffer fields with
6870 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006871 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07006872 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006873 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6874 cmd_buf_info.pNext = NULL;
6875 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006876 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006877
6878 // Begin CB to transition to recording state
6879 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
6880 // Can't re-begin. This should trigger error
6881 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006882 m_errorMonitor->VerifyFound();
6883
Karl Schultz6addd812016-02-02 17:17:23 -07006884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6885 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006886 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
6887 // Reset attempt will trigger error due to incorrect CommandPool state
6888 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006889 m_errorMonitor->VerifyFound();
6890
Karl Schultz6addd812016-02-02 17:17:23 -07006891 m_errorMonitor->SetDesiredFailureMsg(
6892 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6893 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006894 // Transition CB to RECORDED state
6895 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
6896 // Now attempting to Begin will implicitly reset, which triggers error
6897 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006898 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006899}
6900
Karl Schultz6addd812016-02-02 17:17:23 -07006901TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006902 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07006903 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006904
Karl Schultz6addd812016-02-02 17:17:23 -07006905 m_errorMonitor->SetDesiredFailureMsg(
6906 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006907 "Invalid Pipeline CreateInfo State: Vtx Shader required");
6908
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006909 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006910 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006911
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006912 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006913 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6914 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006915
6916 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006917 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6918 ds_pool_ci.pNext = NULL;
6919 ds_pool_ci.maxSets = 1;
6920 ds_pool_ci.poolSizeCount = 1;
6921 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006922
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006923 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006924 err =
6925 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006926 ASSERT_VK_SUCCESS(err);
6927
Tony Barboureb254902015-07-15 12:50:33 -06006928 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006929 dsl_binding.binding = 0;
6930 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6931 dsl_binding.descriptorCount = 1;
6932 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6933 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006934
Tony Barboureb254902015-07-15 12:50:33 -06006935 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006936 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6937 ds_layout_ci.pNext = NULL;
6938 ds_layout_ci.bindingCount = 1;
6939 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006940
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006941 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006942 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6943 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006944 ASSERT_VK_SUCCESS(err);
6945
6946 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006947 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006948 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006949 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006950 alloc_info.descriptorPool = ds_pool;
6951 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006952 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6953 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006954 ASSERT_VK_SUCCESS(err);
6955
Tony Barboureb254902015-07-15 12:50:33 -06006956 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006957 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6958 pipeline_layout_ci.setLayoutCount = 1;
6959 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006960
6961 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006962 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6963 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006964 ASSERT_VK_SUCCESS(err);
6965
Tobin Ehlise68360f2015-10-01 11:15:13 -06006966 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07006967 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06006968
6969 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006970 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
6971 vp_state_ci.scissorCount = 1;
6972 vp_state_ci.pScissors = &sc;
6973 vp_state_ci.viewportCount = 1;
6974 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06006975
Karl Schultzdfdb8d42016-03-08 10:30:21 -07006976 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
6977 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
6978 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
6979 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
6980 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
6981 rs_state_ci.depthClampEnable = VK_FALSE;
6982 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
6983 rs_state_ci.depthBiasEnable = VK_FALSE;
6984
Tony Barboureb254902015-07-15 12:50:33 -06006985 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006986 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
6987 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07006988 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07006989 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
6990 gp_ci.layout = pipeline_layout;
6991 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06006992
6993 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006994 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
6995 pc_ci.initialDataSize = 0;
6996 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006997
6998 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06006999 VkPipelineCache pipelineCache;
7000
Karl Schultz6addd812016-02-02 17:17:23 -07007001 err =
7002 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007003 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007004 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7005 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007006
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007007 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007008
Chia-I Wuf7458c52015-10-26 21:10:41 +08007009 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7010 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7011 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7012 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007013}
Tobin Ehlis912df022015-09-17 08:46:18 -06007014/*// TODO : This test should be good, but needs Tess support in compiler to run
7015TEST_F(VkLayerTest, InvalidPatchControlPoints)
7016{
7017 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007018 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007019
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007020 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007021 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7022primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007023
Tobin Ehlis912df022015-09-17 08:46:18 -06007024 ASSERT_NO_FATAL_FAILURE(InitState());
7025 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007026
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007027 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007028 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007029 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007030
7031 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7032 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7033 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007034 ds_pool_ci.poolSizeCount = 1;
7035 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007036
7037 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007038 err = vkCreateDescriptorPool(m_device->device(),
7039VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007040 ASSERT_VK_SUCCESS(err);
7041
7042 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007043 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007044 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007045 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007046 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7047 dsl_binding.pImmutableSamplers = NULL;
7048
7049 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007050 ds_layout_ci.sType =
7051VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007052 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007053 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007054 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007055
7056 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007057 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7058&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007059 ASSERT_VK_SUCCESS(err);
7060
7061 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007062 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7063VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007064 ASSERT_VK_SUCCESS(err);
7065
7066 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007067 pipeline_layout_ci.sType =
7068VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007069 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007070 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007071 pipeline_layout_ci.pSetLayouts = &ds_layout;
7072
7073 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007074 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7075&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007076 ASSERT_VK_SUCCESS(err);
7077
7078 VkPipelineShaderStageCreateInfo shaderStages[3];
7079 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7080
Karl Schultz6addd812016-02-02 17:17:23 -07007081 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7082this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007083 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007084 VkShaderObj
7085tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7086this);
7087 VkShaderObj
7088te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7089this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007090
Karl Schultz6addd812016-02-02 17:17:23 -07007091 shaderStages[0].sType =
7092VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007093 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007094 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007095 shaderStages[1].sType =
7096VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007097 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007098 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007099 shaderStages[2].sType =
7100VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007101 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007102 shaderStages[2].shader = te.handle();
7103
7104 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007105 iaCI.sType =
7106VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007107 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007108
7109 VkPipelineTessellationStateCreateInfo tsCI = {};
7110 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7111 tsCI.patchControlPoints = 0; // This will cause an error
7112
7113 VkGraphicsPipelineCreateInfo gp_ci = {};
7114 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7115 gp_ci.pNext = NULL;
7116 gp_ci.stageCount = 3;
7117 gp_ci.pStages = shaderStages;
7118 gp_ci.pVertexInputState = NULL;
7119 gp_ci.pInputAssemblyState = &iaCI;
7120 gp_ci.pTessellationState = &tsCI;
7121 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007122 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007123 gp_ci.pMultisampleState = NULL;
7124 gp_ci.pDepthStencilState = NULL;
7125 gp_ci.pColorBlendState = NULL;
7126 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7127 gp_ci.layout = pipeline_layout;
7128 gp_ci.renderPass = renderPass();
7129
7130 VkPipelineCacheCreateInfo pc_ci = {};
7131 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7132 pc_ci.pNext = NULL;
7133 pc_ci.initialSize = 0;
7134 pc_ci.initialData = 0;
7135 pc_ci.maxSize = 0;
7136
7137 VkPipeline pipeline;
7138 VkPipelineCache pipelineCache;
7139
Karl Schultz6addd812016-02-02 17:17:23 -07007140 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7141&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007142 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007143 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7144&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007145
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007146 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007147
Chia-I Wuf7458c52015-10-26 21:10:41 +08007148 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7149 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7150 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7151 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007152}
7153*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06007154// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07007155TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07007156 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007157
Karl Schultz6addd812016-02-02 17:17:23 -07007158 m_errorMonitor->SetDesiredFailureMsg(
7159 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007160 "Gfx Pipeline viewport count (1) must match scissor count (0).");
7161
Tobin Ehlise68360f2015-10-01 11:15:13 -06007162 ASSERT_NO_FATAL_FAILURE(InitState());
7163 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007164
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007165 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007166 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7167 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007168
7169 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007170 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7171 ds_pool_ci.maxSets = 1;
7172 ds_pool_ci.poolSizeCount = 1;
7173 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007174
7175 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007176 err =
7177 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007178 ASSERT_VK_SUCCESS(err);
7179
7180 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007181 dsl_binding.binding = 0;
7182 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7183 dsl_binding.descriptorCount = 1;
7184 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007185
7186 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007187 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7188 ds_layout_ci.bindingCount = 1;
7189 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007190
7191 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007192 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7193 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007194 ASSERT_VK_SUCCESS(err);
7195
7196 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007197 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007198 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007199 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007200 alloc_info.descriptorPool = ds_pool;
7201 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007202 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7203 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007204 ASSERT_VK_SUCCESS(err);
7205
7206 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007207 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7208 pipeline_layout_ci.setLayoutCount = 1;
7209 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007210
7211 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007212 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7213 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007214 ASSERT_VK_SUCCESS(err);
7215
7216 VkViewport vp = {}; // Just need dummy vp to point to
7217
7218 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007219 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7220 vp_state_ci.scissorCount = 0;
7221 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
7222 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007223
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007224 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7225 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7226 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7227 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7228 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7229 rs_state_ci.depthClampEnable = VK_FALSE;
7230 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7231 rs_state_ci.depthBiasEnable = VK_FALSE;
7232
Cody Northropeb3a6c12015-10-05 14:44:45 -06007233 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007234 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007235
Karl Schultz6addd812016-02-02 17:17:23 -07007236 VkShaderObj vs(m_device, bindStateVertShaderText,
7237 VK_SHADER_STAGE_VERTEX_BIT, this);
7238 VkShaderObj fs(m_device, bindStateFragShaderText,
7239 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06007240 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07007241 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007242 shaderStages[0] = vs.GetStageCreateInfo();
7243 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007244
7245 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007246 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7247 gp_ci.stageCount = 2;
7248 gp_ci.pStages = shaderStages;
7249 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007250 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007251 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7252 gp_ci.layout = pipeline_layout;
7253 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007254
7255 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007256 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007257
7258 VkPipeline pipeline;
7259 VkPipelineCache pipelineCache;
7260
Karl Schultz6addd812016-02-02 17:17:23 -07007261 err =
7262 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007263 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007264 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7265 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007266
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007267 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007268
Chia-I Wuf7458c52015-10-26 21:10:41 +08007269 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7270 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7271 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7272 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007273}
Karl Schultz6addd812016-02-02 17:17:23 -07007274// Don't set viewport state in PSO. This is an error b/c we always need this
7275// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06007276// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007277TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06007278 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007279 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007280
Karl Schultz6addd812016-02-02 17:17:23 -07007281 m_errorMonitor->SetDesiredFailureMsg(
7282 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007283 "Gfx Pipeline pViewportState is null. Even if ");
7284
Tobin Ehlise68360f2015-10-01 11:15:13 -06007285 ASSERT_NO_FATAL_FAILURE(InitState());
7286 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007287
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007288 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007289 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7290 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007291
7292 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007293 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7294 ds_pool_ci.maxSets = 1;
7295 ds_pool_ci.poolSizeCount = 1;
7296 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007297
7298 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007299 err =
7300 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007301 ASSERT_VK_SUCCESS(err);
7302
7303 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007304 dsl_binding.binding = 0;
7305 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7306 dsl_binding.descriptorCount = 1;
7307 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007308
7309 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007310 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7311 ds_layout_ci.bindingCount = 1;
7312 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007313
7314 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007315 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7316 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007317 ASSERT_VK_SUCCESS(err);
7318
7319 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007320 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007321 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007322 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007323 alloc_info.descriptorPool = ds_pool;
7324 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007325 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7326 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007327 ASSERT_VK_SUCCESS(err);
7328
7329 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007330 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7331 pipeline_layout_ci.setLayoutCount = 1;
7332 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007333
7334 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007335 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7336 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007337 ASSERT_VK_SUCCESS(err);
7338
7339 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7340 // Set scissor as dynamic to avoid second error
7341 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007342 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7343 dyn_state_ci.dynamicStateCount = 1;
7344 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007345
Cody Northropeb3a6c12015-10-05 14:44:45 -06007346 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007347 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007348
Karl Schultz6addd812016-02-02 17:17:23 -07007349 VkShaderObj vs(m_device, bindStateVertShaderText,
7350 VK_SHADER_STAGE_VERTEX_BIT, this);
7351 VkShaderObj fs(m_device, bindStateFragShaderText,
7352 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06007353 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07007354 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007355 shaderStages[0] = vs.GetStageCreateInfo();
7356 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007357
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007358
7359 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7360 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7361 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7362 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7363 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7364 rs_state_ci.depthClampEnable = VK_FALSE;
7365 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7366 rs_state_ci.depthBiasEnable = VK_FALSE;
7367
Tobin Ehlise68360f2015-10-01 11:15:13 -06007368 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007369 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7370 gp_ci.stageCount = 2;
7371 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007372 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007373 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
7374 // should cause validation error
7375 gp_ci.pDynamicState = &dyn_state_ci;
7376 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7377 gp_ci.layout = pipeline_layout;
7378 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007379
7380 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007381 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007382
7383 VkPipeline pipeline;
7384 VkPipelineCache pipelineCache;
7385
Karl Schultz6addd812016-02-02 17:17:23 -07007386 err =
7387 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007388 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007389 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7390 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007391
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007392 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007393
Chia-I Wuf7458c52015-10-26 21:10:41 +08007394 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7395 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7396 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7397 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007398}
7399// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07007400// Then run second test where dynamic scissor count doesn't match PSO scissor
7401// count
7402TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7403 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007404
Karl Schultz6addd812016-02-02 17:17:23 -07007405 m_errorMonitor->SetDesiredFailureMsg(
7406 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007407 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
7408
Tobin Ehlise68360f2015-10-01 11:15:13 -06007409 ASSERT_NO_FATAL_FAILURE(InitState());
7410 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007411
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007412 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007413 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7414 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007415
7416 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007417 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7418 ds_pool_ci.maxSets = 1;
7419 ds_pool_ci.poolSizeCount = 1;
7420 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007421
7422 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007423 err =
7424 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007425 ASSERT_VK_SUCCESS(err);
7426
7427 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007428 dsl_binding.binding = 0;
7429 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7430 dsl_binding.descriptorCount = 1;
7431 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007432
7433 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007434 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7435 ds_layout_ci.bindingCount = 1;
7436 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007437
7438 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007439 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7440 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007441 ASSERT_VK_SUCCESS(err);
7442
7443 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007444 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007445 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007446 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007447 alloc_info.descriptorPool = ds_pool;
7448 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007449 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7450 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007451 ASSERT_VK_SUCCESS(err);
7452
7453 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007454 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7455 pipeline_layout_ci.setLayoutCount = 1;
7456 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007457
7458 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007459 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7460 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007461 ASSERT_VK_SUCCESS(err);
7462
7463 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007464 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7465 vp_state_ci.viewportCount = 1;
7466 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
7467 vp_state_ci.scissorCount = 1;
7468 vp_state_ci.pScissors =
7469 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06007470
7471 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7472 // Set scissor as dynamic to avoid that error
7473 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007474 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7475 dyn_state_ci.dynamicStateCount = 1;
7476 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007477
Cody Northropeb3a6c12015-10-05 14:44:45 -06007478 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007479 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007480
Karl Schultz6addd812016-02-02 17:17:23 -07007481 VkShaderObj vs(m_device, bindStateVertShaderText,
7482 VK_SHADER_STAGE_VERTEX_BIT, this);
7483 VkShaderObj fs(m_device, bindStateFragShaderText,
7484 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06007485 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07007486 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007487 shaderStages[0] = vs.GetStageCreateInfo();
7488 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007489
Cody Northropf6622dc2015-10-06 10:33:21 -06007490 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7491 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7492 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007493 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007494 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007495 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007496 vi_ci.pVertexAttributeDescriptions = nullptr;
7497
7498 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7499 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7500 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7501
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007502 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007503 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06007504 rs_ci.pNext = nullptr;
7505
Mark Youngc89c6312016-03-31 16:03:20 -06007506 VkPipelineColorBlendAttachmentState att = {};
7507 att.blendEnable = VK_FALSE;
7508 att.colorWriteMask = 0xf;
7509
Cody Northropf6622dc2015-10-06 10:33:21 -06007510 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7511 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7512 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06007513 cb_ci.attachmentCount = 1;
7514 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06007515
Tobin Ehlise68360f2015-10-01 11:15:13 -06007516 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007517 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7518 gp_ci.stageCount = 2;
7519 gp_ci.pStages = shaderStages;
7520 gp_ci.pVertexInputState = &vi_ci;
7521 gp_ci.pInputAssemblyState = &ia_ci;
7522 gp_ci.pViewportState = &vp_state_ci;
7523 gp_ci.pRasterizationState = &rs_ci;
7524 gp_ci.pColorBlendState = &cb_ci;
7525 gp_ci.pDynamicState = &dyn_state_ci;
7526 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7527 gp_ci.layout = pipeline_layout;
7528 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007529
7530 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007531 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007532
7533 VkPipeline pipeline;
7534 VkPipelineCache pipelineCache;
7535
Karl Schultz6addd812016-02-02 17:17:23 -07007536 err =
7537 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007538 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007539 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7540 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007541
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007542 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007543
Tobin Ehlisd332f282015-10-02 11:00:56 -06007544 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07007545 // First need to successfully create the PSO from above by setting
7546 // pViewports
7547 m_errorMonitor->SetDesiredFailureMsg(
7548 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7549 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
7550 "scissorCount is 1. These counts must match.");
7551
7552 VkViewport vp = {}; // Just need dummy vp to point to
7553 vp_state_ci.pViewports = &vp;
7554 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7555 &gp_ci, NULL, &pipeline);
7556 ASSERT_VK_SUCCESS(err);
7557 BeginCommandBuffer();
7558 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7559 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
7560 VkRect2D scissors[2] = {}; // don't care about data
7561 // Count of 2 doesn't match PSO count of 1
7562 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
7563 Draw(1, 0, 0, 0);
7564
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007565 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07007566
7567 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7568 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7569 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7570 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007571 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007572}
7573// Create PSO w/o non-zero scissorCount but no scissor data
7574// Then run second test where dynamic viewportCount doesn't match PSO
7575// viewportCount
7576TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
7577 VkResult err;
7578
7579 m_errorMonitor->SetDesiredFailureMsg(
7580 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7581 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
7582
7583 ASSERT_NO_FATAL_FAILURE(InitState());
7584 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7585
7586 VkDescriptorPoolSize ds_type_count = {};
7587 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7588 ds_type_count.descriptorCount = 1;
7589
7590 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7591 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7592 ds_pool_ci.maxSets = 1;
7593 ds_pool_ci.poolSizeCount = 1;
7594 ds_pool_ci.pPoolSizes = &ds_type_count;
7595
7596 VkDescriptorPool ds_pool;
7597 err =
7598 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
7599 ASSERT_VK_SUCCESS(err);
7600
7601 VkDescriptorSetLayoutBinding dsl_binding = {};
7602 dsl_binding.binding = 0;
7603 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7604 dsl_binding.descriptorCount = 1;
7605 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7606
7607 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7608 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7609 ds_layout_ci.bindingCount = 1;
7610 ds_layout_ci.pBindings = &dsl_binding;
7611
7612 VkDescriptorSetLayout ds_layout;
7613 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7614 &ds_layout);
7615 ASSERT_VK_SUCCESS(err);
7616
7617 VkDescriptorSet descriptorSet;
7618 VkDescriptorSetAllocateInfo alloc_info = {};
7619 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7620 alloc_info.descriptorSetCount = 1;
7621 alloc_info.descriptorPool = ds_pool;
7622 alloc_info.pSetLayouts = &ds_layout;
7623 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7624 &descriptorSet);
7625 ASSERT_VK_SUCCESS(err);
7626
7627 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7628 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7629 pipeline_layout_ci.setLayoutCount = 1;
7630 pipeline_layout_ci.pSetLayouts = &ds_layout;
7631
7632 VkPipelineLayout pipeline_layout;
7633 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7634 &pipeline_layout);
7635 ASSERT_VK_SUCCESS(err);
7636
7637 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7638 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7639 vp_state_ci.scissorCount = 1;
7640 vp_state_ci.pScissors =
7641 NULL; // Null scissor w/ count of 1 should cause error
7642 vp_state_ci.viewportCount = 1;
7643 vp_state_ci.pViewports =
7644 NULL; // vp is dynamic (below) so this won't cause error
7645
7646 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
7647 // Set scissor as dynamic to avoid that error
7648 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7649 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7650 dyn_state_ci.dynamicStateCount = 1;
7651 dyn_state_ci.pDynamicStates = &vp_state;
7652
7653 VkPipelineShaderStageCreateInfo shaderStages[2];
7654 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7655
7656 VkShaderObj vs(m_device, bindStateVertShaderText,
7657 VK_SHADER_STAGE_VERTEX_BIT, this);
7658 VkShaderObj fs(m_device, bindStateFragShaderText,
7659 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06007660 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07007661 // but add it to be able to run on more devices
7662 shaderStages[0] = vs.GetStageCreateInfo();
7663 shaderStages[1] = fs.GetStageCreateInfo();
7664
7665 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7666 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7667 vi_ci.pNext = nullptr;
7668 vi_ci.vertexBindingDescriptionCount = 0;
7669 vi_ci.pVertexBindingDescriptions = nullptr;
7670 vi_ci.vertexAttributeDescriptionCount = 0;
7671 vi_ci.pVertexAttributeDescriptions = nullptr;
7672
7673 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7674 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7675 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7676
7677 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7678 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7679 rs_ci.pNext = nullptr;
7680
Mark Youngc89c6312016-03-31 16:03:20 -06007681 VkPipelineColorBlendAttachmentState att = {};
7682 att.blendEnable = VK_FALSE;
7683 att.colorWriteMask = 0xf;
7684
Karl Schultz6addd812016-02-02 17:17:23 -07007685 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7686 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7687 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06007688 cb_ci.attachmentCount = 1;
7689 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07007690
7691 VkGraphicsPipelineCreateInfo gp_ci = {};
7692 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7693 gp_ci.stageCount = 2;
7694 gp_ci.pStages = shaderStages;
7695 gp_ci.pVertexInputState = &vi_ci;
7696 gp_ci.pInputAssemblyState = &ia_ci;
7697 gp_ci.pViewportState = &vp_state_ci;
7698 gp_ci.pRasterizationState = &rs_ci;
7699 gp_ci.pColorBlendState = &cb_ci;
7700 gp_ci.pDynamicState = &dyn_state_ci;
7701 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7702 gp_ci.layout = pipeline_layout;
7703 gp_ci.renderPass = renderPass();
7704
7705 VkPipelineCacheCreateInfo pc_ci = {};
7706 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7707
7708 VkPipeline pipeline;
7709 VkPipelineCache pipelineCache;
7710
7711 err =
7712 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
7713 ASSERT_VK_SUCCESS(err);
7714 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7715 &gp_ci, NULL, &pipeline);
7716
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007717 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07007718
7719 // Now hit second fail case where we set scissor w/ different count than PSO
7720 // First need to successfully create the PSO from above by setting
7721 // pViewports
7722 m_errorMonitor->SetDesiredFailureMsg(
7723 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7724 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
7725 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007726
Tobin Ehlisd332f282015-10-02 11:00:56 -06007727 VkRect2D sc = {}; // Just need dummy vp to point to
7728 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07007729 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7730 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007731 ASSERT_VK_SUCCESS(err);
7732 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007733 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7734 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007735 VkViewport viewports[2] = {}; // don't care about data
7736 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07007737 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007738 Draw(1, 0, 0, 0);
7739
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007740 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007741
Chia-I Wuf7458c52015-10-26 21:10:41 +08007742 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7743 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7744 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7745 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007746 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007747}
7748
Mark Young7394fdd2016-03-31 14:56:43 -06007749TEST_F(VkLayerTest, PSOLineWidthInvalid) {
7750 VkResult err;
7751
7752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06007753 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06007754
7755 ASSERT_NO_FATAL_FAILURE(InitState());
7756 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7757
7758 VkDescriptorPoolSize ds_type_count = {};
7759 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7760 ds_type_count.descriptorCount = 1;
7761
7762 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7763 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7764 ds_pool_ci.maxSets = 1;
7765 ds_pool_ci.poolSizeCount = 1;
7766 ds_pool_ci.pPoolSizes = &ds_type_count;
7767
7768 VkDescriptorPool ds_pool;
7769 err =
7770 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
7771 ASSERT_VK_SUCCESS(err);
7772
7773 VkDescriptorSetLayoutBinding dsl_binding = {};
7774 dsl_binding.binding = 0;
7775 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7776 dsl_binding.descriptorCount = 1;
7777 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7778
7779 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7780 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7781 ds_layout_ci.bindingCount = 1;
7782 ds_layout_ci.pBindings = &dsl_binding;
7783
7784 VkDescriptorSetLayout ds_layout;
7785 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7786 &ds_layout);
7787 ASSERT_VK_SUCCESS(err);
7788
7789 VkDescriptorSet descriptorSet;
7790 VkDescriptorSetAllocateInfo alloc_info = {};
7791 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7792 alloc_info.descriptorSetCount = 1;
7793 alloc_info.descriptorPool = ds_pool;
7794 alloc_info.pSetLayouts = &ds_layout;
7795 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7796 &descriptorSet);
7797 ASSERT_VK_SUCCESS(err);
7798
7799 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7800 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7801 pipeline_layout_ci.setLayoutCount = 1;
7802 pipeline_layout_ci.pSetLayouts = &ds_layout;
7803
7804 VkPipelineLayout pipeline_layout;
7805 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7806 &pipeline_layout);
7807 ASSERT_VK_SUCCESS(err);
7808
7809 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7810 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7811 vp_state_ci.scissorCount = 1;
7812 vp_state_ci.pScissors = NULL;
7813 vp_state_ci.viewportCount = 1;
7814 vp_state_ci.pViewports = NULL;
7815
7816 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
7817 VK_DYNAMIC_STATE_SCISSOR,
7818 VK_DYNAMIC_STATE_LINE_WIDTH};
7819 // Set scissor as dynamic to avoid that error
7820 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7821 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7822 dyn_state_ci.dynamicStateCount = 2;
7823 dyn_state_ci.pDynamicStates = dynamic_states;
7824
7825 VkPipelineShaderStageCreateInfo shaderStages[2];
7826 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7827
7828 VkShaderObj vs(m_device, bindStateVertShaderText,
7829 VK_SHADER_STAGE_VERTEX_BIT, this);
7830 VkShaderObj fs(m_device, bindStateFragShaderText,
7831 VK_SHADER_STAGE_FRAGMENT_BIT,
7832 this); // TODO - We shouldn't need a fragment shader
7833 // but add it to be able to run on more devices
7834 shaderStages[0] = vs.GetStageCreateInfo();
7835 shaderStages[1] = fs.GetStageCreateInfo();
7836
7837 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7838 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7839 vi_ci.pNext = nullptr;
7840 vi_ci.vertexBindingDescriptionCount = 0;
7841 vi_ci.pVertexBindingDescriptions = nullptr;
7842 vi_ci.vertexAttributeDescriptionCount = 0;
7843 vi_ci.pVertexAttributeDescriptions = nullptr;
7844
7845 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7846 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7847 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7848
7849 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7850 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7851 rs_ci.pNext = nullptr;
7852
Mark Young47107952016-05-02 15:59:55 -06007853 // Check too low (line width of -1.0f).
7854 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06007855
7856 VkPipelineColorBlendAttachmentState att = {};
7857 att.blendEnable = VK_FALSE;
7858 att.colorWriteMask = 0xf;
7859
7860 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7861 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7862 cb_ci.pNext = nullptr;
7863 cb_ci.attachmentCount = 1;
7864 cb_ci.pAttachments = &att;
7865
7866 VkGraphicsPipelineCreateInfo gp_ci = {};
7867 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7868 gp_ci.stageCount = 2;
7869 gp_ci.pStages = shaderStages;
7870 gp_ci.pVertexInputState = &vi_ci;
7871 gp_ci.pInputAssemblyState = &ia_ci;
7872 gp_ci.pViewportState = &vp_state_ci;
7873 gp_ci.pRasterizationState = &rs_ci;
7874 gp_ci.pColorBlendState = &cb_ci;
7875 gp_ci.pDynamicState = &dyn_state_ci;
7876 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7877 gp_ci.layout = pipeline_layout;
7878 gp_ci.renderPass = renderPass();
7879
7880 VkPipelineCacheCreateInfo pc_ci = {};
7881 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7882
7883 VkPipeline pipeline;
7884 VkPipelineCache pipelineCache;
7885
7886 err =
7887 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
7888 ASSERT_VK_SUCCESS(err);
7889 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7890 &gp_ci, NULL, &pipeline);
7891
7892 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06007893 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06007894
7895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7896 "Attempt to set lineWidth to 65536");
7897
7898 // Check too high (line width of 65536.0f).
7899 rs_ci.lineWidth = 65536.0f;
7900
7901 err =
7902 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
7903 ASSERT_VK_SUCCESS(err);
7904 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7905 &gp_ci, NULL, &pipeline);
7906
7907 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06007908 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06007909
7910 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06007911 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06007912
7913 dyn_state_ci.dynamicStateCount = 3;
7914
7915 rs_ci.lineWidth = 1.0f;
7916
7917 err =
7918 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
7919 ASSERT_VK_SUCCESS(err);
7920 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7921 &gp_ci, NULL, &pipeline);
7922 BeginCommandBuffer();
7923 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7924 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
7925
7926 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06007927 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06007928 m_errorMonitor->VerifyFound();
7929
7930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7931 "Attempt to set lineWidth to 65536");
7932
7933 // Check too high with dynamic setting.
7934 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
7935 m_errorMonitor->VerifyFound();
7936 EndCommandBuffer();
7937
7938 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7939 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7940 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7941 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007942 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06007943}
7944
Karl Schultz6addd812016-02-02 17:17:23 -07007945TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007946 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07007947 m_errorMonitor->SetDesiredFailureMsg(
7948 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007949 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007950
7951 ASSERT_NO_FATAL_FAILURE(InitState());
7952 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007953
Tony Barbourfe3351b2015-07-28 10:17:20 -06007954 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007955 // Don't care about RenderPass handle b/c error should be flagged before
7956 // that
7957 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
7958 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007959
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007960 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007961}
7962
Karl Schultz6addd812016-02-02 17:17:23 -07007963TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007964 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07007965 m_errorMonitor->SetDesiredFailureMsg(
7966 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007967 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007968
7969 ASSERT_NO_FATAL_FAILURE(InitState());
7970 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007971
Tony Barbourfe3351b2015-07-28 10:17:20 -06007972 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007973 // Just create a dummy Renderpass that's non-NULL so we can get to the
7974 // proper error
Chris Forbes38ae7c42016-06-21 20:51:44 +12007975 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
Karl Schultz6addd812016-02-02 17:17:23 -07007976 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007977
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007978 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007979}
7980
Chris Forbes2eeabe32016-06-21 20:52:34 +12007981TEST_F(VkLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
7982 m_errorMonitor->ExpectSuccess();
7983
7984 ASSERT_NO_FATAL_FAILURE(InitState());
7985 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7986
7987 BeginCommandBuffer(); // framework implicitly begins the renderpass.
7988 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // end implicit.
7989
7990 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
7991 VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
7992 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
7993 m_errorMonitor->VerifyNotFound();
7994 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
7995 VK_SUBPASS_CONTENTS_INLINE);
7996 m_errorMonitor->VerifyNotFound();
7997 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
7998 m_errorMonitor->VerifyNotFound();
7999
8000 m_commandBuffer->EndCommandBuffer();
8001 m_errorMonitor->VerifyNotFound();
8002}
8003
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008004TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
8005 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
8006 "the number of renderPass attachments that use loadOp"
8007 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
8008
8009 ASSERT_NO_FATAL_FAILURE(InitState());
8010 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8011
8012 // Create a renderPass with a single attachment that uses loadOp CLEAR
8013 VkAttachmentReference attach = {};
8014 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8015 VkSubpassDescription subpass = {};
8016 subpass.inputAttachmentCount = 1;
8017 subpass.pInputAttachments = &attach;
8018 VkRenderPassCreateInfo rpci = {};
8019 rpci.subpassCount = 1;
8020 rpci.pSubpasses = &subpass;
8021 rpci.attachmentCount = 1;
8022 VkAttachmentDescription attach_desc = {};
8023 attach_desc.format = VK_FORMAT_UNDEFINED;
8024 // Set loadOp to CLEAR
8025 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8026 rpci.pAttachments = &attach_desc;
8027 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8028 VkRenderPass rp;
8029 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8030
8031 VkCommandBufferInheritanceInfo hinfo = {};
8032 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8033 hinfo.renderPass = VK_NULL_HANDLE;
8034 hinfo.subpass = 0;
8035 hinfo.framebuffer = VK_NULL_HANDLE;
8036 hinfo.occlusionQueryEnable = VK_FALSE;
8037 hinfo.queryFlags = 0;
8038 hinfo.pipelineStatistics = 0;
8039 VkCommandBufferBeginInfo info = {};
8040 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8041 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8042 info.pInheritanceInfo = &hinfo;
8043
8044 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8045 VkRenderPassBeginInfo rp_begin = {};
8046 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8047 rp_begin.pNext = NULL;
8048 rp_begin.renderPass = renderPass();
8049 rp_begin.framebuffer = framebuffer();
8050 rp_begin.clearValueCount = 0; // Should be 1
8051
8052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8053 " has a clearValueCount of 0 but the "
8054 "actual number of attachments in "
8055 "renderPass ");
8056
8057 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
8058 VK_SUBPASS_CONTENTS_INLINE);
8059
8060 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008061
8062 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008063}
8064
Cody Northrop3bb4d962016-05-09 16:15:57 -06008065TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
8066
8067 TEST_DESCRIPTION("End a command buffer with an active render pass");
8068
8069 m_errorMonitor->SetDesiredFailureMsg(
8070 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8071 "It is invalid to issue this call inside an active render pass");
8072
8073 ASSERT_NO_FATAL_FAILURE(InitState());
8074 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8075
8076 // The framework's BeginCommandBuffer calls CreateRenderPass
8077 BeginCommandBuffer();
8078
8079 // Call directly into vkEndCommandBuffer instead of the
8080 // the framework's EndCommandBuffer, which inserts a
8081 // vkEndRenderPass
8082 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
8083
8084 m_errorMonitor->VerifyFound();
8085
8086 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8087 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
8088}
8089
Karl Schultz6addd812016-02-02 17:17:23 -07008090TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008091 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07008092 m_errorMonitor->SetDesiredFailureMsg(
8093 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008094 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008095
8096 ASSERT_NO_FATAL_FAILURE(InitState());
8097 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008098
8099 // Renderpass is started here
8100 BeginCommandBuffer();
8101
8102 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008103 vk_testing::Buffer dstBuffer;
8104 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008105
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008106 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008107
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008108 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008109}
8110
Karl Schultz6addd812016-02-02 17:17:23 -07008111TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008112 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07008113 m_errorMonitor->SetDesiredFailureMsg(
8114 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008115 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008116
8117 ASSERT_NO_FATAL_FAILURE(InitState());
8118 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008119
8120 // Renderpass is started here
8121 BeginCommandBuffer();
8122
8123 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008124 vk_testing::Buffer dstBuffer;
8125 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008126
Karl Schultz6addd812016-02-02 17:17:23 -07008127 VkDeviceSize dstOffset = 0;
8128 VkDeviceSize dataSize = 1024;
8129 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008130
Karl Schultz6addd812016-02-02 17:17:23 -07008131 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
8132 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008133
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008134 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008135}
8136
Karl Schultz6addd812016-02-02 17:17:23 -07008137TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008138 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008139 m_errorMonitor->SetDesiredFailureMsg(
8140 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008141 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008142
8143 ASSERT_NO_FATAL_FAILURE(InitState());
8144 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008145
8146 // Renderpass is started here
8147 BeginCommandBuffer();
8148
Michael Lentine0a369f62016-02-03 16:51:46 -06008149 VkClearColorValue clear_color;
8150 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008151 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8152 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8153 const int32_t tex_width = 32;
8154 const int32_t tex_height = 32;
8155 VkImageCreateInfo image_create_info = {};
8156 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8157 image_create_info.pNext = NULL;
8158 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8159 image_create_info.format = tex_format;
8160 image_create_info.extent.width = tex_width;
8161 image_create_info.extent.height = tex_height;
8162 image_create_info.extent.depth = 1;
8163 image_create_info.mipLevels = 1;
8164 image_create_info.arrayLayers = 1;
8165 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8166 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8167 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008168
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008169 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07008170 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
8171 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008172
Karl Schultz6addd812016-02-02 17:17:23 -07008173 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
8174 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008175
Karl Schultz6addd812016-02-02 17:17:23 -07008176 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
8177 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008178
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008179 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008180}
8181
Karl Schultz6addd812016-02-02 17:17:23 -07008182TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008183 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008184 m_errorMonitor->SetDesiredFailureMsg(
8185 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008186 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008187
8188 ASSERT_NO_FATAL_FAILURE(InitState());
8189 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008190
8191 // Renderpass is started here
8192 BeginCommandBuffer();
8193
8194 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008195 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008196 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8197 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8198 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8199 image_create_info.extent.width = 64;
8200 image_create_info.extent.height = 64;
8201 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8202 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008203
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008204 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07008205 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
8206 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008207
Karl Schultz6addd812016-02-02 17:17:23 -07008208 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
8209 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008210
Karl Schultz6addd812016-02-02 17:17:23 -07008211 vkCmdClearDepthStencilImage(
8212 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
8213 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
8214 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008215
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008216 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008217}
8218
Karl Schultz6addd812016-02-02 17:17:23 -07008219TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008220 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008221 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008222
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008224 "vkCmdClearAttachments: This call "
8225 "must be issued inside an active "
8226 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008227
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008228 ASSERT_NO_FATAL_FAILURE(InitState());
8229 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008230
8231 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008232 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008233 ASSERT_VK_SUCCESS(err);
8234
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008235 VkClearAttachment color_attachment;
8236 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8237 color_attachment.clearValue.color.float32[0] = 0;
8238 color_attachment.clearValue.color.float32[1] = 0;
8239 color_attachment.clearValue.color.float32[2] = 0;
8240 color_attachment.clearValue.color.float32[3] = 0;
8241 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008242 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
8243 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
8244 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008245
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008246 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008247}
8248
Karl Schultz9e66a292016-04-21 15:57:51 -06008249TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8250 // Try to add a buffer memory barrier with no buffer.
8251 m_errorMonitor->SetDesiredFailureMsg(
8252 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8253 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
8254
8255 ASSERT_NO_FATAL_FAILURE(InitState());
8256 BeginCommandBuffer();
8257
8258 VkBufferMemoryBarrier buf_barrier = {};
8259 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8260 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8261 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8262 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8263 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8264 buf_barrier.buffer = VK_NULL_HANDLE;
8265 buf_barrier.offset = 0;
8266 buf_barrier.size = VK_WHOLE_SIZE;
8267 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
8268 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
8269 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
8270
8271 m_errorMonitor->VerifyFound();
8272}
8273
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008274TEST_F(VkLayerTest, InvalidBarriers) {
8275 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8276
8277 m_errorMonitor->SetDesiredFailureMsg(
8278 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
8279
8280 ASSERT_NO_FATAL_FAILURE(InitState());
8281 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8282
8283 VkMemoryBarrier mem_barrier = {};
8284 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8285 mem_barrier.pNext = NULL;
8286 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8287 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8288 BeginCommandBuffer();
8289 // BeginCommandBuffer() starts a render pass
8290 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
8291 VK_PIPELINE_STAGE_HOST_BIT,
8292 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
8293 &mem_barrier, 0, nullptr, 0, nullptr);
8294 m_errorMonitor->VerifyFound();
8295
8296 m_errorMonitor->SetDesiredFailureMsg(
8297 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8298 "Image Layout cannot be transitioned to UNDEFINED");
8299 VkImageObj image(m_device);
8300 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
8301 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
8302 ASSERT_TRUE(image.initialized());
8303 VkImageMemoryBarrier img_barrier = {};
8304 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8305 img_barrier.pNext = NULL;
8306 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8307 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8308 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8309 // New layout can't be UNDEFINED
8310 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8311 img_barrier.image = image.handle();
8312 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8313 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8314 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8315 img_barrier.subresourceRange.baseArrayLayer = 0;
8316 img_barrier.subresourceRange.baseMipLevel = 0;
8317 img_barrier.subresourceRange.layerCount = 1;
8318 img_barrier.subresourceRange.levelCount = 1;
8319 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
8320 VK_PIPELINE_STAGE_HOST_BIT,
8321 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
8322 nullptr, 1, &img_barrier);
8323 m_errorMonitor->VerifyFound();
8324 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8325
8326 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8327 "Subresource must have the sum of the "
8328 "baseArrayLayer");
8329 // baseArrayLayer + layerCount must be <= image's arrayLayers
8330 img_barrier.subresourceRange.baseArrayLayer = 1;
8331 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
8332 VK_PIPELINE_STAGE_HOST_BIT,
8333 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
8334 nullptr, 1, &img_barrier);
8335 m_errorMonitor->VerifyFound();
8336 img_barrier.subresourceRange.baseArrayLayer = 0;
8337
8338 m_errorMonitor->SetDesiredFailureMsg(
8339 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8340 "Subresource must have the sum of the baseMipLevel");
8341 // baseMipLevel + levelCount must be <= image's mipLevels
8342 img_barrier.subresourceRange.baseMipLevel = 1;
8343 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
8344 VK_PIPELINE_STAGE_HOST_BIT,
8345 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
8346 nullptr, 1, &img_barrier);
8347 m_errorMonitor->VerifyFound();
8348 img_barrier.subresourceRange.baseMipLevel = 0;
8349
8350 m_errorMonitor->SetDesiredFailureMsg(
8351 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8352 "Buffer Barriers cannot be used during a render pass");
8353 vk_testing::Buffer buffer;
8354 buffer.init(*m_device, 256);
8355 VkBufferMemoryBarrier buf_barrier = {};
8356 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8357 buf_barrier.pNext = NULL;
8358 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8359 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8360 buf_barrier.buffer = buffer.handle();
8361 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8362 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8363 buf_barrier.offset = 0;
8364 buf_barrier.size = VK_WHOLE_SIZE;
8365 // Can't send buffer barrier during a render pass
8366 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
8367 VK_PIPELINE_STAGE_HOST_BIT,
8368 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
8369 &buf_barrier, 0, nullptr);
8370 m_errorMonitor->VerifyFound();
8371 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8372
8373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8374 "which is not less than total size");
8375 buf_barrier.offset = 257;
8376 // Offset greater than total size
8377 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
8378 VK_PIPELINE_STAGE_HOST_BIT,
8379 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
8380 &buf_barrier, 0, nullptr);
8381 m_errorMonitor->VerifyFound();
8382 buf_barrier.offset = 0;
8383
8384 m_errorMonitor->SetDesiredFailureMsg(
8385 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
8386 buf_barrier.size = 257;
8387 // Size greater than total size
8388 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
8389 VK_PIPELINE_STAGE_HOST_BIT,
8390 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
8391 &buf_barrier, 0, nullptr);
8392 m_errorMonitor->VerifyFound();
8393 buf_barrier.size = VK_WHOLE_SIZE;
8394
8395 m_errorMonitor->SetDesiredFailureMsg(
8396 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8397 "Image is a depth and stencil format and thus must "
8398 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
8399 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
8400 VkDepthStencilObj ds_image(m_device);
8401 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
8402 ASSERT_TRUE(ds_image.initialized());
8403 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8404 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
8405 img_barrier.image = ds_image.handle();
8406 // Leave aspectMask at COLOR on purpose
8407 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
8408 VK_PIPELINE_STAGE_HOST_BIT,
8409 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
8410 nullptr, 1, &img_barrier);
8411 m_errorMonitor->VerifyFound();
8412}
8413
Karl Schultz6addd812016-02-02 17:17:23 -07008414TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008415 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008416 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008417
Karl Schultz6addd812016-02-02 17:17:23 -07008418 m_errorMonitor->SetDesiredFailureMsg(
8419 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008420 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
8421
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008422 ASSERT_NO_FATAL_FAILURE(InitState());
8423 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008424 uint32_t qfi = 0;
8425 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008426 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8427 buffCI.size = 1024;
8428 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
8429 buffCI.queueFamilyIndexCount = 1;
8430 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008431
8432 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008433 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008434 ASSERT_VK_SUCCESS(err);
8435
8436 BeginCommandBuffer();
8437 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008438 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8439 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008440 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07008441 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
8442 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008443
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008444 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008445
Chia-I Wuf7458c52015-10-26 21:10:41 +08008446 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008447}
8448
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008449TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
8450 // Create an out-of-range queueFamilyIndex
8451 m_errorMonitor->SetDesiredFailureMsg(
8452 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -06008453 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
8454 "of the indices specified when the device was created, via the "
8455 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008456
8457 ASSERT_NO_FATAL_FAILURE(InitState());
8458 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8459 VkBufferCreateInfo buffCI = {};
8460 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8461 buffCI.size = 1024;
8462 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
8463 buffCI.queueFamilyIndexCount = 1;
8464 // Introduce failure by specifying invalid queue_family_index
8465 uint32_t qfi = 777;
8466 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06008467 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008468
8469 VkBuffer ib;
8470 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
8471
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008472 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008473 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008474}
8475
Karl Schultz6addd812016-02-02 17:17:23 -07008476TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
8477 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
8478 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008479
Karl Schultz6addd812016-02-02 17:17:23 -07008480 m_errorMonitor->SetDesiredFailureMsg(
8481 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008482 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008483
8484 ASSERT_NO_FATAL_FAILURE(InitState());
8485 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008486
8487 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008488 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008489 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
8490 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008491
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008492 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008493}
8494
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008495TEST_F(VkLayerTest, DSUsageBitsErrors) {
8496 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
8497 "that do not have correct usage bits sets.");
8498 VkResult err;
8499
8500 ASSERT_NO_FATAL_FAILURE(InitState());
8501 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
8502 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8503 ds_type_count[i].type = VkDescriptorType(i);
8504 ds_type_count[i].descriptorCount = 1;
8505 }
8506 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8507 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8508 ds_pool_ci.pNext = NULL;
8509 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8510 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8511 ds_pool_ci.pPoolSizes = ds_type_count;
8512
8513 VkDescriptorPool ds_pool;
8514 err =
8515 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
8516 ASSERT_VK_SUCCESS(err);
8517
8518 // Create 10 layouts where each has a single descriptor of different type
8519 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] =
8520 {};
8521 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8522 dsl_binding[i].binding = 0;
8523 dsl_binding[i].descriptorType = VkDescriptorType(i);
8524 dsl_binding[i].descriptorCount = 1;
8525 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
8526 dsl_binding[i].pImmutableSamplers = NULL;
8527 }
8528
8529 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8530 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8531 ds_layout_ci.pNext = NULL;
8532 ds_layout_ci.bindingCount = 1;
8533 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
8534 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8535 ds_layout_ci.pBindings = dsl_binding + i;
8536 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
8537 NULL, ds_layouts + i);
8538 ASSERT_VK_SUCCESS(err);
8539 }
8540 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
8541 VkDescriptorSetAllocateInfo alloc_info = {};
8542 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8543 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8544 alloc_info.descriptorPool = ds_pool;
8545 alloc_info.pSetLayouts = ds_layouts;
8546 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8547 descriptor_sets);
8548 ASSERT_VK_SUCCESS(err);
8549
8550 // Create a buffer & bufferView to be used for invalid updates
8551 VkBufferCreateInfo buff_ci = {};
8552 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8553 // This usage is not valid for any descriptor type
8554 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
8555 buff_ci.size = 256;
8556 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8557 VkBuffer buffer;
8558 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
8559 ASSERT_VK_SUCCESS(err);
8560
8561 VkBufferViewCreateInfo buff_view_ci = {};
8562 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
8563 buff_view_ci.buffer = buffer;
8564 buff_view_ci.format = VK_FORMAT_R8_UNORM;
8565 buff_view_ci.range = VK_WHOLE_SIZE;
8566 VkBufferView buff_view;
8567 err =
8568 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
8569 ASSERT_VK_SUCCESS(err);
8570
8571 // Create an image to be used for invalid updates
8572 VkImageCreateInfo image_ci = {};
8573 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8574 image_ci.imageType = VK_IMAGE_TYPE_2D;
8575 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
8576 image_ci.extent.width = 64;
8577 image_ci.extent.height = 64;
8578 image_ci.extent.depth = 1;
8579 image_ci.mipLevels = 1;
8580 image_ci.arrayLayers = 1;
8581 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
8582 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
8583 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
8584 // This usage is not valid for any descriptor type
8585 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8586 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8587 VkImage image;
8588 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
8589 ASSERT_VK_SUCCESS(err);
8590 // Bind memory to image
8591 VkMemoryRequirements mem_reqs;
8592 VkDeviceMemory image_mem;
8593 bool pass;
8594 VkMemoryAllocateInfo mem_alloc = {};
8595 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8596 mem_alloc.pNext = NULL;
8597 mem_alloc.allocationSize = 0;
8598 mem_alloc.memoryTypeIndex = 0;
8599 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
8600 mem_alloc.allocationSize = mem_reqs.size;
8601 pass =
8602 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
8603 ASSERT_TRUE(pass);
8604 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
8605 ASSERT_VK_SUCCESS(err);
8606 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
8607 ASSERT_VK_SUCCESS(err);
8608 // Now create view for image
8609 VkImageViewCreateInfo image_view_ci = {};
8610 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8611 image_view_ci.image = image;
8612 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
8613 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
8614 image_view_ci.subresourceRange.layerCount = 1;
8615 image_view_ci.subresourceRange.baseArrayLayer = 0;
8616 image_view_ci.subresourceRange.levelCount = 1;
8617 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8618 VkImageView image_view;
8619 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
8620 &image_view);
8621 ASSERT_VK_SUCCESS(err);
8622
8623 VkDescriptorBufferInfo buff_info = {};
8624 buff_info.buffer = buffer;
8625 VkDescriptorImageInfo img_info = {};
8626 img_info.imageView = image_view;
8627 VkWriteDescriptorSet descriptor_write = {};
8628 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8629 descriptor_write.dstBinding = 0;
8630 descriptor_write.descriptorCount = 1;
8631 descriptor_write.pTexelBufferView = &buff_view;
8632 descriptor_write.pBufferInfo = &buff_info;
8633 descriptor_write.pImageInfo = &img_info;
8634
8635 // These error messages align with VkDescriptorType struct
8636 const char *error_msgs[] = {
8637 "", // placeholder, no error for SAMPLER descriptor
8638 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
8639 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
8640 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
8641 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
8642 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
8643 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
8644 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
8645 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
8646 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
8647 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
8648 // Start loop at 1 as SAMPLER desc type has no usage bit error
8649 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8650 descriptor_write.descriptorType = VkDescriptorType(i);
8651 descriptor_write.dstSet = descriptor_sets[i];
8652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8653 error_msgs[i]);
8654
8655 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
8656 NULL);
8657
8658 m_errorMonitor->VerifyFound();
8659 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
8660 }
8661 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
8662 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008663 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008664 vkDestroyImageView(m_device->device(), image_view, NULL);
8665 vkDestroyBuffer(m_device->device(), buffer, NULL);
8666 vkDestroyBufferView(m_device->device(), buff_view, NULL);
8667 vkFreeDescriptorSets(m_device->device(), ds_pool,
8668 VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
8669 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8670}
8671
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008672TEST_F(VkLayerTest, DSAspectBitsErrors) {
8673 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
8674 // are set, but could expand this test to hit more cases.
8675 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
8676 "that do not have correct aspect bits sets.");
8677 VkResult err;
8678
8679 ASSERT_NO_FATAL_FAILURE(InitState());
8680 VkDescriptorPoolSize ds_type_count = {};
8681 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8682 ds_type_count.descriptorCount = 1;
8683
8684 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8685 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8686 ds_pool_ci.pNext = NULL;
8687 ds_pool_ci.maxSets = 5;
8688 ds_pool_ci.poolSizeCount = 1;
8689 ds_pool_ci.pPoolSizes = &ds_type_count;
8690
8691 VkDescriptorPool ds_pool;
8692 err =
8693 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
8694 ASSERT_VK_SUCCESS(err);
8695
8696 VkDescriptorSetLayoutBinding dsl_binding = {};
8697 dsl_binding.binding = 0;
8698 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8699 dsl_binding.descriptorCount = 1;
8700 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8701 dsl_binding.pImmutableSamplers = NULL;
8702
8703 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8704 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8705 ds_layout_ci.pNext = NULL;
8706 ds_layout_ci.bindingCount = 1;
8707 ds_layout_ci.pBindings = &dsl_binding;
8708 VkDescriptorSetLayout ds_layout;
8709 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8710 &ds_layout);
8711 ASSERT_VK_SUCCESS(err);
8712
8713 VkDescriptorSet descriptor_set = {};
8714 VkDescriptorSetAllocateInfo alloc_info = {};
8715 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8716 alloc_info.descriptorSetCount = 1;
8717 alloc_info.descriptorPool = ds_pool;
8718 alloc_info.pSetLayouts = &ds_layout;
8719 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8720 &descriptor_set);
8721 ASSERT_VK_SUCCESS(err);
8722
8723 // Create an image to be used for invalid updates
8724 VkImageCreateInfo image_ci = {};
8725 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8726 image_ci.imageType = VK_IMAGE_TYPE_2D;
8727 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
8728 image_ci.extent.width = 64;
8729 image_ci.extent.height = 64;
8730 image_ci.extent.depth = 1;
8731 image_ci.mipLevels = 1;
8732 image_ci.arrayLayers = 1;
8733 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
8734 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
8735 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
8736 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8737 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8738 VkImage image;
8739 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
8740 ASSERT_VK_SUCCESS(err);
8741 // Bind memory to image
8742 VkMemoryRequirements mem_reqs;
8743 VkDeviceMemory image_mem;
8744 bool pass;
8745 VkMemoryAllocateInfo mem_alloc = {};
8746 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8747 mem_alloc.pNext = NULL;
8748 mem_alloc.allocationSize = 0;
8749 mem_alloc.memoryTypeIndex = 0;
8750 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
8751 mem_alloc.allocationSize = mem_reqs.size;
8752 pass =
8753 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
8754 ASSERT_TRUE(pass);
8755 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
8756 ASSERT_VK_SUCCESS(err);
8757 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
8758 ASSERT_VK_SUCCESS(err);
8759 // Now create view for image
8760 VkImageViewCreateInfo image_view_ci = {};
8761 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8762 image_view_ci.image = image;
8763 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
8764 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
8765 image_view_ci.subresourceRange.layerCount = 1;
8766 image_view_ci.subresourceRange.baseArrayLayer = 0;
8767 image_view_ci.subresourceRange.levelCount = 1;
8768 // Setting both depth & stencil aspect bits is illegal for descriptor
8769 image_view_ci.subresourceRange.aspectMask =
8770 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
8771
8772 VkImageView image_view;
8773 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
8774 &image_view);
8775 ASSERT_VK_SUCCESS(err);
8776
8777 VkDescriptorImageInfo img_info = {};
8778 img_info.imageView = image_view;
8779 VkWriteDescriptorSet descriptor_write = {};
8780 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8781 descriptor_write.dstBinding = 0;
8782 descriptor_write.descriptorCount = 1;
8783 descriptor_write.pTexelBufferView = NULL;
8784 descriptor_write.pBufferInfo = NULL;
8785 descriptor_write.pImageInfo = &img_info;
8786 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8787 descriptor_write.dstSet = descriptor_set;
8788 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
8789 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
8790 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8791 error_msg);
8792
8793 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8794
8795 m_errorMonitor->VerifyFound();
8796 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8797 vkDestroyImage(m_device->device(), image, NULL);
8798 vkFreeMemory(m_device->device(), image_mem, NULL);
8799 vkDestroyImageView(m_device->device(), image_view, NULL);
8800 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
8801 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8802}
8803
Karl Schultz6addd812016-02-02 17:17:23 -07008804TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008805 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07008806 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06008807
Karl Schultz6addd812016-02-02 17:17:23 -07008808 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06008809 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8810 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
8811 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008812
Tobin Ehlis3b780662015-05-28 12:11:26 -06008813 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07008814 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008815 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008816 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8817 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06008818
8819 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008820 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8821 ds_pool_ci.pNext = NULL;
8822 ds_pool_ci.maxSets = 1;
8823 ds_pool_ci.poolSizeCount = 1;
8824 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06008825
Tobin Ehlis3b780662015-05-28 12:11:26 -06008826 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008827 err =
8828 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06008829 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06008830 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008831 dsl_binding.binding = 0;
8832 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8833 dsl_binding.descriptorCount = 1;
8834 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8835 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06008836
Tony Barboureb254902015-07-15 12:50:33 -06008837 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008838 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8839 ds_layout_ci.pNext = NULL;
8840 ds_layout_ci.bindingCount = 1;
8841 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06008842
Tobin Ehlis3b780662015-05-28 12:11:26 -06008843 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008844 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8845 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06008846 ASSERT_VK_SUCCESS(err);
8847
8848 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008849 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008850 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008851 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008852 alloc_info.descriptorPool = ds_pool;
8853 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008854 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8855 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06008856 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06008857
Tobin Ehlis30db8f82016-05-05 08:19:48 -06008858 VkSamplerCreateInfo sampler_ci = {};
8859 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
8860 sampler_ci.pNext = NULL;
8861 sampler_ci.magFilter = VK_FILTER_NEAREST;
8862 sampler_ci.minFilter = VK_FILTER_NEAREST;
8863 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
8864 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
8865 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
8866 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
8867 sampler_ci.mipLodBias = 1.0;
8868 sampler_ci.anisotropyEnable = VK_FALSE;
8869 sampler_ci.maxAnisotropy = 1;
8870 sampler_ci.compareEnable = VK_FALSE;
8871 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
8872 sampler_ci.minLod = 1.0;
8873 sampler_ci.maxLod = 1.0;
8874 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
8875 sampler_ci.unnormalizedCoordinates = VK_FALSE;
8876 VkSampler sampler;
8877 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8878 ASSERT_VK_SUCCESS(err);
8879
8880 VkDescriptorImageInfo info = {};
8881 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08008882
8883 VkWriteDescriptorSet descriptor_write;
8884 memset(&descriptor_write, 0, sizeof(descriptor_write));
8885 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008886 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008887 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06008888 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08008889 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06008890 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08008891
8892 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8893
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008894 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008895
Chia-I Wuf7458c52015-10-26 21:10:41 +08008896 vkDestroySampler(m_device->device(), sampler, NULL);
8897 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8898 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008899}
8900
Karl Schultz6addd812016-02-02 17:17:23 -07008901TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008902 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07008903 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06008904
Karl Schultz6addd812016-02-02 17:17:23 -07008905 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06008906 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8907 " binding #0 with 1 total descriptors but update of 1 descriptors "
8908 "starting at binding offset of 0 combined with update array element "
8909 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008910
Tobin Ehlis3b780662015-05-28 12:11:26 -06008911 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07008912 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008913 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008914 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8915 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06008916
8917 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008918 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8919 ds_pool_ci.pNext = NULL;
8920 ds_pool_ci.maxSets = 1;
8921 ds_pool_ci.poolSizeCount = 1;
8922 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06008923
Tobin Ehlis3b780662015-05-28 12:11:26 -06008924 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008925 err =
8926 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06008927 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06008928
Tony Barboureb254902015-07-15 12:50:33 -06008929 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008930 dsl_binding.binding = 0;
8931 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8932 dsl_binding.descriptorCount = 1;
8933 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8934 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06008935
8936 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008937 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8938 ds_layout_ci.pNext = NULL;
8939 ds_layout_ci.bindingCount = 1;
8940 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06008941
Tobin Ehlis3b780662015-05-28 12:11:26 -06008942 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008943 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8944 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06008945 ASSERT_VK_SUCCESS(err);
8946
8947 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008948 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008949 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008950 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008951 alloc_info.descriptorPool = ds_pool;
8952 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008953 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8954 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06008955 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06008956
Tobin Ehlis30db8f82016-05-05 08:19:48 -06008957 // Correctly update descriptor to avoid "NOT_UPDATED" error
8958 VkDescriptorBufferInfo buff_info = {};
8959 buff_info.buffer =
8960 VkBuffer(0); // Don't care about buffer handle for this test
8961 buff_info.offset = 0;
8962 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08008963
8964 VkWriteDescriptorSet descriptor_write;
8965 memset(&descriptor_write, 0, sizeof(descriptor_write));
8966 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008967 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07008968 descriptor_write.dstArrayElement =
8969 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08008970 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06008971 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8972 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08008973
8974 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8975
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008976 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008977
Chia-I Wuf7458c52015-10-26 21:10:41 +08008978 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8979 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008980}
8981
Karl Schultz6addd812016-02-02 17:17:23 -07008982TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
8983 // Create layout w/ count of 1 and attempt update to that layout w/ binding
8984 // index 2
8985 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06008986
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06008987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8988 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008989
Tobin Ehlis3b780662015-05-28 12:11:26 -06008990 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07008991 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008992 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008993 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8994 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06008995
8996 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008997 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8998 ds_pool_ci.pNext = NULL;
8999 ds_pool_ci.maxSets = 1;
9000 ds_pool_ci.poolSizeCount = 1;
9001 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009002
Tobin Ehlis3b780662015-05-28 12:11:26 -06009003 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009004 err =
9005 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009006 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009007
Tony Barboureb254902015-07-15 12:50:33 -06009008 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009009 dsl_binding.binding = 0;
9010 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9011 dsl_binding.descriptorCount = 1;
9012 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9013 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06009014
9015 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009016 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9017 ds_layout_ci.pNext = NULL;
9018 ds_layout_ci.bindingCount = 1;
9019 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009020 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009021 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9022 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009023 ASSERT_VK_SUCCESS(err);
9024
9025 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009026 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009027 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009028 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009029 alloc_info.descriptorPool = ds_pool;
9030 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009031 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9032 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009033 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009034
Tony Barboureb254902015-07-15 12:50:33 -06009035 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009036 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9037 sampler_ci.pNext = NULL;
9038 sampler_ci.magFilter = VK_FILTER_NEAREST;
9039 sampler_ci.minFilter = VK_FILTER_NEAREST;
9040 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9041 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9042 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9043 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9044 sampler_ci.mipLodBias = 1.0;
9045 sampler_ci.anisotropyEnable = VK_FALSE;
9046 sampler_ci.maxAnisotropy = 1;
9047 sampler_ci.compareEnable = VK_FALSE;
9048 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9049 sampler_ci.minLod = 1.0;
9050 sampler_ci.maxLod = 1.0;
9051 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9052 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06009053
Tobin Ehlis3b780662015-05-28 12:11:26 -06009054 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009055 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009056 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009057
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009058 VkDescriptorImageInfo info = {};
9059 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009060
9061 VkWriteDescriptorSet descriptor_write;
9062 memset(&descriptor_write, 0, sizeof(descriptor_write));
9063 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009064 descriptor_write.dstSet = descriptorSet;
9065 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009066 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009067 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009068 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009069 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009070
9071 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9072
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009073 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009074
Chia-I Wuf7458c52015-10-26 21:10:41 +08009075 vkDestroySampler(m_device->device(), sampler, NULL);
9076 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9077 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009078}
9079
Karl Schultz6addd812016-02-02 17:17:23 -07009080TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
9081 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
9082 // types
9083 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009084
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis660bcdc2016-05-17 10:39:46 -06009086 ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009087
Tobin Ehlis3b780662015-05-28 12:11:26 -06009088 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009089
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009090 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009091 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9092 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009093
9094 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009095 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9096 ds_pool_ci.pNext = NULL;
9097 ds_pool_ci.maxSets = 1;
9098 ds_pool_ci.poolSizeCount = 1;
9099 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009100
Tobin Ehlis3b780662015-05-28 12:11:26 -06009101 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009102 err =
9103 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009104 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009105 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009106 dsl_binding.binding = 0;
9107 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9108 dsl_binding.descriptorCount = 1;
9109 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9110 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009111
Tony Barboureb254902015-07-15 12:50:33 -06009112 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009113 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9114 ds_layout_ci.pNext = NULL;
9115 ds_layout_ci.bindingCount = 1;
9116 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009117
Tobin Ehlis3b780662015-05-28 12:11:26 -06009118 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009119 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9120 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009121 ASSERT_VK_SUCCESS(err);
9122
9123 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009124 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009125 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009126 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009127 alloc_info.descriptorPool = ds_pool;
9128 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009129 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9130 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009131 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009132
Tony Barboureb254902015-07-15 12:50:33 -06009133 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009134 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9135 sampler_ci.pNext = NULL;
9136 sampler_ci.magFilter = VK_FILTER_NEAREST;
9137 sampler_ci.minFilter = VK_FILTER_NEAREST;
9138 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9139 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9140 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9141 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9142 sampler_ci.mipLodBias = 1.0;
9143 sampler_ci.anisotropyEnable = VK_FALSE;
9144 sampler_ci.maxAnisotropy = 1;
9145 sampler_ci.compareEnable = VK_FALSE;
9146 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9147 sampler_ci.minLod = 1.0;
9148 sampler_ci.maxLod = 1.0;
9149 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9150 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009151 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009152 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009153 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009154
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009155 VkDescriptorImageInfo info = {};
9156 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009157
9158 VkWriteDescriptorSet descriptor_write;
9159 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07009160 descriptor_write.sType =
9161 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009162 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009163 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009164 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009165 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009166 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009167
9168 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9169
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009170 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009171
Chia-I Wuf7458c52015-10-26 21:10:41 +08009172 vkDestroySampler(m_device->device(), sampler, NULL);
9173 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9174 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009175}
9176
Karl Schultz6addd812016-02-02 17:17:23 -07009177TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009178 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07009179 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009180
Karl Schultz6addd812016-02-02 17:17:23 -07009181 m_errorMonitor->SetDesiredFailureMsg(
9182 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06009183 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009184
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009185 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009186 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
9187 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009188 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009189 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
9190 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009191
9192 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009193 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9194 ds_pool_ci.pNext = NULL;
9195 ds_pool_ci.maxSets = 1;
9196 ds_pool_ci.poolSizeCount = 1;
9197 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009198
9199 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009200 err =
9201 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009202 ASSERT_VK_SUCCESS(err);
9203
9204 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009205 dsl_binding.binding = 0;
9206 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9207 dsl_binding.descriptorCount = 1;
9208 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9209 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009210
9211 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009212 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9213 ds_layout_ci.pNext = NULL;
9214 ds_layout_ci.bindingCount = 1;
9215 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009216 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009217 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9218 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009219 ASSERT_VK_SUCCESS(err);
9220
9221 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009222 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009223 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009224 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009225 alloc_info.descriptorPool = ds_pool;
9226 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009227 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9228 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009229 ASSERT_VK_SUCCESS(err);
9230
Karl Schultz6addd812016-02-02 17:17:23 -07009231 VkSampler sampler =
9232 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009233
9234 VkDescriptorImageInfo descriptor_info;
9235 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
9236 descriptor_info.sampler = sampler;
9237
9238 VkWriteDescriptorSet descriptor_write;
9239 memset(&descriptor_write, 0, sizeof(descriptor_write));
9240 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009241 descriptor_write.dstSet = descriptorSet;
9242 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009243 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009244 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9245 descriptor_write.pImageInfo = &descriptor_info;
9246
9247 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9248
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009249 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009250
Chia-I Wuf7458c52015-10-26 21:10:41 +08009251 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9252 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009253}
9254
Karl Schultz6addd812016-02-02 17:17:23 -07009255TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
9256 // Create a single combined Image/Sampler descriptor and send it an invalid
9257 // imageView
9258 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009259
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06009260 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9261 "Attempted write update to combined "
9262 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -06009263 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009264
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009265 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009266 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009267 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
9268 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009269
9270 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009271 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9272 ds_pool_ci.pNext = NULL;
9273 ds_pool_ci.maxSets = 1;
9274 ds_pool_ci.poolSizeCount = 1;
9275 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009276
9277 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009278 err =
9279 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009280 ASSERT_VK_SUCCESS(err);
9281
9282 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009283 dsl_binding.binding = 0;
9284 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
9285 dsl_binding.descriptorCount = 1;
9286 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9287 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009288
9289 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009290 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9291 ds_layout_ci.pNext = NULL;
9292 ds_layout_ci.bindingCount = 1;
9293 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009294 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009295 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9296 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009297 ASSERT_VK_SUCCESS(err);
9298
9299 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009300 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009301 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009302 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009303 alloc_info.descriptorPool = ds_pool;
9304 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009305 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9306 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009307 ASSERT_VK_SUCCESS(err);
9308
9309 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009310 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9311 sampler_ci.pNext = NULL;
9312 sampler_ci.magFilter = VK_FILTER_NEAREST;
9313 sampler_ci.minFilter = VK_FILTER_NEAREST;
9314 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9315 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9316 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9317 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9318 sampler_ci.mipLodBias = 1.0;
9319 sampler_ci.anisotropyEnable = VK_FALSE;
9320 sampler_ci.maxAnisotropy = 1;
9321 sampler_ci.compareEnable = VK_FALSE;
9322 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9323 sampler_ci.minLod = 1.0;
9324 sampler_ci.maxLod = 1.0;
9325 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9326 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009327
9328 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009329 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009330 ASSERT_VK_SUCCESS(err);
9331
Karl Schultz6addd812016-02-02 17:17:23 -07009332 VkImageView view =
9333 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009334
9335 VkDescriptorImageInfo descriptor_info;
9336 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
9337 descriptor_info.sampler = sampler;
9338 descriptor_info.imageView = view;
9339
9340 VkWriteDescriptorSet descriptor_write;
9341 memset(&descriptor_write, 0, sizeof(descriptor_write));
9342 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009343 descriptor_write.dstSet = descriptorSet;
9344 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009345 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009346 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
9347 descriptor_write.pImageInfo = &descriptor_info;
9348
9349 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9350
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009351 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009352
Chia-I Wuf7458c52015-10-26 21:10:41 +08009353 vkDestroySampler(m_device->device(), sampler, NULL);
9354 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9355 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009356}
9357
Karl Schultz6addd812016-02-02 17:17:23 -07009358TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
9359 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
9360 // into the other
9361 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009362
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06009363 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9364 " binding #1 with type "
9365 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
9366 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009367
Tobin Ehlis04356f92015-10-27 16:35:27 -06009368 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009369 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009370 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009371 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9372 ds_type_count[0].descriptorCount = 1;
9373 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
9374 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009375
9376 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009377 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9378 ds_pool_ci.pNext = NULL;
9379 ds_pool_ci.maxSets = 1;
9380 ds_pool_ci.poolSizeCount = 2;
9381 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009382
9383 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009384 err =
9385 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009386 ASSERT_VK_SUCCESS(err);
9387 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009388 dsl_binding[0].binding = 0;
9389 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9390 dsl_binding[0].descriptorCount = 1;
9391 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9392 dsl_binding[0].pImmutableSamplers = NULL;
9393 dsl_binding[1].binding = 1;
9394 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9395 dsl_binding[1].descriptorCount = 1;
9396 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9397 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009398
9399 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009400 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9401 ds_layout_ci.pNext = NULL;
9402 ds_layout_ci.bindingCount = 2;
9403 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009404
9405 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009406 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9407 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009408 ASSERT_VK_SUCCESS(err);
9409
9410 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009411 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009412 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009413 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009414 alloc_info.descriptorPool = ds_pool;
9415 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009416 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9417 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009418 ASSERT_VK_SUCCESS(err);
9419
9420 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009421 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9422 sampler_ci.pNext = NULL;
9423 sampler_ci.magFilter = VK_FILTER_NEAREST;
9424 sampler_ci.minFilter = VK_FILTER_NEAREST;
9425 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9426 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9427 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9428 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9429 sampler_ci.mipLodBias = 1.0;
9430 sampler_ci.anisotropyEnable = VK_FALSE;
9431 sampler_ci.maxAnisotropy = 1;
9432 sampler_ci.compareEnable = VK_FALSE;
9433 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9434 sampler_ci.minLod = 1.0;
9435 sampler_ci.maxLod = 1.0;
9436 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9437 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009438
9439 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009440 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009441 ASSERT_VK_SUCCESS(err);
9442
9443 VkDescriptorImageInfo info = {};
9444 info.sampler = sampler;
9445
9446 VkWriteDescriptorSet descriptor_write;
9447 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
9448 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009449 descriptor_write.dstSet = descriptorSet;
9450 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08009451 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009452 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9453 descriptor_write.pImageInfo = &info;
9454 // This write update should succeed
9455 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9456 // Now perform a copy update that fails due to type mismatch
9457 VkCopyDescriptorSet copy_ds_update;
9458 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
9459 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
9460 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06009461 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009462 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07009463 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08009464 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06009465 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
9466
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009467 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06009468 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07009469 m_errorMonitor->SetDesiredFailureMsg(
9470 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06009471 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -06009472 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
9473 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
9474 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07009475 copy_ds_update.srcBinding =
9476 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009477 copy_ds_update.dstSet = descriptorSet;
9478 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06009479 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06009480 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
9481
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009482 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009483
Tobin Ehlis04356f92015-10-27 16:35:27 -06009484 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07009485 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06009486 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
9487 "update array offset of 0 and update of "
9488 "5 descriptors oversteps total number "
9489 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009490
Tobin Ehlis04356f92015-10-27 16:35:27 -06009491 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
9492 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
9493 copy_ds_update.srcSet = descriptorSet;
9494 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009495 copy_ds_update.dstSet = descriptorSet;
9496 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009497 copy_ds_update.descriptorCount =
9498 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06009499 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
9500
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009501 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06009502
Chia-I Wuf7458c52015-10-26 21:10:41 +08009503 vkDestroySampler(m_device->device(), sampler, NULL);
9504 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9505 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009506}
9507
Karl Schultz6addd812016-02-02 17:17:23 -07009508TEST_F(VkLayerTest, NumSamplesMismatch) {
9509 // Create CommandBuffer where MSAA samples doesn't match RenderPass
9510 // sampleCount
9511 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009512
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009514 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009515
Tobin Ehlis3b780662015-05-28 12:11:26 -06009516 ASSERT_NO_FATAL_FAILURE(InitState());
9517 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009518 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06009519 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009520 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009521
9522 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009523 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9524 ds_pool_ci.pNext = NULL;
9525 ds_pool_ci.maxSets = 1;
9526 ds_pool_ci.poolSizeCount = 1;
9527 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009528
Tobin Ehlis3b780662015-05-28 12:11:26 -06009529 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009530 err =
9531 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009532 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009533
Tony Barboureb254902015-07-15 12:50:33 -06009534 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08009535 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06009536 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08009537 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009538 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9539 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009540
Tony Barboureb254902015-07-15 12:50:33 -06009541 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9542 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9543 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009544 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07009545 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009546
Tobin Ehlis3b780662015-05-28 12:11:26 -06009547 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009548 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9549 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009550 ASSERT_VK_SUCCESS(err);
9551
9552 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009553 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009554 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009555 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009556 alloc_info.descriptorPool = ds_pool;
9557 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009558 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9559 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009560 ASSERT_VK_SUCCESS(err);
9561
Tony Barboureb254902015-07-15 12:50:33 -06009562 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009563 pipe_ms_state_ci.sType =
9564 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
9565 pipe_ms_state_ci.pNext = NULL;
9566 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
9567 pipe_ms_state_ci.sampleShadingEnable = 0;
9568 pipe_ms_state_ci.minSampleShading = 1.0;
9569 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009570
Tony Barboureb254902015-07-15 12:50:33 -06009571 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009572 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9573 pipeline_layout_ci.pNext = NULL;
9574 pipeline_layout_ci.setLayoutCount = 1;
9575 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009576
9577 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009578 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9579 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009580 ASSERT_VK_SUCCESS(err);
9581
Karl Schultz6addd812016-02-02 17:17:23 -07009582 VkShaderObj vs(m_device, bindStateVertShaderText,
9583 VK_SHADER_STAGE_VERTEX_BIT, this);
9584 VkShaderObj fs(m_device, bindStateFragShaderText,
9585 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009586 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009587 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06009588 VkPipelineObj pipe(m_device);
9589 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06009590 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06009591 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06009592 pipe.SetMSAA(&pipe_ms_state_ci);
9593 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06009594
Tony Barbourfe3351b2015-07-28 10:17:20 -06009595 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009596 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9597 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06009598
Mark Young29927482016-05-04 14:38:51 -06009599 // Render triangle (the error should trigger on the attempt to draw).
9600 Draw(3, 1, 0, 0);
9601
9602 // Finalize recording of the command buffer
9603 EndCommandBuffer();
9604
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009605 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009606
Chia-I Wuf7458c52015-10-26 21:10:41 +08009607 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9608 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9609 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009610}
Mark Young29927482016-05-04 14:38:51 -06009611
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009612TEST_F(VkLayerTest, RenderPassIncompatible) {
9613 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
9614 "Initial case is drawing with an active renderpass that's "
9615 "not compatible with the bound PSO's creation renderpass");
9616 VkResult err;
9617
9618 ASSERT_NO_FATAL_FAILURE(InitState());
9619 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9620
9621 VkDescriptorSetLayoutBinding dsl_binding = {};
9622 dsl_binding.binding = 0;
9623 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9624 dsl_binding.descriptorCount = 1;
9625 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9626 dsl_binding.pImmutableSamplers = NULL;
9627
9628 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9629 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9630 ds_layout_ci.pNext = NULL;
9631 ds_layout_ci.bindingCount = 1;
9632 ds_layout_ci.pBindings = &dsl_binding;
9633
9634 VkDescriptorSetLayout ds_layout;
9635 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9636 &ds_layout);
9637 ASSERT_VK_SUCCESS(err);
9638
9639 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9640 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9641 pipeline_layout_ci.pNext = NULL;
9642 pipeline_layout_ci.setLayoutCount = 1;
9643 pipeline_layout_ci.pSetLayouts = &ds_layout;
9644
9645 VkPipelineLayout pipeline_layout;
9646 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9647 &pipeline_layout);
9648 ASSERT_VK_SUCCESS(err);
9649
9650 VkShaderObj vs(m_device, bindStateVertShaderText,
9651 VK_SHADER_STAGE_VERTEX_BIT, this);
9652 VkShaderObj fs(m_device, bindStateFragShaderText,
9653 VK_SHADER_STAGE_FRAGMENT_BIT,
9654 this); // We shouldn't need a fragment shader
9655 // but add it to be able to run on more devices
9656 // Create a renderpass that will be incompatible with default renderpass
9657 VkAttachmentReference attach = {};
9658 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
9659 VkAttachmentReference color_att = {};
9660 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9661 VkSubpassDescription subpass = {};
9662 subpass.inputAttachmentCount = 1;
9663 subpass.pInputAttachments = &attach;
9664 subpass.colorAttachmentCount = 1;
9665 subpass.pColorAttachments = &color_att;
9666 VkRenderPassCreateInfo rpci = {};
9667 rpci.subpassCount = 1;
9668 rpci.pSubpasses = &subpass;
9669 rpci.attachmentCount = 1;
9670 VkAttachmentDescription attach_desc = {};
9671 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -06009672 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
9673 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009674 rpci.pAttachments = &attach_desc;
9675 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9676 VkRenderPass rp;
9677 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9678 VkPipelineObj pipe(m_device);
9679 pipe.AddShader(&vs);
9680 pipe.AddShader(&fs);
9681 pipe.AddColorAttachment();
9682 VkViewport view_port = {};
9683 m_viewports.push_back(view_port);
9684 pipe.SetViewport(m_viewports);
9685 VkRect2D rect = {};
9686 m_scissors.push_back(rect);
9687 pipe.SetScissor(m_scissors);
9688 pipe.CreateVKPipeline(pipeline_layout, renderPass());
9689
9690 VkCommandBufferInheritanceInfo cbii = {};
9691 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9692 cbii.renderPass = rp;
9693 cbii.subpass = 0;
9694 VkCommandBufferBeginInfo cbbi = {};
9695 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9696 cbbi.pInheritanceInfo = &cbii;
9697 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
9698 VkRenderPassBeginInfo rpbi = {};
9699 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9700 rpbi.framebuffer = m_framebuffer;
9701 rpbi.renderPass = rp;
9702 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi,
9703 VK_SUBPASS_CONTENTS_INLINE);
9704 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9705 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
9706
9707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9708 " is incompatible w/ gfx pipeline ");
9709 // Render triangle (the error should trigger on the attempt to draw).
9710 Draw(3, 1, 0, 0);
9711
9712 // Finalize recording of the command buffer
9713 EndCommandBuffer();
9714
9715 m_errorMonitor->VerifyFound();
9716
9717 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9718 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9719 vkDestroyRenderPass(m_device->device(), rp, NULL);
9720}
9721
Mark Youngc89c6312016-03-31 16:03:20 -06009722TEST_F(VkLayerTest, NumBlendAttachMismatch) {
9723 // Create Pipeline where the number of blend attachments doesn't match the
9724 // number of color attachments. In this case, we don't add any color
9725 // blend attachments even though we have a color attachment.
9726 VkResult err;
9727
9728 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -06009729 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -06009730
9731 ASSERT_NO_FATAL_FAILURE(InitState());
9732 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9733 VkDescriptorPoolSize ds_type_count = {};
9734 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9735 ds_type_count.descriptorCount = 1;
9736
9737 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9738 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9739 ds_pool_ci.pNext = NULL;
9740 ds_pool_ci.maxSets = 1;
9741 ds_pool_ci.poolSizeCount = 1;
9742 ds_pool_ci.pPoolSizes = &ds_type_count;
9743
9744 VkDescriptorPool ds_pool;
9745 err =
9746 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9747 ASSERT_VK_SUCCESS(err);
9748
9749 VkDescriptorSetLayoutBinding dsl_binding = {};
9750 dsl_binding.binding = 0;
9751 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9752 dsl_binding.descriptorCount = 1;
9753 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9754 dsl_binding.pImmutableSamplers = NULL;
9755
9756 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9757 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9758 ds_layout_ci.pNext = NULL;
9759 ds_layout_ci.bindingCount = 1;
9760 ds_layout_ci.pBindings = &dsl_binding;
9761
9762 VkDescriptorSetLayout ds_layout;
9763 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9764 &ds_layout);
9765 ASSERT_VK_SUCCESS(err);
9766
9767 VkDescriptorSet descriptorSet;
9768 VkDescriptorSetAllocateInfo alloc_info = {};
9769 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9770 alloc_info.descriptorSetCount = 1;
9771 alloc_info.descriptorPool = ds_pool;
9772 alloc_info.pSetLayouts = &ds_layout;
9773 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9774 &descriptorSet);
9775 ASSERT_VK_SUCCESS(err);
9776
9777 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
9778 pipe_ms_state_ci.sType =
9779 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
9780 pipe_ms_state_ci.pNext = NULL;
9781 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
9782 pipe_ms_state_ci.sampleShadingEnable = 0;
9783 pipe_ms_state_ci.minSampleShading = 1.0;
9784 pipe_ms_state_ci.pSampleMask = NULL;
9785
9786 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9787 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9788 pipeline_layout_ci.pNext = NULL;
9789 pipeline_layout_ci.setLayoutCount = 1;
9790 pipeline_layout_ci.pSetLayouts = &ds_layout;
9791
9792 VkPipelineLayout pipeline_layout;
9793 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9794 &pipeline_layout);
9795 ASSERT_VK_SUCCESS(err);
9796
9797 VkShaderObj vs(m_device, bindStateVertShaderText,
9798 VK_SHADER_STAGE_VERTEX_BIT, this);
9799 VkShaderObj fs(m_device, bindStateFragShaderText,
9800 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009801 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06009802 // but add it to be able to run on more devices
9803 VkPipelineObj pipe(m_device);
9804 pipe.AddShader(&vs);
9805 pipe.AddShader(&fs);
9806 pipe.SetMSAA(&pipe_ms_state_ci);
9807 pipe.CreateVKPipeline(pipeline_layout, renderPass());
9808
9809 BeginCommandBuffer();
9810 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9811 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
9812
Mark Young29927482016-05-04 14:38:51 -06009813 // Render triangle (the error should trigger on the attempt to draw).
9814 Draw(3, 1, 0, 0);
9815
9816 // Finalize recording of the command buffer
9817 EndCommandBuffer();
9818
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009819 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06009820
9821 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9822 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9823 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9824}
Mark Young29927482016-05-04 14:38:51 -06009825
Mark Muellerd4914412016-06-13 17:52:06 -06009826TEST_F(VkLayerTest, MissingClearAttachment) {
9827 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
9828 "structure passed to vkCmdClearAttachments");
9829 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9830 "vkCmdClearAttachments() attachment index 1 not found in attachment "
9831 "reference array of active subpass 0");
9832
9833 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
9834 m_errorMonitor->VerifyFound();
9835}
9836
Karl Schultz6addd812016-02-02 17:17:23 -07009837TEST_F(VkLayerTest, ClearCmdNoDraw) {
9838 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
9839 // to issuing a Draw
9840 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06009841
Karl Schultz6addd812016-02-02 17:17:23 -07009842 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07009843 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009844 "vkCmdClearAttachments() issued on CB object ");
9845
Tobin Ehlis53eddda2015-07-01 16:46:13 -06009846 ASSERT_NO_FATAL_FAILURE(InitState());
9847 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06009848
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009849 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009850 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9851 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009852
9853 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009854 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9855 ds_pool_ci.pNext = NULL;
9856 ds_pool_ci.maxSets = 1;
9857 ds_pool_ci.poolSizeCount = 1;
9858 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009859
Tobin Ehlis53eddda2015-07-01 16:46:13 -06009860 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009861 err =
9862 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06009863 ASSERT_VK_SUCCESS(err);
9864
Tony Barboureb254902015-07-15 12:50:33 -06009865 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009866 dsl_binding.binding = 0;
9867 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9868 dsl_binding.descriptorCount = 1;
9869 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9870 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06009871
Tony Barboureb254902015-07-15 12:50:33 -06009872 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009873 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9874 ds_layout_ci.pNext = NULL;
9875 ds_layout_ci.bindingCount = 1;
9876 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009877
Tobin Ehlis53eddda2015-07-01 16:46:13 -06009878 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009879 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9880 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06009881 ASSERT_VK_SUCCESS(err);
9882
9883 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009884 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009885 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009886 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009887 alloc_info.descriptorPool = ds_pool;
9888 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009889 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9890 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06009891 ASSERT_VK_SUCCESS(err);
9892
Tony Barboureb254902015-07-15 12:50:33 -06009893 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009894 pipe_ms_state_ci.sType =
9895 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
9896 pipe_ms_state_ci.pNext = NULL;
9897 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
9898 pipe_ms_state_ci.sampleShadingEnable = 0;
9899 pipe_ms_state_ci.minSampleShading = 1.0;
9900 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06009901
Tony Barboureb254902015-07-15 12:50:33 -06009902 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009903 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9904 pipeline_layout_ci.pNext = NULL;
9905 pipeline_layout_ci.setLayoutCount = 1;
9906 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06009907
9908 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009909 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9910 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06009911 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009912
Karl Schultz6addd812016-02-02 17:17:23 -07009913 VkShaderObj vs(m_device, bindStateVertShaderText,
9914 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06009915 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07009916 // on more devices
9917 VkShaderObj fs(m_device, bindStateFragShaderText,
9918 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009919
Tony Barbour62e1a5b2015-08-06 10:16:07 -06009920 VkPipelineObj pipe(m_device);
9921 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06009922 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06009923 pipe.SetMSAA(&pipe_ms_state_ci);
9924 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06009925
9926 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06009927
Karl Schultz6addd812016-02-02 17:17:23 -07009928 // Main thing we care about for this test is that the VkImage obj we're
9929 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06009930 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009931 VkClearAttachment color_attachment;
9932 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9933 color_attachment.clearValue.color.float32[0] = 1.0;
9934 color_attachment.clearValue.color.float32[1] = 1.0;
9935 color_attachment.clearValue.color.float32[2] = 1.0;
9936 color_attachment.clearValue.color.float32[3] = 1.0;
9937 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009938 VkClearRect clear_rect = {
9939 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06009940
Karl Schultz6addd812016-02-02 17:17:23 -07009941 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
9942 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009943
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009944 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009945
Chia-I Wuf7458c52015-10-26 21:10:41 +08009946 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9947 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9948 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06009949}
9950
Karl Schultz6addd812016-02-02 17:17:23 -07009951TEST_F(VkLayerTest, VtxBufferBadIndex) {
9952 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06009953
Karl Schultz6addd812016-02-02 17:17:23 -07009954 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07009955 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07009956 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009957
Tobin Ehlis502480b2015-06-24 15:53:07 -06009958 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06009959 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06009960 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06009961
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009962 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009963 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9964 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009965
9966 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009967 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9968 ds_pool_ci.pNext = NULL;
9969 ds_pool_ci.maxSets = 1;
9970 ds_pool_ci.poolSizeCount = 1;
9971 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009972
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009973 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009974 err =
9975 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06009976 ASSERT_VK_SUCCESS(err);
9977
Tony Barboureb254902015-07-15 12:50:33 -06009978 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009979 dsl_binding.binding = 0;
9980 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9981 dsl_binding.descriptorCount = 1;
9982 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9983 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06009984
Tony Barboureb254902015-07-15 12:50:33 -06009985 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009986 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9987 ds_layout_ci.pNext = NULL;
9988 ds_layout_ci.bindingCount = 1;
9989 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009990
Tobin Ehlis502480b2015-06-24 15:53:07 -06009991 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009992 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9993 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06009994 ASSERT_VK_SUCCESS(err);
9995
9996 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009997 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009998 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009999 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010000 alloc_info.descriptorPool = ds_pool;
10001 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010002 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10003 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010004 ASSERT_VK_SUCCESS(err);
10005
Tony Barboureb254902015-07-15 12:50:33 -060010006 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010007 pipe_ms_state_ci.sType =
10008 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
10009 pipe_ms_state_ci.pNext = NULL;
10010 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10011 pipe_ms_state_ci.sampleShadingEnable = 0;
10012 pipe_ms_state_ci.minSampleShading = 1.0;
10013 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010014
Tony Barboureb254902015-07-15 12:50:33 -060010015 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010016 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10017 pipeline_layout_ci.pNext = NULL;
10018 pipeline_layout_ci.setLayoutCount = 1;
10019 pipeline_layout_ci.pSetLayouts = &ds_layout;
10020 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010021
Karl Schultz6addd812016-02-02 17:17:23 -070010022 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
10023 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010024 ASSERT_VK_SUCCESS(err);
10025
Karl Schultz6addd812016-02-02 17:17:23 -070010026 VkShaderObj vs(m_device, bindStateVertShaderText,
10027 VK_SHADER_STAGE_VERTEX_BIT, this);
10028 VkShaderObj fs(m_device, bindStateFragShaderText,
10029 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060010030 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070010031 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010032 VkPipelineObj pipe(m_device);
10033 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010034 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010035 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010036 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060010037 pipe.SetViewport(m_viewports);
10038 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010039 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060010040
10041 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070010042 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10043 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060010044 // Don't care about actual data, just need to get to draw to flag error
10045 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -070010046 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
10047 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060010048 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060010049 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010050
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010051 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010052
Chia-I Wuf7458c52015-10-26 21:10:41 +080010053 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10054 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10055 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010056}
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010057// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
10058TEST_F(VkLayerTest, InvalidImageLayout) {
10059 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
10060 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
10061 "images in the wrong layout when they're copied or transitioned.");
10062 // 3 in ValidateCmdBufImageLayouts
10063 // * -1 Attempt to submit cmd buf w/ deleted image
10064 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
10065 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
10066 m_errorMonitor->SetDesiredFailureMsg(
10067 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10068 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
10069
10070 ASSERT_NO_FATAL_FAILURE(InitState());
10071 // Create src & dst images to use for copy operations
10072 VkImage src_image;
10073 VkImage dst_image;
10074
10075 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
10076 const int32_t tex_width = 32;
10077 const int32_t tex_height = 32;
10078
10079 VkImageCreateInfo image_create_info = {};
10080 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10081 image_create_info.pNext = NULL;
10082 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10083 image_create_info.format = tex_format;
10084 image_create_info.extent.width = tex_width;
10085 image_create_info.extent.height = tex_height;
10086 image_create_info.extent.depth = 1;
10087 image_create_info.mipLevels = 1;
10088 image_create_info.arrayLayers = 4;
10089 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10090 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10091 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10092 image_create_info.flags = 0;
10093
10094 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
10095 ASSERT_VK_SUCCESS(err);
10096 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
10097 ASSERT_VK_SUCCESS(err);
10098
10099 BeginCommandBuffer();
10100 VkImageCopy copyRegion;
10101 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10102 copyRegion.srcSubresource.mipLevel = 0;
10103 copyRegion.srcSubresource.baseArrayLayer = 0;
10104 copyRegion.srcSubresource.layerCount = 1;
10105 copyRegion.srcOffset.x = 0;
10106 copyRegion.srcOffset.y = 0;
10107 copyRegion.srcOffset.z = 0;
10108 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10109 copyRegion.dstSubresource.mipLevel = 0;
10110 copyRegion.dstSubresource.baseArrayLayer = 0;
10111 copyRegion.dstSubresource.layerCount = 1;
10112 copyRegion.dstOffset.x = 0;
10113 copyRegion.dstOffset.y = 0;
10114 copyRegion.dstOffset.z = 0;
10115 copyRegion.extent.width = 1;
10116 copyRegion.extent.height = 1;
10117 copyRegion.extent.depth = 1;
10118 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
10119 m_errorMonitor->VerifyFound();
10120 // Now cause error due to src image layout changing
10121 m_errorMonitor->SetDesiredFailureMsg(
10122 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10123 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
10124 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
10125 m_errorMonitor->VerifyFound();
10126 // Final src error is due to bad layout type
10127 m_errorMonitor->SetDesiredFailureMsg(
10128 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10129 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
10130 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
10131 m_errorMonitor->VerifyFound();
10132 // Now verify same checks for dst
10133 m_errorMonitor->SetDesiredFailureMsg(
10134 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10135 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
10136 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
10137 m_errorMonitor->VerifyFound();
10138 // Now cause error due to src image layout changing
10139 m_errorMonitor->SetDesiredFailureMsg(
10140 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10141 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
10142 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
10143 m_errorMonitor->VerifyFound();
10144 m_errorMonitor->SetDesiredFailureMsg(
10145 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10146 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
10147 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
10148 m_errorMonitor->VerifyFound();
10149 // Now cause error due to bad image layout transition in PipelineBarrier
10150 VkImageMemoryBarrier image_barrier[1] = {};
10151 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
10152 image_barrier[0].image = src_image;
10153 image_barrier[0].subresourceRange.layerCount = 2;
10154 image_barrier[0].subresourceRange.levelCount = 2;
10155 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10156 m_errorMonitor->SetDesiredFailureMsg(
10157 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10158 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
10159 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
10160 m_errorMonitor->VerifyFound();
10161
10162 // Finally some layout errors at RenderPass create time
10163 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
10164 VkAttachmentReference attach = {};
10165 // perf warning for GENERAL layout w/ non-DS input attachment
10166 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10167 VkSubpassDescription subpass = {};
10168 subpass.inputAttachmentCount = 1;
10169 subpass.pInputAttachments = &attach;
10170 VkRenderPassCreateInfo rpci = {};
10171 rpci.subpassCount = 1;
10172 rpci.pSubpasses = &subpass;
10173 rpci.attachmentCount = 1;
10174 VkAttachmentDescription attach_desc = {};
10175 attach_desc.format = VK_FORMAT_UNDEFINED;
10176 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060010177 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010178 VkRenderPass rp;
10179 m_errorMonitor->SetDesiredFailureMsg(
10180 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10181 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
10182 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10183 m_errorMonitor->VerifyFound();
10184 // error w/ non-general layout
10185 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10186
10187 m_errorMonitor->SetDesiredFailureMsg(
10188 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10189 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
10190 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10191 m_errorMonitor->VerifyFound();
10192 subpass.inputAttachmentCount = 0;
10193 subpass.colorAttachmentCount = 1;
10194 subpass.pColorAttachments = &attach;
10195 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10196 // perf warning for GENERAL layout on color attachment
10197 m_errorMonitor->SetDesiredFailureMsg(
10198 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10199 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
10200 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10201 m_errorMonitor->VerifyFound();
10202 // error w/ non-color opt or GENERAL layout for color attachment
10203 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10204 m_errorMonitor->SetDesiredFailureMsg(
10205 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10206 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
10207 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10208 m_errorMonitor->VerifyFound();
10209 subpass.colorAttachmentCount = 0;
10210 subpass.pDepthStencilAttachment = &attach;
10211 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10212 // perf warning for GENERAL layout on DS attachment
10213 m_errorMonitor->SetDesiredFailureMsg(
10214 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10215 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
10216 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10217 m_errorMonitor->VerifyFound();
10218 // error w/ non-ds opt or GENERAL layout for color attachment
10219 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10220 m_errorMonitor->SetDesiredFailureMsg(
10221 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10222 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
10223 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10224 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060010225 // For this error we need a valid renderpass so create default one
10226 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
10227 attach.attachment = 0;
10228 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
10229 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
10230 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
10231 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
10232 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
10233 // Can't do a CLEAR load on READ_ONLY initialLayout
10234 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
10235 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
10236 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10238 " with invalid first layout "
10239 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
10240 "ONLY_OPTIMAL");
10241 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10242 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010243
10244 vkDestroyImage(m_device->device(), src_image, NULL);
10245 vkDestroyImage(m_device->device(), dst_image, NULL);
10246}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010247#endif // DRAW_STATE_TESTS
10248
Tobin Ehlis0788f522015-05-26 16:11:58 -060010249#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060010250#if GTEST_IS_THREADSAFE
10251struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010252 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060010253 VkEvent event;
10254 bool bailout;
10255};
10256
Karl Schultz6addd812016-02-02 17:17:23 -070010257extern "C" void *AddToCommandBuffer(void *arg) {
10258 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060010259
Karl Schultz6addd812016-02-02 17:17:23 -070010260 for (int i = 0; i < 10000; i++) {
10261 vkCmdSetEvent(data->commandBuffer, data->event,
10262 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060010263 if (data->bailout) {
10264 break;
10265 }
10266 }
10267 return NULL;
10268}
10269
Karl Schultz6addd812016-02-02 17:17:23 -070010270TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060010271 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060010272
Karl Schultz6addd812016-02-02 17:17:23 -070010273 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10274 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010275
Mike Stroyanaccf7692015-05-12 16:00:45 -060010276 ASSERT_NO_FATAL_FAILURE(InitState());
10277 ASSERT_NO_FATAL_FAILURE(InitViewport());
10278 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10279
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010280 // Calls AllocateCommandBuffers
10281 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060010282
10283 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010284 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060010285
10286 VkEventCreateInfo event_info;
10287 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060010288 VkResult err;
10289
10290 memset(&event_info, 0, sizeof(event_info));
10291 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
10292
Chia-I Wuf7458c52015-10-26 21:10:41 +080010293 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060010294 ASSERT_VK_SUCCESS(err);
10295
Mike Stroyanaccf7692015-05-12 16:00:45 -060010296 err = vkResetEvent(device(), event);
10297 ASSERT_VK_SUCCESS(err);
10298
10299 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010300 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060010301 data.event = event;
10302 data.bailout = false;
10303 m_errorMonitor->SetBailout(&data.bailout);
10304 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060010305 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060010306 // Add many entries to command buffer from this thread at the same time.
10307 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060010308
Mike Stroyan4268d1f2015-07-13 14:45:35 -060010309 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010310 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060010311
Mike Stroyan10b8cb72016-01-22 15:22:03 -070010312 m_errorMonitor->SetBailout(NULL);
10313
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010314 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060010315
Chia-I Wuf7458c52015-10-26 21:10:41 +080010316 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060010317}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010318#endif // GTEST_IS_THREADSAFE
10319#endif // THREADING_TESTS
10320
Chris Forbes9f7ff632015-05-25 11:13:08 +120010321#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070010322TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120010324 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010325
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060010326 ASSERT_NO_FATAL_FAILURE(InitState());
10327 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10328
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060010329 VkShaderModule module;
10330 VkShaderModuleCreateInfo moduleCreateInfo;
10331 struct icd_spv_header spv;
10332
10333 spv.magic = ICD_SPV_MAGIC;
10334 spv.version = ICD_SPV_VERSION;
10335 spv.gen_magic = 0;
10336
10337 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
10338 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070010339 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060010340 moduleCreateInfo.codeSize = 4;
10341 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010342 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060010343
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010344 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060010345}
10346
Karl Schultz6addd812016-02-02 17:17:23 -070010347TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120010349 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010350
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060010351 ASSERT_NO_FATAL_FAILURE(InitState());
10352 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10353
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060010354 VkShaderModule module;
10355 VkShaderModuleCreateInfo moduleCreateInfo;
10356 struct icd_spv_header spv;
10357
10358 spv.magic = ~ICD_SPV_MAGIC;
10359 spv.version = ICD_SPV_VERSION;
10360 spv.gen_magic = 0;
10361
10362 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
10363 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070010364 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060010365 moduleCreateInfo.codeSize = sizeof(spv) + 10;
10366 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010367 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060010368
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010369 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060010370}
10371
Chris Forbesb4afd0f2016-04-04 10:48:35 +120010372#if 0
10373// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070010374TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120010376 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010377
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060010378 ASSERT_NO_FATAL_FAILURE(InitState());
10379 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10380
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060010381 VkShaderModule module;
10382 VkShaderModuleCreateInfo moduleCreateInfo;
10383 struct icd_spv_header spv;
10384
10385 spv.magic = ICD_SPV_MAGIC;
10386 spv.version = ~ICD_SPV_VERSION;
10387 spv.gen_magic = 0;
10388
10389 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
10390 moduleCreateInfo.pNext = NULL;
10391
Karl Schultz6addd812016-02-02 17:17:23 -070010392 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060010393 moduleCreateInfo.codeSize = sizeof(spv) + 10;
10394 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010395 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060010396
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010397 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060010398}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120010399#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060010400
Karl Schultz6addd812016-02-02 17:17:23 -070010401TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070010402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070010403 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010404
Chris Forbes9f7ff632015-05-25 11:13:08 +120010405 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060010406 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120010407
10408 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120010409 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120010410 "\n"
10411 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070010412 "out gl_PerVertex {\n"
10413 " vec4 gl_Position;\n"
10414 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120010415 "void main(){\n"
10416 " gl_Position = vec4(1);\n"
10417 " x = 0;\n"
10418 "}\n";
10419 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120010420 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120010421 "\n"
10422 "layout(location=0) out vec4 color;\n"
10423 "void main(){\n"
10424 " color = vec4(1);\n"
10425 "}\n";
10426
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060010427 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
10428 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120010429
10430 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080010431 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120010432 pipe.AddShader(&vs);
10433 pipe.AddShader(&fs);
10434
Chris Forbes9f7ff632015-05-25 11:13:08 +120010435 VkDescriptorSetObj descriptorSet(m_device);
10436 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010437 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120010438
Tony Barbour5781e8f2015-08-04 16:23:11 -060010439 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120010440
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010441 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120010442}
Chris Forbes9f7ff632015-05-25 11:13:08 +120010443
Karl Schultz6addd812016-02-02 17:17:23 -070010444TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070010446 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010447
Chris Forbes59cb88d2015-05-25 11:13:13 +120010448 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060010449 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120010450
10451 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120010452 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120010453 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070010454 "out gl_PerVertex {\n"
10455 " vec4 gl_Position;\n"
10456 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120010457 "void main(){\n"
10458 " gl_Position = vec4(1);\n"
10459 "}\n";
10460 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120010461 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120010462 "\n"
10463 "layout(location=0) in float x;\n"
10464 "layout(location=0) out vec4 color;\n"
10465 "void main(){\n"
10466 " color = vec4(x);\n"
10467 "}\n";
10468
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060010469 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
10470 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120010471
10472 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080010473 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120010474 pipe.AddShader(&vs);
10475 pipe.AddShader(&fs);
10476
Chris Forbes59cb88d2015-05-25 11:13:13 +120010477 VkDescriptorSetObj descriptorSet(m_device);
10478 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010479 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120010480
Tony Barbour5781e8f2015-08-04 16:23:11 -060010481 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120010482
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010483 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120010484}
10485
Karl Schultz6addd812016-02-02 17:17:23 -070010486TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +130010487 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070010488 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130010489
10490 ASSERT_NO_FATAL_FAILURE(InitState());
10491 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10492
10493 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120010494 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130010495 "\n"
10496 "out gl_PerVertex {\n"
10497 " vec4 gl_Position;\n"
10498 "};\n"
10499 "void main(){\n"
10500 " gl_Position = vec4(1);\n"
10501 "}\n";
10502 char const *fsSource =
10503 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130010504 "\n"
10505 "in block { layout(location=0) float x; } ins;\n"
10506 "layout(location=0) out vec4 color;\n"
10507 "void main(){\n"
10508 " color = vec4(ins.x);\n"
10509 "}\n";
10510
10511 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
10512 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
10513
10514 VkPipelineObj pipe(m_device);
10515 pipe.AddColorAttachment();
10516 pipe.AddShader(&vs);
10517 pipe.AddShader(&fs);
10518
10519 VkDescriptorSetObj descriptorSet(m_device);
10520 descriptorSet.AppendDummy();
10521 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
10522
10523 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
10524
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010525 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130010526}
10527
Karl Schultz6addd812016-02-02 17:17:23 -070010528TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +130010529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +130010530 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -070010531 "output arr[2] of float32' vs 'ptr to "
10532 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130010533
10534 ASSERT_NO_FATAL_FAILURE(InitState());
10535 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10536
10537 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120010538 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130010539 "\n"
10540 "layout(location=0) out float x[2];\n"
10541 "out gl_PerVertex {\n"
10542 " vec4 gl_Position;\n"
10543 "};\n"
10544 "void main(){\n"
10545 " x[0] = 0; x[1] = 0;\n"
10546 " gl_Position = vec4(1);\n"
10547 "}\n";
10548 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120010549 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130010550 "\n"
10551 "layout(location=0) in float x[3];\n"
10552 "layout(location=0) out vec4 color;\n"
10553 "void main(){\n"
10554 " color = vec4(x[0] + x[1] + x[2]);\n"
10555 "}\n";
10556
10557 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
10558 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
10559
10560 VkPipelineObj pipe(m_device);
10561 pipe.AddColorAttachment();
10562 pipe.AddShader(&vs);
10563 pipe.AddShader(&fs);
10564
10565 VkDescriptorSetObj descriptorSet(m_device);
10566 descriptorSet.AppendDummy();
10567 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
10568
10569 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
10570
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010571 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130010572}
10573
Karl Schultz6addd812016-02-02 17:17:23 -070010574TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070010576 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010577
Chris Forbesb56af562015-05-25 11:13:17 +120010578 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060010579 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120010580
10581 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120010582 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120010583 "\n"
10584 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070010585 "out gl_PerVertex {\n"
10586 " vec4 gl_Position;\n"
10587 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +120010588 "void main(){\n"
10589 " x = 0;\n"
10590 " gl_Position = vec4(1);\n"
10591 "}\n";
10592 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120010593 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120010594 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070010595 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +120010596 "layout(location=0) out vec4 color;\n"
10597 "void main(){\n"
10598 " color = vec4(x);\n"
10599 "}\n";
10600
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060010601 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
10602 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120010603
10604 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080010605 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120010606 pipe.AddShader(&vs);
10607 pipe.AddShader(&fs);
10608
Chris Forbesb56af562015-05-25 11:13:17 +120010609 VkDescriptorSetObj descriptorSet(m_device);
10610 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010611 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120010612
Tony Barbour5781e8f2015-08-04 16:23:11 -060010613 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120010614
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010615 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120010616}
10617
Karl Schultz6addd812016-02-02 17:17:23 -070010618TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +130010619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070010620 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130010621
10622 ASSERT_NO_FATAL_FAILURE(InitState());
10623 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10624
10625 char const *vsSource =
10626 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130010627 "\n"
10628 "out block { layout(location=0) int x; } outs;\n"
10629 "out gl_PerVertex {\n"
10630 " vec4 gl_Position;\n"
10631 "};\n"
10632 "void main(){\n"
10633 " outs.x = 0;\n"
10634 " gl_Position = vec4(1);\n"
10635 "}\n";
10636 char const *fsSource =
10637 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130010638 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070010639 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +130010640 "layout(location=0) out vec4 color;\n"
10641 "void main(){\n"
10642 " color = vec4(ins.x);\n"
10643 "}\n";
10644
10645 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
10646 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
10647
10648 VkPipelineObj pipe(m_device);
10649 pipe.AddColorAttachment();
10650 pipe.AddShader(&vs);
10651 pipe.AddShader(&fs);
10652
10653 VkDescriptorSetObj descriptorSet(m_device);
10654 descriptorSet.AppendDummy();
10655 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
10656
10657 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
10658
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010659 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130010660}
10661
10662TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
10663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10664 "location 0.0 which is not written by vertex shader");
10665
10666 ASSERT_NO_FATAL_FAILURE(InitState());
10667 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10668
10669 char const *vsSource =
10670 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130010671 "\n"
10672 "out block { layout(location=1) float x; } outs;\n"
10673 "out gl_PerVertex {\n"
10674 " vec4 gl_Position;\n"
10675 "};\n"
10676 "void main(){\n"
10677 " outs.x = 0;\n"
10678 " gl_Position = vec4(1);\n"
10679 "}\n";
10680 char const *fsSource =
10681 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130010682 "\n"
10683 "in block { layout(location=0) float x; } ins;\n"
10684 "layout(location=0) out vec4 color;\n"
10685 "void main(){\n"
10686 " color = vec4(ins.x);\n"
10687 "}\n";
10688
10689 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
10690 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
10691
10692 VkPipelineObj pipe(m_device);
10693 pipe.AddColorAttachment();
10694 pipe.AddShader(&vs);
10695 pipe.AddShader(&fs);
10696
10697 VkDescriptorSetObj descriptorSet(m_device);
10698 descriptorSet.AppendDummy();
10699 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
10700
10701 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
10702
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010703 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130010704}
10705
10706TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
10707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10708 "location 0.1 which is not written by vertex shader");
10709
10710 ASSERT_NO_FATAL_FAILURE(InitState());
10711 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10712
10713 char const *vsSource =
10714 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130010715 "\n"
10716 "out block { layout(location=0, component=0) float x; } outs;\n"
10717 "out gl_PerVertex {\n"
10718 " vec4 gl_Position;\n"
10719 "};\n"
10720 "void main(){\n"
10721 " outs.x = 0;\n"
10722 " gl_Position = vec4(1);\n"
10723 "}\n";
10724 char const *fsSource =
10725 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130010726 "\n"
10727 "in block { layout(location=0, component=1) float x; } ins;\n"
10728 "layout(location=0) out vec4 color;\n"
10729 "void main(){\n"
10730 " color = vec4(ins.x);\n"
10731 "}\n";
10732
10733 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
10734 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
10735
10736 VkPipelineObj pipe(m_device);
10737 pipe.AddColorAttachment();
10738 pipe.AddShader(&vs);
10739 pipe.AddShader(&fs);
10740
10741 VkDescriptorSetObj descriptorSet(m_device);
10742 descriptorSet.AppendDummy();
10743 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
10744
10745 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
10746
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010747 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130010748}
10749
Karl Schultz6addd812016-02-02 17:17:23 -070010750TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070010751 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070010752 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010753
Chris Forbesde136e02015-05-25 11:13:28 +120010754 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060010755 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120010756
10757 VkVertexInputBindingDescription input_binding;
10758 memset(&input_binding, 0, sizeof(input_binding));
10759
10760 VkVertexInputAttributeDescription input_attrib;
10761 memset(&input_attrib, 0, sizeof(input_attrib));
10762 input_attrib.format = VK_FORMAT_R32_SFLOAT;
10763
10764 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120010765 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120010766 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070010767 "out gl_PerVertex {\n"
10768 " vec4 gl_Position;\n"
10769 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +120010770 "void main(){\n"
10771 " gl_Position = vec4(1);\n"
10772 "}\n";
10773 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120010774 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120010775 "\n"
10776 "layout(location=0) out vec4 color;\n"
10777 "void main(){\n"
10778 " color = vec4(1);\n"
10779 "}\n";
10780
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060010781 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
10782 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120010783
10784 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080010785 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120010786 pipe.AddShader(&vs);
10787 pipe.AddShader(&fs);
10788
10789 pipe.AddVertexInputBindings(&input_binding, 1);
10790 pipe.AddVertexInputAttribs(&input_attrib, 1);
10791
Chris Forbesde136e02015-05-25 11:13:28 +120010792 VkDescriptorSetObj descriptorSet(m_device);
10793 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010794 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120010795
Tony Barbour5781e8f2015-08-04 16:23:11 -060010796 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120010797
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010798 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120010799}
10800
Karl Schultz6addd812016-02-02 17:17:23 -070010801TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070010802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070010803 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +130010804
10805 ASSERT_NO_FATAL_FAILURE(InitState());
10806 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10807
10808 VkVertexInputBindingDescription input_binding;
10809 memset(&input_binding, 0, sizeof(input_binding));
10810
10811 VkVertexInputAttributeDescription input_attrib;
10812 memset(&input_attrib, 0, sizeof(input_attrib));
10813 input_attrib.format = VK_FORMAT_R32_SFLOAT;
10814
10815 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120010816 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130010817 "\n"
10818 "layout(location=1) in float x;\n"
10819 "out gl_PerVertex {\n"
10820 " vec4 gl_Position;\n"
10821 "};\n"
10822 "void main(){\n"
10823 " gl_Position = vec4(x);\n"
10824 "}\n";
10825 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120010826 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130010827 "\n"
10828 "layout(location=0) out vec4 color;\n"
10829 "void main(){\n"
10830 " color = vec4(1);\n"
10831 "}\n";
10832
10833 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
10834 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
10835
10836 VkPipelineObj pipe(m_device);
10837 pipe.AddColorAttachment();
10838 pipe.AddShader(&vs);
10839 pipe.AddShader(&fs);
10840
10841 pipe.AddVertexInputBindings(&input_binding, 1);
10842 pipe.AddVertexInputAttribs(&input_attrib, 1);
10843
10844 VkDescriptorSetObj descriptorSet(m_device);
10845 descriptorSet.AppendDummy();
10846 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
10847
10848 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
10849
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010850 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130010851}
10852
Karl Schultz6addd812016-02-02 17:17:23 -070010853TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
10854 m_errorMonitor->SetDesiredFailureMsg(
10855 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010856 "VS consumes input at location 0 but not provided");
10857
Chris Forbes62e8e502015-05-25 11:13:29 +120010858 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060010859 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120010860
10861 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120010862 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120010863 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070010864 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -070010865 "out gl_PerVertex {\n"
10866 " vec4 gl_Position;\n"
10867 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120010868 "void main(){\n"
10869 " gl_Position = x;\n"
10870 "}\n";
10871 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120010872 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120010873 "\n"
10874 "layout(location=0) out vec4 color;\n"
10875 "void main(){\n"
10876 " color = vec4(1);\n"
10877 "}\n";
10878
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060010879 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
10880 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120010881
10882 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080010883 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120010884 pipe.AddShader(&vs);
10885 pipe.AddShader(&fs);
10886
Chris Forbes62e8e502015-05-25 11:13:29 +120010887 VkDescriptorSetObj descriptorSet(m_device);
10888 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010889 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120010890
Tony Barbour5781e8f2015-08-04 16:23:11 -060010891 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120010892
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010893 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120010894}
10895
Karl Schultz6addd812016-02-02 17:17:23 -070010896TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
10897 m_errorMonitor->SetDesiredFailureMsg(
10898 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010899 "location 0 does not match VS input type");
10900
Chris Forbesc97d98e2015-05-25 11:13:31 +120010901 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060010902 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120010903
10904 VkVertexInputBindingDescription input_binding;
10905 memset(&input_binding, 0, sizeof(input_binding));
10906
10907 VkVertexInputAttributeDescription input_attrib;
10908 memset(&input_attrib, 0, sizeof(input_attrib));
10909 input_attrib.format = VK_FORMAT_R32_SFLOAT;
10910
10911 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120010912 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120010913 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070010914 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070010915 "out gl_PerVertex {\n"
10916 " vec4 gl_Position;\n"
10917 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120010918 "void main(){\n"
10919 " gl_Position = vec4(x);\n"
10920 "}\n";
10921 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120010922 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120010923 "\n"
10924 "layout(location=0) out vec4 color;\n"
10925 "void main(){\n"
10926 " color = vec4(1);\n"
10927 "}\n";
10928
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060010929 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
10930 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120010931
10932 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080010933 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120010934 pipe.AddShader(&vs);
10935 pipe.AddShader(&fs);
10936
10937 pipe.AddVertexInputBindings(&input_binding, 1);
10938 pipe.AddVertexInputAttribs(&input_attrib, 1);
10939
Chris Forbesc97d98e2015-05-25 11:13:31 +120010940 VkDescriptorSetObj descriptorSet(m_device);
10941 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010942 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120010943
Tony Barbour5781e8f2015-08-04 16:23:11 -060010944 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120010945
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010946 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120010947}
10948
Chris Forbesc68b43c2016-04-06 11:18:47 +120010949TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
10950 m_errorMonitor->SetDesiredFailureMsg(
10951 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10952 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
10953
10954 ASSERT_NO_FATAL_FAILURE(InitState());
10955 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10956
10957 char const *vsSource =
10958 "#version 450\n"
10959 "\n"
10960 "out gl_PerVertex {\n"
10961 " vec4 gl_Position;\n"
10962 "};\n"
10963 "void main(){\n"
10964 " gl_Position = vec4(1);\n"
10965 "}\n";
10966 char const *fsSource =
10967 "#version 450\n"
10968 "\n"
10969 "layout(location=0) out vec4 color;\n"
10970 "void main(){\n"
10971 " color = vec4(1);\n"
10972 "}\n";
10973
10974 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
10975 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
10976
10977 VkPipelineObj pipe(m_device);
10978 pipe.AddColorAttachment();
10979 pipe.AddShader(&vs);
10980 pipe.AddShader(&vs);
10981 pipe.AddShader(&fs);
10982
10983 VkDescriptorSetObj descriptorSet(m_device);
10984 descriptorSet.AppendDummy();
10985 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
10986
10987 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
10988
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010989 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120010990}
10991
Karl Schultz6addd812016-02-02 17:17:23 -070010992TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010993 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130010994
10995 ASSERT_NO_FATAL_FAILURE(InitState());
10996 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10997
10998 VkVertexInputBindingDescription input_binding;
10999 memset(&input_binding, 0, sizeof(input_binding));
11000
11001 VkVertexInputAttributeDescription input_attribs[2];
11002 memset(input_attribs, 0, sizeof(input_attribs));
11003
11004 for (int i = 0; i < 2; i++) {
11005 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
11006 input_attribs[i].location = i;
11007 }
11008
11009 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011010 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130011011 "\n"
11012 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070011013 "out gl_PerVertex {\n"
11014 " vec4 gl_Position;\n"
11015 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130011016 "void main(){\n"
11017 " gl_Position = x[0] + x[1];\n"
11018 "}\n";
11019 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011020 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130011021 "\n"
11022 "layout(location=0) out vec4 color;\n"
11023 "void main(){\n"
11024 " color = vec4(1);\n"
11025 "}\n";
11026
11027 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11028 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11029
11030 VkPipelineObj pipe(m_device);
11031 pipe.AddColorAttachment();
11032 pipe.AddShader(&vs);
11033 pipe.AddShader(&fs);
11034
11035 pipe.AddVertexInputBindings(&input_binding, 1);
11036 pipe.AddVertexInputAttribs(input_attribs, 2);
11037
11038 VkDescriptorSetObj descriptorSet(m_device);
11039 descriptorSet.AppendDummy();
11040 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11041
11042 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11043
11044 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011045 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130011046}
11047
Chris Forbes2682b242015-11-24 11:13:14 +130011048TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
11049{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011050 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130011051
11052 ASSERT_NO_FATAL_FAILURE(InitState());
11053 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11054
11055 VkVertexInputBindingDescription input_binding;
11056 memset(&input_binding, 0, sizeof(input_binding));
11057
11058 VkVertexInputAttributeDescription input_attribs[2];
11059 memset(input_attribs, 0, sizeof(input_attribs));
11060
11061 for (int i = 0; i < 2; i++) {
11062 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
11063 input_attribs[i].location = i;
11064 }
11065
11066 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011067 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130011068 "\n"
11069 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -070011070 "out gl_PerVertex {\n"
11071 " vec4 gl_Position;\n"
11072 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130011073 "void main(){\n"
11074 " gl_Position = x[0] + x[1];\n"
11075 "}\n";
11076 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011077 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130011078 "\n"
11079 "layout(location=0) out vec4 color;\n"
11080 "void main(){\n"
11081 " color = vec4(1);\n"
11082 "}\n";
11083
11084 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11085 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11086
11087 VkPipelineObj pipe(m_device);
11088 pipe.AddColorAttachment();
11089 pipe.AddShader(&vs);
11090 pipe.AddShader(&fs);
11091
11092 pipe.AddVertexInputBindings(&input_binding, 1);
11093 pipe.AddVertexInputAttribs(input_attribs, 2);
11094
11095 VkDescriptorSetObj descriptorSet(m_device);
11096 descriptorSet.AppendDummy();
11097 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11098
11099 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11100
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011101 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130011102}
Chris Forbes2682b242015-11-24 11:13:14 +130011103
Chris Forbes4ea14fc2016-04-04 18:52:54 +120011104TEST_F(VkLayerTest, CreatePipelineSimplePositive)
11105{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011106 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120011107
11108 ASSERT_NO_FATAL_FAILURE(InitState());
11109 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11110
11111 char const *vsSource =
11112 "#version 450\n"
11113 "out gl_PerVertex {\n"
11114 " vec4 gl_Position;\n"
11115 "};\n"
11116 "void main(){\n"
11117 " gl_Position = vec4(0);\n"
11118 "}\n";
11119 char const *fsSource =
11120 "#version 450\n"
11121 "\n"
11122 "layout(location=0) out vec4 color;\n"
11123 "void main(){\n"
11124 " color = vec4(1);\n"
11125 "}\n";
11126
11127 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11128 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11129
11130 VkPipelineObj pipe(m_device);
11131 pipe.AddColorAttachment();
11132 pipe.AddShader(&vs);
11133 pipe.AddShader(&fs);
11134
11135 VkDescriptorSetObj descriptorSet(m_device);
11136 descriptorSet.AppendDummy();
11137 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11138
11139 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11140
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011141 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120011142}
11143
Chris Forbes912c9192016-04-05 17:50:35 +120011144TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
11145{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011146 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +120011147
11148 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
11149
11150 ASSERT_NO_FATAL_FAILURE(InitState());
11151 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11152
11153 char const *vsSource =
11154 "#version 450\n"
11155 "out gl_PerVertex {\n"
11156 " vec4 gl_Position;\n"
11157 "};\n"
11158 "layout(location=0) out vec3 x;\n"
11159 "layout(location=1) out ivec3 y;\n"
11160 "layout(location=2) out vec3 z;\n"
11161 "void main(){\n"
11162 " gl_Position = vec4(0);\n"
11163 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
11164 "}\n";
11165 char const *fsSource =
11166 "#version 450\n"
11167 "\n"
11168 "layout(location=0) out vec4 color;\n"
11169 "layout(location=0) in float x;\n"
11170 "layout(location=1) flat in int y;\n"
11171 "layout(location=2) in vec2 z;\n"
11172 "void main(){\n"
11173 " color = vec4(1 + x + y + z.x);\n"
11174 "}\n";
11175
11176 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11177 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11178
11179 VkPipelineObj pipe(m_device);
11180 pipe.AddColorAttachment();
11181 pipe.AddShader(&vs);
11182 pipe.AddShader(&fs);
11183
11184 VkDescriptorSetObj descriptorSet(m_device);
11185 descriptorSet.AppendDummy();
11186 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11187
Mike Stroyan255e9582016-06-24 09:49:32 -060011188 VkResult err = VK_SUCCESS;
11189 err =
11190 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11191 ASSERT_VK_SUCCESS(err);
11192
Chris Forbes912c9192016-04-05 17:50:35 +120011193
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011194 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +120011195}
11196
Chris Forbes4ea14fc2016-04-04 18:52:54 +120011197TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
11198{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011199 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120011200
11201 ASSERT_NO_FATAL_FAILURE(InitState());
11202 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11203
Chris Forbesc1e852d2016-04-04 19:26:42 +120011204 if (!m_device->phy().features().tessellationShader) {
11205 printf("Device does not support tessellation shaders; skipped.\n");
11206 return;
11207 }
11208
Chris Forbes4ea14fc2016-04-04 18:52:54 +120011209 char const *vsSource =
11210 "#version 450\n"
11211 "void main(){}\n";
11212 char const *tcsSource =
11213 "#version 450\n"
11214 "layout(location=0) out int x[];\n"
11215 "layout(vertices=3) out;\n"
11216 "void main(){\n"
11217 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
11218 " gl_TessLevelInner[0] = 1;\n"
11219 " x[gl_InvocationID] = gl_InvocationID;\n"
11220 "}\n";
11221 char const *tesSource =
11222 "#version 450\n"
11223 "layout(triangles, equal_spacing, cw) in;\n"
11224 "layout(location=0) in int x[];\n"
11225 "out gl_PerVertex { vec4 gl_Position; };\n"
11226 "void main(){\n"
11227 " gl_Position.xyz = gl_TessCoord;\n"
11228 " gl_Position.w = x[0] + x[1] + x[2];\n"
11229 "}\n";
11230 char const *fsSource =
11231 "#version 450\n"
11232 "layout(location=0) out vec4 color;\n"
11233 "void main(){\n"
11234 " color = vec4(1);\n"
11235 "}\n";
11236
11237 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11238 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
11239 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
11240 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11241
11242 VkPipelineInputAssemblyStateCreateInfo iasci{
11243 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
11244 nullptr,
11245 0,
11246 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
11247 VK_FALSE};
11248
Chris Forbesb4cacb62016-04-04 19:15:00 +120011249 VkPipelineTessellationStateCreateInfo tsci{
11250 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
11251 nullptr,
11252 0,
11253 3};
11254
Chris Forbes4ea14fc2016-04-04 18:52:54 +120011255 VkPipelineObj pipe(m_device);
11256 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +120011257 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +120011258 pipe.AddColorAttachment();
11259 pipe.AddShader(&vs);
11260 pipe.AddShader(&tcs);
11261 pipe.AddShader(&tes);
11262 pipe.AddShader(&fs);
11263
11264 VkDescriptorSetObj descriptorSet(m_device);
11265 descriptorSet.AppendDummy();
11266 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11267
11268 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11269
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011270 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120011271}
11272
Chris Forbesa0ab8152016-04-20 13:34:27 +120011273TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
11274{
11275 m_errorMonitor->ExpectSuccess();
11276
11277 ASSERT_NO_FATAL_FAILURE(InitState());
11278 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11279
11280 if (!m_device->phy().features().geometryShader) {
11281 printf("Device does not support geometry shaders; skipped.\n");
11282 return;
11283 }
11284
11285 char const *vsSource =
11286 "#version 450\n"
11287 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
11288 "void main(){\n"
11289 " vs_out.x = vec4(1);\n"
11290 "}\n";
11291 char const *gsSource =
11292 "#version 450\n"
11293 "layout(triangles) in;\n"
11294 "layout(triangle_strip, max_vertices=3) out;\n"
11295 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
11296 "out gl_PerVertex { vec4 gl_Position; };\n"
11297 "void main() {\n"
11298 " gl_Position = gs_in[0].x;\n"
11299 " EmitVertex();\n"
11300 "}\n";
11301 char const *fsSource =
11302 "#version 450\n"
11303 "layout(location=0) out vec4 color;\n"
11304 "void main(){\n"
11305 " color = vec4(1);\n"
11306 "}\n";
11307
11308 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11309 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
11310 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11311
11312 VkPipelineObj pipe(m_device);
11313 pipe.AddColorAttachment();
11314 pipe.AddShader(&vs);
11315 pipe.AddShader(&gs);
11316 pipe.AddShader(&fs);
11317
11318 VkDescriptorSetObj descriptorSet(m_device);
11319 descriptorSet.AppendDummy();
11320 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11321
11322 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11323
11324 m_errorMonitor->VerifyNotFound();
11325}
11326
Chris Forbesa0193bc2016-04-04 19:19:47 +120011327TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
11328{
11329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11330 "is per-vertex in tessellation control shader stage "
11331 "but per-patch in tessellation evaluation shader stage");
11332
11333 ASSERT_NO_FATAL_FAILURE(InitState());
11334 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11335
Chris Forbesc1e852d2016-04-04 19:26:42 +120011336 if (!m_device->phy().features().tessellationShader) {
11337 printf("Device does not support tessellation shaders; skipped.\n");
11338 return;
11339 }
11340
Chris Forbesa0193bc2016-04-04 19:19:47 +120011341 char const *vsSource =
11342 "#version 450\n"
11343 "void main(){}\n";
11344 char const *tcsSource =
11345 "#version 450\n"
11346 "layout(location=0) out int x[];\n"
11347 "layout(vertices=3) out;\n"
11348 "void main(){\n"
11349 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
11350 " gl_TessLevelInner[0] = 1;\n"
11351 " x[gl_InvocationID] = gl_InvocationID;\n"
11352 "}\n";
11353 char const *tesSource =
11354 "#version 450\n"
11355 "layout(triangles, equal_spacing, cw) in;\n"
11356 "layout(location=0) patch in int x;\n"
11357 "out gl_PerVertex { vec4 gl_Position; };\n"
11358 "void main(){\n"
11359 " gl_Position.xyz = gl_TessCoord;\n"
11360 " gl_Position.w = x;\n"
11361 "}\n";
11362 char const *fsSource =
11363 "#version 450\n"
11364 "layout(location=0) out vec4 color;\n"
11365 "void main(){\n"
11366 " color = vec4(1);\n"
11367 "}\n";
11368
11369 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11370 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
11371 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
11372 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11373
11374 VkPipelineInputAssemblyStateCreateInfo iasci{
11375 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
11376 nullptr,
11377 0,
11378 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
11379 VK_FALSE};
11380
11381 VkPipelineTessellationStateCreateInfo tsci{
11382 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
11383 nullptr,
11384 0,
11385 3};
11386
11387 VkPipelineObj pipe(m_device);
11388 pipe.SetInputAssembly(&iasci);
11389 pipe.SetTessellation(&tsci);
11390 pipe.AddColorAttachment();
11391 pipe.AddShader(&vs);
11392 pipe.AddShader(&tcs);
11393 pipe.AddShader(&tes);
11394 pipe.AddShader(&fs);
11395
11396 VkDescriptorSetObj descriptorSet(m_device);
11397 descriptorSet.AppendDummy();
11398 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11399
11400 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11401
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011402 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120011403}
11404
Karl Schultz6addd812016-02-02 17:17:23 -070011405TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
11406 m_errorMonitor->SetDesiredFailureMsg(
11407 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011408 "Duplicate vertex input binding descriptions for binding 0");
11409
Chris Forbes280ba2c2015-06-12 11:16:41 +120011410 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060011411 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120011412
11413 /* Two binding descriptions for binding 0 */
11414 VkVertexInputBindingDescription input_bindings[2];
11415 memset(input_bindings, 0, sizeof(input_bindings));
11416
11417 VkVertexInputAttributeDescription input_attrib;
11418 memset(&input_attrib, 0, sizeof(input_attrib));
11419 input_attrib.format = VK_FORMAT_R32_SFLOAT;
11420
11421 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011422 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120011423 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070011424 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070011425 "out gl_PerVertex {\n"
11426 " vec4 gl_Position;\n"
11427 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120011428 "void main(){\n"
11429 " gl_Position = vec4(x);\n"
11430 "}\n";
11431 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011432 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120011433 "\n"
11434 "layout(location=0) out vec4 color;\n"
11435 "void main(){\n"
11436 " color = vec4(1);\n"
11437 "}\n";
11438
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060011439 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11440 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120011441
11442 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080011443 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120011444 pipe.AddShader(&vs);
11445 pipe.AddShader(&fs);
11446
11447 pipe.AddVertexInputBindings(input_bindings, 2);
11448 pipe.AddVertexInputAttribs(&input_attrib, 1);
11449
Chris Forbes280ba2c2015-06-12 11:16:41 +120011450 VkDescriptorSetObj descriptorSet(m_device);
11451 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011452 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120011453
Tony Barbour5781e8f2015-08-04 16:23:11 -060011454 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120011455
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011456 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120011457}
Chris Forbes8f68b562015-05-25 11:13:32 +120011458
Chris Forbes35efec72016-04-21 14:32:08 +120011459TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
11460 m_errorMonitor->ExpectSuccess();
11461
11462 ASSERT_NO_FATAL_FAILURE(InitState());
11463 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11464
Chris Forbes91cf3a82016-06-28 17:51:35 +120011465 if (!m_device->phy().features().shaderFloat64) {
Chris Forbes35efec72016-04-21 14:32:08 +120011466 printf("Device does not support 64bit vertex attributes; skipped.\n");
11467 return;
11468 }
11469
11470 VkVertexInputBindingDescription input_bindings[1];
11471 memset(input_bindings, 0, sizeof(input_bindings));
11472
11473 VkVertexInputAttributeDescription input_attribs[4];
11474 memset(input_attribs, 0, sizeof(input_attribs));
11475 input_attribs[0].location = 0;
11476 input_attribs[0].offset = 0;
11477 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
11478 input_attribs[1].location = 2;
11479 input_attribs[1].offset = 32;
11480 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
11481 input_attribs[2].location = 4;
11482 input_attribs[2].offset = 64;
11483 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
11484 input_attribs[3].location = 6;
11485 input_attribs[3].offset = 96;
11486 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
11487
11488 char const *vsSource =
11489 "#version 450\n"
11490 "\n"
11491 "layout(location=0) in dmat4 x;\n"
11492 "out gl_PerVertex {\n"
11493 " vec4 gl_Position;\n"
11494 "};\n"
11495 "void main(){\n"
11496 " gl_Position = vec4(x[0][0]);\n"
11497 "}\n";
11498 char const *fsSource =
11499 "#version 450\n"
11500 "\n"
11501 "layout(location=0) out vec4 color;\n"
11502 "void main(){\n"
11503 " color = vec4(1);\n"
11504 "}\n";
11505
11506 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11507 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11508
11509 VkPipelineObj pipe(m_device);
11510 pipe.AddColorAttachment();
11511 pipe.AddShader(&vs);
11512 pipe.AddShader(&fs);
11513
11514 pipe.AddVertexInputBindings(input_bindings, 1);
11515 pipe.AddVertexInputAttribs(input_attribs, 4);
11516
11517 VkDescriptorSetObj descriptorSet(m_device);
11518 descriptorSet.AppendDummy();
11519 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11520
11521 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11522
11523 m_errorMonitor->VerifyNotFound();
11524}
11525
Karl Schultz6addd812016-02-02 17:17:23 -070011526TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011528 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011529
Chris Forbes4d6d1e52015-05-25 11:13:40 +120011530 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120011531
11532 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011533 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120011534 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070011535 "out gl_PerVertex {\n"
11536 " vec4 gl_Position;\n"
11537 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120011538 "void main(){\n"
11539 " gl_Position = vec4(1);\n"
11540 "}\n";
11541 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011542 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120011543 "\n"
11544 "void main(){\n"
11545 "}\n";
11546
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060011547 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11548 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120011549
11550 VkPipelineObj pipe(m_device);
11551 pipe.AddShader(&vs);
11552 pipe.AddShader(&fs);
11553
Chia-I Wu08accc62015-07-07 11:50:03 +080011554 /* set up CB 0, not written */
11555 pipe.AddColorAttachment();
11556 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120011557
Chris Forbes4d6d1e52015-05-25 11:13:40 +120011558 VkDescriptorSetObj descriptorSet(m_device);
11559 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011560 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120011561
Tony Barbour5781e8f2015-08-04 16:23:11 -060011562 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120011563
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011564 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120011565}
11566
Karl Schultz6addd812016-02-02 17:17:23 -070011567TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -070011568 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070011569 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011570 "FS writes to output location 1 with no matching attachment");
11571
Chris Forbesf3fffaa2015-05-25 11:13:43 +120011572 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120011573
11574 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011575 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120011576 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070011577 "out gl_PerVertex {\n"
11578 " vec4 gl_Position;\n"
11579 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120011580 "void main(){\n"
11581 " gl_Position = vec4(1);\n"
11582 "}\n";
11583 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011584 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120011585 "\n"
11586 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -070011587 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +120011588 "void main(){\n"
11589 " x = vec4(1);\n"
11590 " y = vec4(1);\n"
11591 "}\n";
11592
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060011593 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11594 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120011595
11596 VkPipelineObj pipe(m_device);
11597 pipe.AddShader(&vs);
11598 pipe.AddShader(&fs);
11599
Chia-I Wu08accc62015-07-07 11:50:03 +080011600 /* set up CB 0, not written */
11601 pipe.AddColorAttachment();
11602 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120011603 /* FS writes CB 1, but we don't configure it */
11604
Chris Forbesf3fffaa2015-05-25 11:13:43 +120011605 VkDescriptorSetObj descriptorSet(m_device);
11606 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011607 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120011608
Tony Barbour5781e8f2015-08-04 16:23:11 -060011609 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120011610
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011611 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120011612}
11613
Karl Schultz6addd812016-02-02 17:17:23 -070011614TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011616 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011617
Chris Forbesa36d69e2015-05-25 11:13:44 +120011618 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120011619
11620 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011621 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120011622 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070011623 "out gl_PerVertex {\n"
11624 " vec4 gl_Position;\n"
11625 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120011626 "void main(){\n"
11627 " gl_Position = vec4(1);\n"
11628 "}\n";
11629 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011630 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120011631 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070011632 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +120011633 "void main(){\n"
11634 " x = ivec4(1);\n"
11635 "}\n";
11636
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060011637 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11638 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120011639
11640 VkPipelineObj pipe(m_device);
11641 pipe.AddShader(&vs);
11642 pipe.AddShader(&fs);
11643
Chia-I Wu08accc62015-07-07 11:50:03 +080011644 /* set up CB 0; type is UNORM by default */
11645 pipe.AddColorAttachment();
11646 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120011647
Chris Forbesa36d69e2015-05-25 11:13:44 +120011648 VkDescriptorSetObj descriptorSet(m_device);
11649 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011650 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120011651
Tony Barbour5781e8f2015-08-04 16:23:11 -060011652 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120011653
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011654 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120011655}
Chris Forbes7b1b8932015-06-05 14:43:36 +120011656
Karl Schultz6addd812016-02-02 17:17:23 -070011657TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011659 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011660
Chris Forbes556c76c2015-08-14 12:04:59 +120011661 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120011662
11663 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011664 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120011665 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070011666 "out gl_PerVertex {\n"
11667 " vec4 gl_Position;\n"
11668 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120011669 "void main(){\n"
11670 " gl_Position = vec4(1);\n"
11671 "}\n";
11672 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011673 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120011674 "\n"
11675 "layout(location=0) out vec4 x;\n"
11676 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
11677 "void main(){\n"
11678 " x = vec4(bar.y);\n"
11679 "}\n";
11680
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060011681 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11682 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120011683
Chris Forbes556c76c2015-08-14 12:04:59 +120011684 VkPipelineObj pipe(m_device);
11685 pipe.AddShader(&vs);
11686 pipe.AddShader(&fs);
11687
11688 /* set up CB 0; type is UNORM by default */
11689 pipe.AddColorAttachment();
11690 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11691
11692 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011693 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120011694
11695 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11696
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011697 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120011698}
11699
Chris Forbes5c59e902016-02-26 16:56:09 +130011700TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
11701 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11702 "not declared in layout");
11703
11704 ASSERT_NO_FATAL_FAILURE(InitState());
11705
11706 char const *vsSource =
11707 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130011708 "\n"
11709 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
11710 "out gl_PerVertex {\n"
11711 " vec4 gl_Position;\n"
11712 "};\n"
11713 "void main(){\n"
11714 " gl_Position = vec4(consts.x);\n"
11715 "}\n";
11716 char const *fsSource =
11717 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130011718 "\n"
11719 "layout(location=0) out vec4 x;\n"
11720 "void main(){\n"
11721 " x = vec4(1);\n"
11722 "}\n";
11723
11724 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11725 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11726
11727 VkPipelineObj pipe(m_device);
11728 pipe.AddShader(&vs);
11729 pipe.AddShader(&fs);
11730
11731 /* set up CB 0; type is UNORM by default */
11732 pipe.AddColorAttachment();
11733 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11734
11735 VkDescriptorSetObj descriptorSet(m_device);
11736 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11737
11738 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11739
11740 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011741 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130011742}
11743
Chris Forbes10eb9ae2016-05-31 16:09:42 +120011744TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
11745 m_errorMonitor->SetDesiredFailureMsg(
11746 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11747 "Shader uses descriptor slot 0.0");
11748
11749 ASSERT_NO_FATAL_FAILURE(InitState());
11750
11751 char const *csSource =
11752 "#version 450\n"
11753 "\n"
11754 "layout(local_size_x=1) in;\n"
11755 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
11756 "void main(){\n"
11757 " x = vec4(1);\n"
11758 "}\n";
11759
11760 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
11761
11762 VkDescriptorSetObj descriptorSet(m_device);
11763 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11764
11765 VkComputePipelineCreateInfo cpci = {
11766 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
11767 nullptr, 0, {
11768 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
11769 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
11770 cs.handle(), "main", nullptr
11771 },
11772 descriptorSet.GetPipelineLayout(),
11773 VK_NULL_HANDLE, -1
11774 };
11775
11776 VkPipeline pipe;
11777 VkResult err = vkCreateComputePipelines(
11778 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
11779
11780 m_errorMonitor->VerifyFound();
11781
11782 if (err == VK_SUCCESS) {
11783 vkDestroyPipeline(m_device->device(), pipe, nullptr);
11784 }
11785}
11786
11787TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
11788 m_errorMonitor->ExpectSuccess();
11789
11790 ASSERT_NO_FATAL_FAILURE(InitState());
11791
11792 char const *csSource =
11793 "#version 450\n"
11794 "\n"
11795 "layout(local_size_x=1) in;\n"
11796 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
11797 "void main(){\n"
11798 " // x is not used.\n"
11799 "}\n";
11800
11801 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
11802
11803 VkDescriptorSetObj descriptorSet(m_device);
11804 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11805
11806 VkComputePipelineCreateInfo cpci = {
11807 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
11808 nullptr, 0, {
11809 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
11810 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
11811 cs.handle(), "main", nullptr
11812 },
11813 descriptorSet.GetPipelineLayout(),
11814 VK_NULL_HANDLE, -1
11815 };
11816
11817 VkPipeline pipe;
11818 VkResult err = vkCreateComputePipelines(
11819 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
11820
11821 m_errorMonitor->VerifyNotFound();
11822
11823 if (err == VK_SUCCESS) {
11824 vkDestroyPipeline(m_device->device(), pipe, nullptr);
11825 }
11826}
11827
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011828#endif // SHADER_CHECKER_TESTS
11829
11830#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060011831TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -070011832 m_errorMonitor->SetDesiredFailureMsg(
11833 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011834 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060011835
11836 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060011837
11838 // Create an image
11839 VkImage image;
11840
Karl Schultz6addd812016-02-02 17:17:23 -070011841 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11842 const int32_t tex_width = 32;
11843 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060011844
11845 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011846 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11847 image_create_info.pNext = NULL;
11848 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11849 image_create_info.format = tex_format;
11850 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060011851 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070011852 image_create_info.extent.depth = 1;
11853 image_create_info.mipLevels = 1;
11854 image_create_info.arrayLayers = 1;
11855 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11856 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
11857 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
11858 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060011859
11860 // Introduce error by sending down a bogus width extent
11861 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011862 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060011863
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011864 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060011865}
11866
Mark Youngc48c4c12016-04-11 14:26:49 -060011867TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
11868 m_errorMonitor->SetDesiredFailureMsg(
11869 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11870 "CreateImage extents is 0 for at least one required dimension");
11871
11872 ASSERT_NO_FATAL_FAILURE(InitState());
11873
11874 // Create an image
11875 VkImage image;
11876
11877 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11878 const int32_t tex_width = 32;
11879 const int32_t tex_height = 32;
11880
11881 VkImageCreateInfo image_create_info = {};
11882 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11883 image_create_info.pNext = NULL;
11884 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11885 image_create_info.format = tex_format;
11886 image_create_info.extent.width = tex_width;
11887 image_create_info.extent.height = tex_height;
11888 image_create_info.extent.depth = 1;
11889 image_create_info.mipLevels = 1;
11890 image_create_info.arrayLayers = 1;
11891 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11892 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
11893 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
11894 image_create_info.flags = 0;
11895
11896 // Introduce error by sending down a bogus width extent
11897 image_create_info.extent.width = 0;
11898 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
11899
11900 m_errorMonitor->VerifyFound();
11901}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011902#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120011903
Tobin Ehliscde08892015-09-22 10:11:37 -060011904#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070011905TEST_F(VkLayerTest, InvalidImageView) {
11906 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060011907
Karl Schultz6addd812016-02-02 17:17:23 -070011908 m_errorMonitor->SetDesiredFailureMsg(
11909 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011910 "vkCreateImageView called with baseMipLevel 10 ");
11911
Tobin Ehliscde08892015-09-22 10:11:37 -060011912 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060011913
Mike Stroyana3082432015-09-25 13:39:21 -060011914 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070011915 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060011916
Karl Schultz6addd812016-02-02 17:17:23 -070011917 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11918 const int32_t tex_width = 32;
11919 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060011920
11921 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011922 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11923 image_create_info.pNext = NULL;
11924 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11925 image_create_info.format = tex_format;
11926 image_create_info.extent.width = tex_width;
11927 image_create_info.extent.height = tex_height;
11928 image_create_info.extent.depth = 1;
11929 image_create_info.mipLevels = 1;
11930 image_create_info.arrayLayers = 1;
11931 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11932 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
11933 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
11934 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060011935
Chia-I Wuf7458c52015-10-26 21:10:41 +080011936 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060011937 ASSERT_VK_SUCCESS(err);
11938
11939 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011940 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11941 image_view_create_info.image = image;
11942 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
11943 image_view_create_info.format = tex_format;
11944 image_view_create_info.subresourceRange.layerCount = 1;
11945 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
11946 image_view_create_info.subresourceRange.levelCount = 1;
11947 image_view_create_info.subresourceRange.aspectMask =
11948 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060011949
11950 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070011951 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
11952 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060011953
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011954 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060011955 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060011956}
Mike Stroyana3082432015-09-25 13:39:21 -060011957
Karl Schultz6addd812016-02-02 17:17:23 -070011958TEST_F(VkLayerTest, InvalidImageViewAspect) {
Tobin Ehlis1f567a22016-05-25 16:15:18 -060011959 TEST_DESCRIPTION(
11960 "Create an image and try to create a view with an invalid aspectMask");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011962 "vkCreateImageView: Color image "
11963 "formats must have ONLY the "
11964 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011965
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060011966 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060011967
Karl Schultz6addd812016-02-02 17:17:23 -070011968 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060011969 VkImageObj image(m_device);
11970 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT,
11971 VK_IMAGE_TILING_LINEAR, 0);
11972 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060011973
11974 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011975 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060011976 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070011977 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
11978 image_view_create_info.format = tex_format;
11979 image_view_create_info.subresourceRange.baseMipLevel = 0;
11980 image_view_create_info.subresourceRange.levelCount = 1;
11981 // Cause an error by setting an invalid image aspect
11982 image_view_create_info.subresourceRange.aspectMask =
11983 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060011984
11985 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060011986 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060011987
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011988 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060011989}
11990
Mark Lobodzinskidb117632016-03-31 10:45:56 -060011991TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070011992 VkResult err;
11993 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060011994
Karl Schultz6addd812016-02-02 17:17:23 -070011995 m_errorMonitor->SetDesiredFailureMsg(
11996 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060011997 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011998
Mike Stroyana3082432015-09-25 13:39:21 -060011999 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060012000
12001 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070012002 VkImage srcImage;
12003 VkImage dstImage;
12004 VkDeviceMemory srcMem;
12005 VkDeviceMemory destMem;
12006 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060012007
12008 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012009 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12010 image_create_info.pNext = NULL;
12011 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12012 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
12013 image_create_info.extent.width = 32;
12014 image_create_info.extent.height = 32;
12015 image_create_info.extent.depth = 1;
12016 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060012017 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070012018 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12019 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12020 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
12021 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012022
Karl Schultz6addd812016-02-02 17:17:23 -070012023 err =
12024 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060012025 ASSERT_VK_SUCCESS(err);
12026
Karl Schultz6addd812016-02-02 17:17:23 -070012027 err =
12028 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060012029 ASSERT_VK_SUCCESS(err);
12030
12031 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012032 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012033 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12034 memAlloc.pNext = NULL;
12035 memAlloc.allocationSize = 0;
12036 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012037
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060012038 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060012039 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070012040 pass =
12041 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060012042 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012043 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060012044 ASSERT_VK_SUCCESS(err);
12045
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012046 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060012047 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070012048 pass =
12049 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060012050 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012051 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060012052 ASSERT_VK_SUCCESS(err);
12053
12054 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
12055 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012056 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060012057 ASSERT_VK_SUCCESS(err);
12058
12059 BeginCommandBuffer();
12060 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080012061 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060012062 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060012063 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060012064 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060012065 copyRegion.srcOffset.x = 0;
12066 copyRegion.srcOffset.y = 0;
12067 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080012068 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012069 copyRegion.dstSubresource.mipLevel = 0;
12070 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060012071 // Introduce failure by forcing the dst layerCount to differ from src
12072 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012073 copyRegion.dstOffset.x = 0;
12074 copyRegion.dstOffset.y = 0;
12075 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012076 copyRegion.extent.width = 1;
12077 copyRegion.extent.height = 1;
12078 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070012079 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
12080 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060012081 EndCommandBuffer();
12082
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012083 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060012084
Chia-I Wuf7458c52015-10-26 21:10:41 +080012085 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012086 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080012087 vkFreeMemory(m_device->device(), srcMem, NULL);
12088 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060012089}
12090
Tony Barbourd6673642016-05-05 14:46:39 -060012091TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
12092
12093 TEST_DESCRIPTION("Creating images with unsuported formats ");
12094
12095 ASSERT_NO_FATAL_FAILURE(InitState());
12096 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12097 VkImageObj image(m_device);
12098 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
12099 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
12100 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
12101 VK_IMAGE_TILING_OPTIMAL, 0);
12102 ASSERT_TRUE(image.initialized());
12103
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060012104 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
12105 VkImageCreateInfo image_create_info;
12106 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12107 image_create_info.pNext = NULL;
12108 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12109 image_create_info.format = VK_FORMAT_UNDEFINED;
12110 image_create_info.extent.width = 32;
12111 image_create_info.extent.height = 32;
12112 image_create_info.extent.depth = 1;
12113 image_create_info.mipLevels = 1;
12114 image_create_info.arrayLayers = 1;
12115 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12116 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12117 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
12118 image_create_info.flags = 0;
12119
12120 m_errorMonitor->SetDesiredFailureMsg(
12121 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12122 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
12123
12124 VkImage localImage;
12125 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
12126 m_errorMonitor->VerifyFound();
12127
Tony Barbourd6673642016-05-05 14:46:39 -060012128 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060012129 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060012130 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
12131 VkFormat format = static_cast<VkFormat>(f);
12132 VkFormatProperties fProps = m_device->format_properties(format);
12133 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
12134 fProps.optimalTilingFeatures == 0) {
12135 unsupported = format;
12136 break;
12137 }
12138 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060012139
Tony Barbourd6673642016-05-05 14:46:39 -060012140 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060012141 image_create_info.format = unsupported;
Tony Barbourd6673642016-05-05 14:46:39 -060012142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060012143 "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060012144
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060012145 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060012146 m_errorMonitor->VerifyFound();
12147 }
12148}
12149
12150TEST_F(VkLayerTest, ImageLayerViewTests) {
12151 VkResult ret;
12152 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
12153
12154 ASSERT_NO_FATAL_FAILURE(InitState());
12155
12156 VkImageObj image(m_device);
12157 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
12158 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
12159 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
12160 VK_IMAGE_TILING_OPTIMAL, 0);
12161 ASSERT_TRUE(image.initialized());
12162
12163 VkImageView imgView;
12164 VkImageViewCreateInfo imgViewInfo = {};
12165 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12166 imgViewInfo.image = image.handle();
12167 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
12168 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
12169 imgViewInfo.subresourceRange.layerCount = 1;
12170 imgViewInfo.subresourceRange.baseMipLevel = 0;
12171 imgViewInfo.subresourceRange.levelCount = 1;
12172 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12173
12174 m_errorMonitor->SetDesiredFailureMsg(
12175 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12176 "vkCreateImageView called with baseMipLevel");
12177 // View can't have baseMipLevel >= image's mipLevels - Expect
12178 // VIEW_CREATE_ERROR
12179 imgViewInfo.subresourceRange.baseMipLevel = 1;
12180 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
12181 m_errorMonitor->VerifyFound();
12182 imgViewInfo.subresourceRange.baseMipLevel = 0;
12183
12184 m_errorMonitor->SetDesiredFailureMsg(
12185 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12186 "vkCreateImageView called with baseArrayLayer");
12187 // View can't have baseArrayLayer >= image's arraySize - Expect
12188 // VIEW_CREATE_ERROR
12189 imgViewInfo.subresourceRange.baseArrayLayer = 1;
12190 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
12191 m_errorMonitor->VerifyFound();
12192 imgViewInfo.subresourceRange.baseArrayLayer = 0;
12193
12194 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12195 "vkCreateImageView called with 0 in "
12196 "pCreateInfo->subresourceRange."
12197 "levelCount");
12198 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
12199 imgViewInfo.subresourceRange.levelCount = 0;
12200 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
12201 m_errorMonitor->VerifyFound();
12202 imgViewInfo.subresourceRange.levelCount = 1;
12203
12204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12205 "vkCreateImageView called with 0 in "
12206 "pCreateInfo->subresourceRange."
12207 "layerCount");
12208 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
12209 imgViewInfo.subresourceRange.layerCount = 0;
12210 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
12211 m_errorMonitor->VerifyFound();
12212 imgViewInfo.subresourceRange.layerCount = 1;
12213
12214 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12215 "but both must be color formats");
12216 // Can't use depth format for view into color image - Expect INVALID_FORMAT
12217 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
12218 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
12219 m_errorMonitor->VerifyFound();
12220 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
12221
12222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12223 "Formats MUST be IDENTICAL unless "
12224 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
12225 "was set on image creation.");
12226 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
12227 // VIEW_CREATE_ERROR
12228 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
12229 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
12230 m_errorMonitor->VerifyFound();
12231 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
12232
12233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12234 "can support ImageViews with "
12235 "differing formats but they must be "
12236 "in the same compatibility class.");
12237 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
12238 // VIEW_CREATE_ERROR
12239 VkImageCreateInfo mutImgInfo = image.create_info();
12240 VkImage mutImage;
12241 mutImgInfo.format = VK_FORMAT_R8_UINT;
12242 assert(
12243 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
12244 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
12245 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
12246 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
12247 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
12248 ASSERT_VK_SUCCESS(ret);
12249 imgViewInfo.image = mutImage;
12250 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
12251 m_errorMonitor->VerifyFound();
12252 imgViewInfo.image = image.handle();
12253 vkDestroyImage(m_device->handle(), mutImage, NULL);
12254}
12255
12256TEST_F(VkLayerTest, MiscImageLayerTests) {
12257
12258 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
12259
12260 ASSERT_NO_FATAL_FAILURE(InitState());
12261
12262 VkImageObj image(m_device);
12263 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
12264 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
12265 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
12266 VK_IMAGE_TILING_OPTIMAL, 0);
12267 ASSERT_TRUE(image.initialized());
12268
12269 m_errorMonitor->SetDesiredFailureMsg(
12270 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12271 "number of layers in image subresource is zero");
12272 vk_testing::Buffer buffer;
12273 VkMemoryPropertyFlags reqs = 0;
12274 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
12275 VkBufferImageCopy region = {};
12276 region.bufferRowLength = 128;
12277 region.bufferImageHeight = 128;
12278 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12279 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
12280 region.imageSubresource.layerCount = 0;
12281 region.imageExtent.height = 4;
12282 region.imageExtent.width = 4;
12283 region.imageExtent.depth = 1;
12284 m_commandBuffer->BeginCommandBuffer();
12285 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
12286 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
12287 1, &region);
12288 m_errorMonitor->VerifyFound();
12289 region.imageSubresource.layerCount = 1;
12290
12291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12292 "aspectMasks for each region must "
12293 "specify only COLOR or DEPTH or "
12294 "STENCIL");
12295 // Expect MISMATCHED_IMAGE_ASPECT
12296 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
12297 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
12298 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
12299 1, &region);
12300 m_errorMonitor->VerifyFound();
12301 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12302
12303 m_errorMonitor->SetDesiredFailureMsg(
12304 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12305 "If the format of srcImage is a depth, stencil, depth stencil or "
12306 "integer-based format then filter must be VK_FILTER_NEAREST");
12307 // Expect INVALID_FILTER
12308 VkImageObj intImage1(m_device);
12309 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
12310 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
12311 0);
12312 VkImageObj intImage2(m_device);
12313 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
12314 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
12315 0);
12316 VkImageBlit blitRegion = {};
12317 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12318 blitRegion.srcSubresource.baseArrayLayer = 0;
12319 blitRegion.srcSubresource.layerCount = 1;
12320 blitRegion.srcSubresource.mipLevel = 0;
12321 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12322 blitRegion.dstSubresource.baseArrayLayer = 0;
12323 blitRegion.dstSubresource.layerCount = 1;
12324 blitRegion.dstSubresource.mipLevel = 0;
12325
12326 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
12327 intImage1.layout(), intImage2.handle(), intImage2.layout(),
12328 16, &blitRegion, VK_FILTER_LINEAR);
12329 m_errorMonitor->VerifyFound();
12330
12331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12332 "called with 0 in ppMemoryBarriers");
12333 VkImageMemoryBarrier img_barrier;
12334 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12335 img_barrier.pNext = NULL;
12336 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
12337 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
12338 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12339 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12340 img_barrier.image = image.handle();
12341 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
12342 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
12343 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12344 img_barrier.subresourceRange.baseArrayLayer = 0;
12345 img_barrier.subresourceRange.baseMipLevel = 0;
12346 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
12347 img_barrier.subresourceRange.layerCount = 0;
12348 img_barrier.subresourceRange.levelCount = 1;
12349 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
12350 VK_PIPELINE_STAGE_HOST_BIT,
12351 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
12352 nullptr, 1, &img_barrier);
12353 m_errorMonitor->VerifyFound();
12354 img_barrier.subresourceRange.layerCount = 1;
12355}
12356
12357TEST_F(VkLayerTest, ImageFormatLimits) {
12358
12359 TEST_DESCRIPTION("Exceed the limits of image format ");
12360
12361 m_errorMonitor->SetDesiredFailureMsg(
12362 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12363 "CreateImage extents exceed allowable limits for format");
12364 VkImageCreateInfo image_create_info = {};
12365 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12366 image_create_info.pNext = NULL;
12367 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12368 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
12369 image_create_info.extent.width = 32;
12370 image_create_info.extent.height = 32;
12371 image_create_info.extent.depth = 1;
12372 image_create_info.mipLevels = 1;
12373 image_create_info.arrayLayers = 1;
12374 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12375 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
12376 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
12377 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
12378 image_create_info.flags = 0;
12379
12380 VkImage nullImg;
12381 VkImageFormatProperties imgFmtProps;
12382 vkGetPhysicalDeviceImageFormatProperties(
12383 gpu(), image_create_info.format, image_create_info.imageType,
12384 image_create_info.tiling, image_create_info.usage,
12385 image_create_info.flags, &imgFmtProps);
12386 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
12387 // Expect INVALID_FORMAT_LIMITS_VIOLATION
12388 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
12389 m_errorMonitor->VerifyFound();
12390 image_create_info.extent.depth = 1;
12391
12392 m_errorMonitor->SetDesiredFailureMsg(
12393 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12394 "exceeds allowable maximum supported by format of");
12395 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
12396 // Expect INVALID_FORMAT_LIMITS_VIOLATION
12397 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
12398 m_errorMonitor->VerifyFound();
12399 image_create_info.mipLevels = 1;
12400
12401 m_errorMonitor->SetDesiredFailureMsg(
12402 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12403 "exceeds allowable maximum supported by format of");
12404 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
12405 // Expect INVALID_FORMAT_LIMITS_VIOLATION
12406 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
12407 m_errorMonitor->VerifyFound();
12408 image_create_info.arrayLayers = 1;
12409
12410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12411 "is not supported by format");
12412 int samples = imgFmtProps.sampleCounts >> 1;
12413 image_create_info.samples = (VkSampleCountFlagBits)samples;
12414 // Expect INVALID_FORMAT_LIMITS_VIOLATION
12415 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
12416 m_errorMonitor->VerifyFound();
12417 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12418
12419 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12420 "pCreateInfo->initialLayout, must be "
12421 "VK_IMAGE_LAYOUT_UNDEFINED or "
12422 "VK_IMAGE_LAYOUT_PREINITIALIZED");
12423 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12424 // Expect INVALID_LAYOUT
12425 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
12426 m_errorMonitor->VerifyFound();
12427 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
12428}
12429
Karl Schultz6addd812016-02-02 17:17:23 -070012430TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060012431 VkResult err;
12432 bool pass;
12433
12434 // Create color images with different format sizes and try to copy between them
12435 m_errorMonitor->SetDesiredFailureMsg(
12436 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12437 "vkCmdCopyImage called with unmatched source and dest image format sizes");
12438
12439 ASSERT_NO_FATAL_FAILURE(InitState());
12440
12441 // Create two images of different types and try to copy between them
12442 VkImage srcImage;
12443 VkImage dstImage;
12444 VkDeviceMemory srcMem;
12445 VkDeviceMemory destMem;
12446 VkMemoryRequirements memReqs;
12447
12448 VkImageCreateInfo image_create_info = {};
12449 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12450 image_create_info.pNext = NULL;
12451 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12452 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
12453 image_create_info.extent.width = 32;
12454 image_create_info.extent.height = 32;
12455 image_create_info.extent.depth = 1;
12456 image_create_info.mipLevels = 1;
12457 image_create_info.arrayLayers = 1;
12458 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12459 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
12460 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
12461 image_create_info.flags = 0;
12462
12463 err =
12464 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
12465 ASSERT_VK_SUCCESS(err);
12466
12467 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
12468 // Introduce failure by creating second image with a different-sized format.
12469 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
12470
12471 err =
12472 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
12473 ASSERT_VK_SUCCESS(err);
12474
12475 // Allocate memory
12476 VkMemoryAllocateInfo memAlloc = {};
12477 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12478 memAlloc.pNext = NULL;
12479 memAlloc.allocationSize = 0;
12480 memAlloc.memoryTypeIndex = 0;
12481
12482 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
12483 memAlloc.allocationSize = memReqs.size;
12484 pass =
12485 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
12486 ASSERT_TRUE(pass);
12487 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
12488 ASSERT_VK_SUCCESS(err);
12489
12490 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
12491 memAlloc.allocationSize = memReqs.size;
12492 pass =
12493 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
12494 ASSERT_TRUE(pass);
12495 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
12496 ASSERT_VK_SUCCESS(err);
12497
12498 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
12499 ASSERT_VK_SUCCESS(err);
12500 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
12501 ASSERT_VK_SUCCESS(err);
12502
12503 BeginCommandBuffer();
12504 VkImageCopy copyRegion;
12505 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12506 copyRegion.srcSubresource.mipLevel = 0;
12507 copyRegion.srcSubresource.baseArrayLayer = 0;
12508 copyRegion.srcSubresource.layerCount = 0;
12509 copyRegion.srcOffset.x = 0;
12510 copyRegion.srcOffset.y = 0;
12511 copyRegion.srcOffset.z = 0;
12512 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12513 copyRegion.dstSubresource.mipLevel = 0;
12514 copyRegion.dstSubresource.baseArrayLayer = 0;
12515 copyRegion.dstSubresource.layerCount = 0;
12516 copyRegion.dstOffset.x = 0;
12517 copyRegion.dstOffset.y = 0;
12518 copyRegion.dstOffset.z = 0;
12519 copyRegion.extent.width = 1;
12520 copyRegion.extent.height = 1;
12521 copyRegion.extent.depth = 1;
12522 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
12523 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12524 EndCommandBuffer();
12525
12526 m_errorMonitor->VerifyFound();
12527
12528 vkDestroyImage(m_device->device(), srcImage, NULL);
12529 vkDestroyImage(m_device->device(), dstImage, NULL);
12530 vkFreeMemory(m_device->device(), srcMem, NULL);
12531 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060012532}
12533
Karl Schultz6addd812016-02-02 17:17:23 -070012534TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
12535 VkResult err;
12536 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060012537
Mark Lobodzinskidb117632016-03-31 10:45:56 -060012538 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070012539 m_errorMonitor->SetDesiredFailureMsg(
12540 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060012541 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012542
Mike Stroyana3082432015-09-25 13:39:21 -060012543 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060012544
12545 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070012546 VkImage srcImage;
12547 VkImage dstImage;
12548 VkDeviceMemory srcMem;
12549 VkDeviceMemory destMem;
12550 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060012551
12552 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012553 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12554 image_create_info.pNext = NULL;
12555 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12556 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
12557 image_create_info.extent.width = 32;
12558 image_create_info.extent.height = 32;
12559 image_create_info.extent.depth = 1;
12560 image_create_info.mipLevels = 1;
12561 image_create_info.arrayLayers = 1;
12562 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12563 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
12564 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
12565 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012566
Karl Schultz6addd812016-02-02 17:17:23 -070012567 err =
12568 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060012569 ASSERT_VK_SUCCESS(err);
12570
Karl Schultzbdb75952016-04-19 11:36:49 -060012571 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
12572
Mark Lobodzinskidb117632016-03-31 10:45:56 -060012573 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070012574 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060012575 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
12576 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060012577
Karl Schultz6addd812016-02-02 17:17:23 -070012578 err =
12579 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060012580 ASSERT_VK_SUCCESS(err);
12581
12582 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012583 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012584 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12585 memAlloc.pNext = NULL;
12586 memAlloc.allocationSize = 0;
12587 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012588
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060012589 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060012590 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070012591 pass =
12592 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060012593 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012594 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060012595 ASSERT_VK_SUCCESS(err);
12596
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012597 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060012598 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070012599 pass =
12600 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060012601 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012602 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060012603 ASSERT_VK_SUCCESS(err);
12604
12605 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
12606 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012607 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060012608 ASSERT_VK_SUCCESS(err);
12609
12610 BeginCommandBuffer();
12611 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080012612 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060012613 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060012614 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012615 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012616 copyRegion.srcOffset.x = 0;
12617 copyRegion.srcOffset.y = 0;
12618 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080012619 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012620 copyRegion.dstSubresource.mipLevel = 0;
12621 copyRegion.dstSubresource.baseArrayLayer = 0;
12622 copyRegion.dstSubresource.layerCount = 0;
12623 copyRegion.dstOffset.x = 0;
12624 copyRegion.dstOffset.y = 0;
12625 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012626 copyRegion.extent.width = 1;
12627 copyRegion.extent.height = 1;
12628 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070012629 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
12630 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060012631 EndCommandBuffer();
12632
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012633 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060012634
Chia-I Wuf7458c52015-10-26 21:10:41 +080012635 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012636 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080012637 vkFreeMemory(m_device->device(), srcMem, NULL);
12638 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060012639}
12640
Karl Schultz6addd812016-02-02 17:17:23 -070012641TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
12642 VkResult err;
12643 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060012644
Karl Schultz6addd812016-02-02 17:17:23 -070012645 m_errorMonitor->SetDesiredFailureMsg(
12646 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012647 "vkCmdResolveImage called with source sample count less than 2.");
12648
Mike Stroyana3082432015-09-25 13:39:21 -060012649 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060012650
12651 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070012652 VkImage srcImage;
12653 VkImage dstImage;
12654 VkDeviceMemory srcMem;
12655 VkDeviceMemory destMem;
12656 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060012657
12658 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012659 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12660 image_create_info.pNext = NULL;
12661 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12662 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
12663 image_create_info.extent.width = 32;
12664 image_create_info.extent.height = 1;
12665 image_create_info.extent.depth = 1;
12666 image_create_info.mipLevels = 1;
12667 image_create_info.arrayLayers = 1;
12668 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12669 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12670 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
12671 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012672
Karl Schultz6addd812016-02-02 17:17:23 -070012673 err =
12674 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060012675 ASSERT_VK_SUCCESS(err);
12676
Karl Schultz6addd812016-02-02 17:17:23 -070012677 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060012678
Karl Schultz6addd812016-02-02 17:17:23 -070012679 err =
12680 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060012681 ASSERT_VK_SUCCESS(err);
12682
12683 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012684 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012685 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12686 memAlloc.pNext = NULL;
12687 memAlloc.allocationSize = 0;
12688 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012689
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060012690 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060012691 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070012692 pass =
12693 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060012694 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012695 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060012696 ASSERT_VK_SUCCESS(err);
12697
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012698 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060012699 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070012700 pass =
12701 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060012702 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012703 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060012704 ASSERT_VK_SUCCESS(err);
12705
12706 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
12707 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012708 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060012709 ASSERT_VK_SUCCESS(err);
12710
12711 BeginCommandBuffer();
12712 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070012713 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
12714 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060012715 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080012716 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060012717 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060012718 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012719 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012720 resolveRegion.srcOffset.x = 0;
12721 resolveRegion.srcOffset.y = 0;
12722 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080012723 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012724 resolveRegion.dstSubresource.mipLevel = 0;
12725 resolveRegion.dstSubresource.baseArrayLayer = 0;
12726 resolveRegion.dstSubresource.layerCount = 0;
12727 resolveRegion.dstOffset.x = 0;
12728 resolveRegion.dstOffset.y = 0;
12729 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012730 resolveRegion.extent.width = 1;
12731 resolveRegion.extent.height = 1;
12732 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070012733 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
12734 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060012735 EndCommandBuffer();
12736
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012737 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060012738
Chia-I Wuf7458c52015-10-26 21:10:41 +080012739 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012740 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080012741 vkFreeMemory(m_device->device(), srcMem, NULL);
12742 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060012743}
12744
Karl Schultz6addd812016-02-02 17:17:23 -070012745TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
12746 VkResult err;
12747 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060012748
Karl Schultz6addd812016-02-02 17:17:23 -070012749 m_errorMonitor->SetDesiredFailureMsg(
12750 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012751 "vkCmdResolveImage called with dest sample count greater than 1.");
12752
Mike Stroyana3082432015-09-25 13:39:21 -060012753 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060012754
Chris Forbesa7530692016-05-08 12:35:39 +120012755 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070012756 VkImage srcImage;
12757 VkImage dstImage;
12758 VkDeviceMemory srcMem;
12759 VkDeviceMemory destMem;
12760 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060012761
12762 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012763 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12764 image_create_info.pNext = NULL;
12765 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12766 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
12767 image_create_info.extent.width = 32;
12768 image_create_info.extent.height = 1;
12769 image_create_info.extent.depth = 1;
12770 image_create_info.mipLevels = 1;
12771 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120012772 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070012773 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12774 // Note: Some implementations expect color attachment usage for any
12775 // multisample surface
12776 image_create_info.usage =
12777 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
12778 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012779
Karl Schultz6addd812016-02-02 17:17:23 -070012780 err =
12781 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060012782 ASSERT_VK_SUCCESS(err);
12783
Karl Schultz6addd812016-02-02 17:17:23 -070012784 // Note: Some implementations expect color attachment usage for any
12785 // multisample surface
12786 image_create_info.usage =
12787 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060012788
Karl Schultz6addd812016-02-02 17:17:23 -070012789 err =
12790 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060012791 ASSERT_VK_SUCCESS(err);
12792
12793 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012794 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012795 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12796 memAlloc.pNext = NULL;
12797 memAlloc.allocationSize = 0;
12798 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012799
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060012800 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060012801 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070012802 pass =
12803 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060012804 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012805 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060012806 ASSERT_VK_SUCCESS(err);
12807
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012808 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060012809 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070012810 pass =
12811 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060012812 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012813 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060012814 ASSERT_VK_SUCCESS(err);
12815
12816 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
12817 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012818 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060012819 ASSERT_VK_SUCCESS(err);
12820
12821 BeginCommandBuffer();
12822 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070012823 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
12824 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060012825 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080012826 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060012827 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060012828 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012829 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012830 resolveRegion.srcOffset.x = 0;
12831 resolveRegion.srcOffset.y = 0;
12832 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080012833 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012834 resolveRegion.dstSubresource.mipLevel = 0;
12835 resolveRegion.dstSubresource.baseArrayLayer = 0;
12836 resolveRegion.dstSubresource.layerCount = 0;
12837 resolveRegion.dstOffset.x = 0;
12838 resolveRegion.dstOffset.y = 0;
12839 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012840 resolveRegion.extent.width = 1;
12841 resolveRegion.extent.height = 1;
12842 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070012843 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
12844 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060012845 EndCommandBuffer();
12846
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012847 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060012848
Chia-I Wuf7458c52015-10-26 21:10:41 +080012849 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012850 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080012851 vkFreeMemory(m_device->device(), srcMem, NULL);
12852 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060012853}
12854
Karl Schultz6addd812016-02-02 17:17:23 -070012855TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
12856 VkResult err;
12857 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060012858
Karl Schultz6addd812016-02-02 17:17:23 -070012859 m_errorMonitor->SetDesiredFailureMsg(
12860 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012861 "vkCmdResolveImage called with unmatched source and dest formats.");
12862
Mike Stroyana3082432015-09-25 13:39:21 -060012863 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060012864
12865 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070012866 VkImage srcImage;
12867 VkImage dstImage;
12868 VkDeviceMemory srcMem;
12869 VkDeviceMemory destMem;
12870 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060012871
12872 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012873 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12874 image_create_info.pNext = NULL;
12875 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12876 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
12877 image_create_info.extent.width = 32;
12878 image_create_info.extent.height = 1;
12879 image_create_info.extent.depth = 1;
12880 image_create_info.mipLevels = 1;
12881 image_create_info.arrayLayers = 1;
12882 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
12883 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12884 // Note: Some implementations expect color attachment usage for any
12885 // multisample surface
12886 image_create_info.usage =
12887 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
12888 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012889
Karl Schultz6addd812016-02-02 17:17:23 -070012890 err =
12891 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060012892 ASSERT_VK_SUCCESS(err);
12893
Karl Schultz6addd812016-02-02 17:17:23 -070012894 // Set format to something other than source image
12895 image_create_info.format = VK_FORMAT_R32_SFLOAT;
12896 // Note: Some implementations expect color attachment usage for any
12897 // multisample surface
12898 image_create_info.usage =
12899 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
12900 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060012901
Karl Schultz6addd812016-02-02 17:17:23 -070012902 err =
12903 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060012904 ASSERT_VK_SUCCESS(err);
12905
12906 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012907 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012908 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12909 memAlloc.pNext = NULL;
12910 memAlloc.allocationSize = 0;
12911 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012912
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060012913 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060012914 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070012915 pass =
12916 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060012917 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012918 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060012919 ASSERT_VK_SUCCESS(err);
12920
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012921 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060012922 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070012923 pass =
12924 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060012925 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012926 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060012927 ASSERT_VK_SUCCESS(err);
12928
12929 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
12930 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012931 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060012932 ASSERT_VK_SUCCESS(err);
12933
12934 BeginCommandBuffer();
12935 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070012936 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
12937 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060012938 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080012939 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060012940 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060012941 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012942 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012943 resolveRegion.srcOffset.x = 0;
12944 resolveRegion.srcOffset.y = 0;
12945 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080012946 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012947 resolveRegion.dstSubresource.mipLevel = 0;
12948 resolveRegion.dstSubresource.baseArrayLayer = 0;
12949 resolveRegion.dstSubresource.layerCount = 0;
12950 resolveRegion.dstOffset.x = 0;
12951 resolveRegion.dstOffset.y = 0;
12952 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060012953 resolveRegion.extent.width = 1;
12954 resolveRegion.extent.height = 1;
12955 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070012956 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
12957 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060012958 EndCommandBuffer();
12959
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012960 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060012961
Chia-I Wuf7458c52015-10-26 21:10:41 +080012962 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012963 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080012964 vkFreeMemory(m_device->device(), srcMem, NULL);
12965 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060012966}
12967
Karl Schultz6addd812016-02-02 17:17:23 -070012968TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
12969 VkResult err;
12970 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060012971
Karl Schultz6addd812016-02-02 17:17:23 -070012972 m_errorMonitor->SetDesiredFailureMsg(
12973 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012974 "vkCmdResolveImage called with unmatched source and dest image types.");
12975
Mike Stroyana3082432015-09-25 13:39:21 -060012976 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060012977
12978 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070012979 VkImage srcImage;
12980 VkImage dstImage;
12981 VkDeviceMemory srcMem;
12982 VkDeviceMemory destMem;
12983 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060012984
12985 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012986 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12987 image_create_info.pNext = NULL;
12988 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12989 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
12990 image_create_info.extent.width = 32;
12991 image_create_info.extent.height = 1;
12992 image_create_info.extent.depth = 1;
12993 image_create_info.mipLevels = 1;
12994 image_create_info.arrayLayers = 1;
12995 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
12996 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12997 // Note: Some implementations expect color attachment usage for any
12998 // multisample surface
12999 image_create_info.usage =
13000 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
13001 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013002
Karl Schultz6addd812016-02-02 17:17:23 -070013003 err =
13004 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013005 ASSERT_VK_SUCCESS(err);
13006
Karl Schultz6addd812016-02-02 17:17:23 -070013007 image_create_info.imageType = VK_IMAGE_TYPE_1D;
13008 // Note: Some implementations expect color attachment usage for any
13009 // multisample surface
13010 image_create_info.usage =
13011 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
13012 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060013013
Karl Schultz6addd812016-02-02 17:17:23 -070013014 err =
13015 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013016 ASSERT_VK_SUCCESS(err);
13017
13018 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013019 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013020 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13021 memAlloc.pNext = NULL;
13022 memAlloc.allocationSize = 0;
13023 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013024
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060013025 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060013026 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070013027 pass =
13028 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060013029 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013030 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060013031 ASSERT_VK_SUCCESS(err);
13032
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013033 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060013034 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070013035 pass =
13036 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060013037 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013038 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060013039 ASSERT_VK_SUCCESS(err);
13040
13041 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
13042 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013043 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060013044 ASSERT_VK_SUCCESS(err);
13045
13046 BeginCommandBuffer();
13047 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070013048 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
13049 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060013050 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080013051 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060013052 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060013053 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013054 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013055 resolveRegion.srcOffset.x = 0;
13056 resolveRegion.srcOffset.y = 0;
13057 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080013058 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013059 resolveRegion.dstSubresource.mipLevel = 0;
13060 resolveRegion.dstSubresource.baseArrayLayer = 0;
13061 resolveRegion.dstSubresource.layerCount = 0;
13062 resolveRegion.dstOffset.x = 0;
13063 resolveRegion.dstOffset.y = 0;
13064 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013065 resolveRegion.extent.width = 1;
13066 resolveRegion.extent.height = 1;
13067 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070013068 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
13069 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060013070 EndCommandBuffer();
13071
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013072 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060013073
Chia-I Wuf7458c52015-10-26 21:10:41 +080013074 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013075 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080013076 vkFreeMemory(m_device->device(), srcMem, NULL);
13077 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060013078}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013079
Karl Schultz6addd812016-02-02 17:17:23 -070013080TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013081 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070013082 // to using a DS format, then cause it to hit error due to COLOR_BIT not
13083 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013084 // The image format check comes 2nd in validation so we trigger it first,
13085 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070013086 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013087
Karl Schultz6addd812016-02-02 17:17:23 -070013088 m_errorMonitor->SetDesiredFailureMsg(
13089 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013090 "Combination depth/stencil image formats can have only the ");
13091
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013092 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013093
Chia-I Wu1b99bb22015-10-27 19:25:11 +080013094 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013095 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
13096 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013097
13098 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013099 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13100 ds_pool_ci.pNext = NULL;
13101 ds_pool_ci.maxSets = 1;
13102 ds_pool_ci.poolSizeCount = 1;
13103 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013104
13105 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070013106 err =
13107 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013108 ASSERT_VK_SUCCESS(err);
13109
13110 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013111 dsl_binding.binding = 0;
13112 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
13113 dsl_binding.descriptorCount = 1;
13114 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
13115 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013116
13117 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013118 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13119 ds_layout_ci.pNext = NULL;
13120 ds_layout_ci.bindingCount = 1;
13121 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013122 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070013123 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
13124 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013125 ASSERT_VK_SUCCESS(err);
13126
13127 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013128 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080013129 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070013130 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013131 alloc_info.descriptorPool = ds_pool;
13132 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070013133 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
13134 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013135 ASSERT_VK_SUCCESS(err);
13136
Karl Schultz6addd812016-02-02 17:17:23 -070013137 VkImage image_bad;
13138 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013139 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060013140 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013141 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070013142 const int32_t tex_width = 32;
13143 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013144
13145 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013146 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13147 image_create_info.pNext = NULL;
13148 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13149 image_create_info.format = tex_format_bad;
13150 image_create_info.extent.width = tex_width;
13151 image_create_info.extent.height = tex_height;
13152 image_create_info.extent.depth = 1;
13153 image_create_info.mipLevels = 1;
13154 image_create_info.arrayLayers = 1;
13155 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13156 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
13157 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
13158 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
13159 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013160
Karl Schultz6addd812016-02-02 17:17:23 -070013161 err =
13162 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013163 ASSERT_VK_SUCCESS(err);
13164 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070013165 image_create_info.usage =
13166 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
13167 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
13168 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013169 ASSERT_VK_SUCCESS(err);
13170
13171 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013172 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13173 image_view_create_info.image = image_bad;
13174 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13175 image_view_create_info.format = tex_format_bad;
13176 image_view_create_info.subresourceRange.baseArrayLayer = 0;
13177 image_view_create_info.subresourceRange.baseMipLevel = 0;
13178 image_view_create_info.subresourceRange.layerCount = 1;
13179 image_view_create_info.subresourceRange.levelCount = 1;
13180 image_view_create_info.subresourceRange.aspectMask =
13181 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013182
13183 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070013184 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
13185 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013186
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013187 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013188
Chia-I Wuf7458c52015-10-26 21:10:41 +080013189 vkDestroyImage(m_device->device(), image_bad, NULL);
13190 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080013191 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13192 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060013193}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060013194
13195TEST_F(VkLayerTest, ClearImageErrors) {
13196 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
13197 "ClearDepthStencilImage with a color image.");
13198
13199 ASSERT_NO_FATAL_FAILURE(InitState());
13200 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13201
13202 // Renderpass is started here so end it as Clear cmds can't be in renderpass
13203 BeginCommandBuffer();
13204 m_commandBuffer->EndRenderPass();
13205
13206 // Color image
13207 VkClearColorValue clear_color;
13208 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
13209 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
13210 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
13211 const int32_t img_width = 32;
13212 const int32_t img_height = 32;
13213 VkImageCreateInfo image_create_info = {};
13214 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13215 image_create_info.pNext = NULL;
13216 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13217 image_create_info.format = color_format;
13218 image_create_info.extent.width = img_width;
13219 image_create_info.extent.height = img_height;
13220 image_create_info.extent.depth = 1;
13221 image_create_info.mipLevels = 1;
13222 image_create_info.arrayLayers = 1;
13223 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13224 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13225 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13226
13227 vk_testing::Image color_image;
13228 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info,
13229 reqs);
13230
13231 const VkImageSubresourceRange color_range =
13232 vk_testing::Image::subresource_range(image_create_info,
13233 VK_IMAGE_ASPECT_COLOR_BIT);
13234
13235 // Depth/Stencil image
13236 VkClearDepthStencilValue clear_value = {0};
13237 reqs = 0; // don't need HOST_VISIBLE DS image
13238 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
13239 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
13240 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
13241 ds_image_create_info.extent.width = 64;
13242 ds_image_create_info.extent.height = 64;
13243 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
13244 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
13245
13246 vk_testing::Image ds_image;
13247 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info,
13248 reqs);
13249
13250 const VkImageSubresourceRange ds_range =
13251 vk_testing::Image::subresource_range(ds_image_create_info,
13252 VK_IMAGE_ASPECT_DEPTH_BIT);
13253
13254 m_errorMonitor->SetDesiredFailureMsg(
13255 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13256 "vkCmdClearColorImage called with depth/stencil image.");
13257
13258 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
13259 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
13260 &color_range);
13261
13262 m_errorMonitor->VerifyFound();
13263
Tony Barbour26434b92016-06-02 09:43:50 -060013264 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13265 "vkCmdClearColorImage called with "
13266 "image created without "
13267 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
13268
13269 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
13270 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
13271 &color_range);
13272
13273 m_errorMonitor->VerifyFound();
13274
Tobin Ehlis6e23d772016-05-19 11:08:34 -060013275 // Call CmdClearDepthStencilImage with color image
13276 m_errorMonitor->SetDesiredFailureMsg(
13277 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13278 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
13279
13280 vkCmdClearDepthStencilImage(
13281 m_commandBuffer->GetBufferHandle(), color_image.handle(),
13282 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
13283 &ds_range);
13284
13285 m_errorMonitor->VerifyFound();
13286}
Tobin Ehliscde08892015-09-22 10:11:37 -060013287#endif // IMAGE_TESTS
13288
Tony Barbour300a6082015-04-07 13:44:53 -060013289int main(int argc, char **argv) {
13290 int result;
13291
Cody Northrop8e54a402016-03-08 22:25:52 -070013292#ifdef ANDROID
13293 int vulkanSupport = InitVulkan();
13294 if (vulkanSupport == 0)
13295 return 1;
13296#endif
13297
Tony Barbour300a6082015-04-07 13:44:53 -060013298 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060013299 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060013300
13301 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
13302
13303 result = RUN_ALL_TESTS();
13304
Tony Barbour6918cd52015-04-09 12:58:51 -060013305 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060013306 return result;
13307}