blob: 2d02ac6adb371f3d37edf9a6423db0991c35f13c [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 Lobodzinski3780e142015-05-14 15:08:13 -050066} BsoFailSelect;
67
68struct vktriangle_vs_uniform {
69 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070070 float mvp[4][4];
71 float position[3][4];
72 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050073};
74
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050075static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120076 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070077 "vec2 vertices[3];\n"
78 "out gl_PerVertex {\n"
79 " vec4 gl_Position;\n"
80 "};\n"
81 "void main() {\n"
82 " vertices[0] = vec2(-1.0, -1.0);\n"
83 " vertices[1] = vec2( 1.0, -1.0);\n"
84 " vertices[2] = vec2( 0.0, 1.0);\n"
85 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
86 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050087
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050088static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120089 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070090 "\n"
91 "layout(location = 0) out vec4 uFragColor;\n"
92 "void main(){\n"
93 " uFragColor = vec4(0,1,0,1);\n"
94 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050095
Karl Schultz6addd812016-02-02 17:17:23 -070096static VKAPI_ATTR VkBool32 VKAPI_CALL
97myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
98 uint64_t srcObject, size_t location, int32_t msgCode,
99 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -0600100
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600101// ********************************************************
102// ErrorMonitor Usage:
103//
104// Call SetDesiredFailureMsg with a string to be compared against all
105// encountered log messages. Passing NULL will match all log messages.
106// logMsg will return true for skipCall only if msg is matched or NULL.
107//
108// Call DesiredMsgFound to determine if the desired failure message
109// was encountered.
110
Tony Barbour300a6082015-04-07 13:44:53 -0600111class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700112 public:
113 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600114 test_platform_thread_create_mutex(&m_mutex);
115 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700116 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700117 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600118 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600119 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600120
Dustin Graves48458142016-04-29 16:11:55 -0600121 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
122
Karl Schultz6addd812016-02-02 17:17:23 -0700123 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200124 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600125 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600126 m_failureMsg.clear();
127 m_otherMsgs.clear();
128 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700129 m_msgFound = VK_FALSE;
130 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600131 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600132 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600133
Karl Schultz6addd812016-02-02 17:17:23 -0700134 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600135 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600136 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600137 if (m_bailout != NULL) {
138 *m_bailout = true;
139 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600140 string errorString(msgString);
141 if (msgFlags & m_msgFlags) {
142 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200143 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
144 m_otherMsgs.push_back(m_failureMsg);
145 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600146 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700147 m_msgFound = VK_TRUE;
148 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600149 } else {
150 m_otherMsgs.push_back(errorString);
151 }
152 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600153 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600154 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600155 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600156
Karl Schultz6addd812016-02-02 17:17:23 -0700157 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600158
Karl Schultz6addd812016-02-02 17:17:23 -0700159 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600160
Karl Schultz6addd812016-02-02 17:17:23 -0700161 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600162
Karl Schultz6addd812016-02-02 17:17:23 -0700163 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600164
Karl Schultz6addd812016-02-02 17:17:23 -0700165 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600166 vector<string> otherMsgs = GetOtherFailureMsgs();
167 cout << "Other error messages logged for this test were:" << endl;
168 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
169 cout << " " << *iter << endl;
170 }
171 }
172
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200173 /* helpers */
174
175 void ExpectSuccess() {
176 // match anything
177 SetDesiredFailureMsg(~0u, "");
178 }
179
180 void VerifyFound() {
181 // Not seeing the desired message is a failure. /Before/ throwing, dump
182 // any other messages.
183 if (!DesiredMsgFound()) {
184 DumpFailureMsgs();
185 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
186 }
187 }
188
189 void VerifyNotFound() {
190 // ExpectSuccess() configured us to match anything. Any error is a
191 // failure.
192 if (DesiredMsgFound()) {
193 DumpFailureMsgs();
194 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
195 }
196 }
197
Karl Schultz6addd812016-02-02 17:17:23 -0700198 private:
199 VkFlags m_msgFlags;
200 string m_desiredMsg;
201 string m_failureMsg;
202 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600203 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700204 bool *m_bailout;
205 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600206};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500207
Karl Schultz6addd812016-02-02 17:17:23 -0700208static VKAPI_ATTR VkBool32 VKAPI_CALL
209myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
210 uint64_t srcObject, size_t location, int32_t msgCode,
211 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
212 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700213 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700214 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600215 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600216 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600217 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600218 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600219}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500220
Karl Schultz6addd812016-02-02 17:17:23 -0700221class VkLayerTest : public VkRenderFramework {
222 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800223 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
224 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700225 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
226 BsoFailSelect failMask);
227 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
228 VkPipelineObj &pipelineobj,
229 VkDescriptorSetObj &descriptorSet,
230 BsoFailSelect failMask);
231 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
232 VkDescriptorSetObj &descriptorSet,
233 BsoFailSelect failMask) {
234 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
235 failMask);
236 }
Tony Barbour300a6082015-04-07 13:44:53 -0600237
Tony Barbourfe3351b2015-07-28 10:17:20 -0600238 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700239 VkResult BeginCommandBuffer() {
240 return BeginCommandBuffer(*m_commandBuffer);
241 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800242 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700243 void Draw(uint32_t vertexCount, uint32_t instanceCount,
244 uint32_t firstVertex, uint32_t firstInstance) {
245 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
246 firstInstance);
247 }
248 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
249 uint32_t firstIndex, int32_t vertexOffset,
250 uint32_t firstInstance) {
251 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
252 vertexOffset, firstInstance);
253 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800254 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700255 void QueueCommandBuffer(const VkFence &fence) {
256 m_commandBuffer->QueueCommandBuffer(fence);
257 }
258 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
259 VkDeviceSize offset, uint32_t binding) {
260 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
261 }
262 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
263 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
264 }
265
266 protected:
267 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600268 bool m_enableWSI;
Tony Barbour300a6082015-04-07 13:44:53 -0600269
270 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600271 std::vector<const char *> instance_layer_names;
272 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600273 std::vector<const char *> instance_extension_names;
274 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600275
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700276 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600277 /*
278 * Since CreateDbgMsgCallback is an instance level extension call
279 * any extension / layer that utilizes that feature also needs
280 * to be enabled at create instance time.
281 */
Karl Schultz6addd812016-02-02 17:17:23 -0700282 // Use Threading layer first to protect others from
283 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700284 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600285 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800286 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700287 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800288 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
289 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600290 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700291 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600292
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700293 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600294 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800295 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700296 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800297 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
298 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600299 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700300 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600301
Ian Elliott2c1daf52016-05-12 09:41:46 -0600302 if (m_enableWSI) {
303 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
304 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
305#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
306#if defined(VK_USE_PLATFORM_ANDROID_KHR)
307 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
308#endif // VK_USE_PLATFORM_ANDROID_KHR
309#if defined(VK_USE_PLATFORM_MIR_KHR)
310 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
311#endif // VK_USE_PLATFORM_MIR_KHR
312#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
313 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
314#endif // VK_USE_PLATFORM_WAYLAND_KHR
315#if defined(VK_USE_PLATFORM_WIN32_KHR)
316 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
317#endif // VK_USE_PLATFORM_WIN32_KHR
318#endif // NEED_TO_TEST_THIS_ON_PLATFORM
319#if defined(VK_USE_PLATFORM_XCB_KHR)
320 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
321#elif defined(VK_USE_PLATFORM_XLIB_KHR)
322 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
323#endif // VK_USE_PLATFORM_XLIB_KHR
324 }
325
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600326 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600327 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800328 this->app_info.pApplicationName = "layer_tests";
329 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600330 this->app_info.pEngineName = "unittest";
331 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600332 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600333
Tony Barbour15524c32015-04-29 17:34:29 -0600334 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600335 InitFramework(instance_layer_names, device_layer_names,
336 instance_extension_names, device_extension_names,
337 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600338 }
339
340 virtual void TearDown() {
341 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600342 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600343 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600344 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600345
346 VkLayerTest() {
347 m_enableWSI = false;
348 }
Tony Barbour300a6082015-04-07 13:44:53 -0600349};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500350
Karl Schultz6addd812016-02-02 17:17:23 -0700351VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600352 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600353
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800354 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600355
356 /*
357 * For render test all drawing happens in a single render pass
358 * on a single command buffer.
359 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200360 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800361 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600362 }
363
364 return result;
365}
366
Karl Schultz6addd812016-02-02 17:17:23 -0700367VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600368 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600369
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200370 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800371 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200372 }
Tony Barbour300a6082015-04-07 13:44:53 -0600373
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800374 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600375
376 return result;
377}
378
Karl Schultz6addd812016-02-02 17:17:23 -0700379void VkLayerTest::VKTriangleTest(const char *vertShaderText,
380 const char *fragShaderText,
381 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500382 // Create identity matrix
383 int i;
384 struct vktriangle_vs_uniform data;
385
386 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700387 glm::mat4 View = glm::mat4(1.0f);
388 glm::mat4 Model = glm::mat4(1.0f);
389 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500390 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700391 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500392
393 memcpy(&data.mvp, &MVP[0][0], matrixSize);
394
Karl Schultz6addd812016-02-02 17:17:23 -0700395 static const Vertex tri_data[] = {
396 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
397 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
398 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500399 };
400
Karl Schultz6addd812016-02-02 17:17:23 -0700401 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500402 data.position[i][0] = tri_data[i].posX;
403 data.position[i][1] = tri_data[i].posY;
404 data.position[i][2] = tri_data[i].posZ;
405 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700406 data.color[i][0] = tri_data[i].r;
407 data.color[i][1] = tri_data[i].g;
408 data.color[i][2] = tri_data[i].b;
409 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500410 }
411
412 ASSERT_NO_FATAL_FAILURE(InitState());
413 ASSERT_NO_FATAL_FAILURE(InitViewport());
414
Karl Schultz6addd812016-02-02 17:17:23 -0700415 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
416 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500417
Karl Schultz6addd812016-02-02 17:17:23 -0700418 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
419 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
420 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500421
422 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800423 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500424 pipelineobj.AddShader(&vs);
425 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600426 if (failMask & BsoFailLineWidth) {
427 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600428 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
429 ia_state.sType =
430 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
431 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
432 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600433 }
434 if (failMask & BsoFailDepthBias) {
435 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600436 VkPipelineRasterizationStateCreateInfo rs_state = {};
437 rs_state.sType =
438 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
439 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600440 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600441 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600442 }
Karl Schultz6addd812016-02-02 17:17:23 -0700443 // Viewport and scissors must stay in synch or other errors will occur than
444 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600445 if (failMask & BsoFailViewport) {
446 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600447 m_viewports.clear();
448 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600449 }
450 if (failMask & BsoFailScissor) {
451 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600452 m_scissors.clear();
453 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600454 }
455 if (failMask & BsoFailBlend) {
456 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600457 VkPipelineColorBlendAttachmentState att_state = {};
458 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
459 att_state.blendEnable = VK_TRUE;
460 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600461 }
462 if (failMask & BsoFailDepthBounds) {
463 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
464 }
465 if (failMask & BsoFailStencilReadMask) {
466 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
467 }
468 if (failMask & BsoFailStencilWriteMask) {
469 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
470 }
471 if (failMask & BsoFailStencilReference) {
472 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
473 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500474
475 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700476 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
477 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500478
479 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600480 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481
Tony Barbourfe3351b2015-07-28 10:17:20 -0600482 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500483
484 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600485 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500486
487 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600488 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500489
Tony Barbourfe3351b2015-07-28 10:17:20 -0600490 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500491}
492
Karl Schultz6addd812016-02-02 17:17:23 -0700493void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
494 VkPipelineObj &pipelineobj,
495 VkDescriptorSetObj &descriptorSet,
496 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500497 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700498 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
499 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500500 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700501 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
502 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500503 }
504
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800505 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700506 // Make sure depthWriteEnable is set so that Depth fail test will work
507 // correctly
508 // Make sure stencilTestEnable is set so that Stencil fail test will work
509 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600510 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800511 stencil.failOp = VK_STENCIL_OP_KEEP;
512 stencil.passOp = VK_STENCIL_OP_KEEP;
513 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
514 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600515
516 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
517 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600518 ds_ci.pNext = NULL;
519 ds_ci.depthTestEnable = VK_FALSE;
520 ds_ci.depthWriteEnable = VK_TRUE;
521 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
522 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600523 if (failMask & BsoFailDepthBounds) {
524 ds_ci.depthBoundsTestEnable = VK_TRUE;
525 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600526 ds_ci.stencilTestEnable = VK_TRUE;
527 ds_ci.front = stencil;
528 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600529
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600530 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600531 pipelineobj.SetViewport(m_viewports);
532 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800533 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700534 VkResult err = pipelineobj.CreateVKPipeline(
535 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600536 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800537 commandBuffer->BindPipeline(pipelineobj);
538 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500539}
540
Ian Elliott2c1daf52016-05-12 09:41:46 -0600541class VkWsiEnabledLayerTest : public VkLayerTest {
542 public:
543protected:
544 VkWsiEnabledLayerTest() {
545 m_enableWSI = true;
546 }
547};
548
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500549// ********************************************************************************************************************
550// ********************************************************************************************************************
551// ********************************************************************************************************************
552// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600553#if PARAMETER_VALIDATION_TESTS
554TEST_F(VkLayerTest, RequiredParameter) {
555 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
556 "pointer, array, and array count parameters");
557
558 ASSERT_NO_FATAL_FAILURE(InitState());
559
560 m_errorMonitor->SetDesiredFailureMsg(
561 VK_DEBUG_REPORT_ERROR_BIT_EXT,
562 "required parameter pFeatures specified as NULL");
563 // Specify NULL for a pointer to a handle
564 // Expected to trigger an error with
565 // parameter_validation::validate_required_pointer
566 vkGetPhysicalDeviceFeatures(gpu(), NULL);
567 m_errorMonitor->VerifyFound();
568
569 m_errorMonitor->SetDesiredFailureMsg(
570 VK_DEBUG_REPORT_ERROR_BIT_EXT,
571 "required parameter pPhysicalDeviceCount specified as NULL");
572 // Specify NULL for pointer to array count
573 // Expected to trigger an error with parameter_validation::validate_array
574 vkEnumeratePhysicalDevices(instance(), NULL, NULL);
575 m_errorMonitor->VerifyFound();
576
577 m_errorMonitor->SetDesiredFailureMsg(
578 VK_DEBUG_REPORT_ERROR_BIT_EXT,
579 "parameter viewportCount must be greater than 0");
580 // Specify 0 for a required array count
581 // Expected to trigger an error with parameter_validation::validate_array
582 VkViewport view_port = {};
583 m_commandBuffer->SetViewport(0, 0, &view_port);
584 m_errorMonitor->VerifyFound();
585
586 m_errorMonitor->SetDesiredFailureMsg(
587 VK_DEBUG_REPORT_ERROR_BIT_EXT,
588 "required parameter pViewports specified as NULL");
589 // Specify NULL for a required array
590 // Expected to trigger an error with parameter_validation::validate_array
591 m_commandBuffer->SetViewport(0, 1, NULL);
592 m_errorMonitor->VerifyFound();
593
594 m_errorMonitor->SetDesiredFailureMsg(
595 VK_DEBUG_REPORT_ERROR_BIT_EXT,
596 "required parameter memory specified as VK_NULL_HANDLE");
597 // Specify VK_NULL_HANDLE for a required handle
598 // Expected to trigger an error with
599 // parameter_validation::validate_required_handle
600 vkUnmapMemory(device(), VK_NULL_HANDLE);
601 m_errorMonitor->VerifyFound();
602
603 m_errorMonitor->SetDesiredFailureMsg(
604 VK_DEBUG_REPORT_ERROR_BIT_EXT,
605 "required parameter pFences[0] specified as VK_NULL_HANDLE");
606 // Specify VK_NULL_HANDLE for a required handle array entry
607 // Expected to trigger an error with
608 // parameter_validation::validate_required_handle_array
609 VkFence fence = VK_NULL_HANDLE;
610 vkResetFences(device(), 1, &fence);
611 m_errorMonitor->VerifyFound();
612
613 m_errorMonitor->SetDesiredFailureMsg(
614 VK_DEBUG_REPORT_ERROR_BIT_EXT,
615 "required parameter pAllocateInfo specified as NULL");
616 // Specify NULL for a required struct pointer
617 // Expected to trigger an error with
618 // parameter_validation::validate_struct_type
619 VkDeviceMemory memory = VK_NULL_HANDLE;
620 vkAllocateMemory(device(), NULL, NULL, &memory);
621 m_errorMonitor->VerifyFound();
622
623 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
624 "value of faceMask must not be 0");
625 // Specify 0 for a required VkFlags parameter
626 // Expected to trigger an error with parameter_validation::validate_flags
627 m_commandBuffer->SetStencilReference(0, 0);
628 m_errorMonitor->VerifyFound();
629
630 m_errorMonitor->SetDesiredFailureMsg(
631 VK_DEBUG_REPORT_ERROR_BIT_EXT,
632 "value of pSubmits[i].pWaitDstStageMask[0] must not be 0");
633 // Specify 0 for a required VkFlags array entry
634 // Expected to trigger an error with
635 // parameter_validation::validate_flags_array
636 VkSemaphore semaphore = VK_NULL_HANDLE;
637 VkPipelineStageFlags stageFlags = 0;
638 VkSubmitInfo submitInfo = {};
639 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
640 submitInfo.waitSemaphoreCount = 1;
641 submitInfo.pWaitSemaphores = &semaphore;
642 submitInfo.pWaitDstStageMask = &stageFlags;
643 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
644 m_errorMonitor->VerifyFound();
645}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600646
Dustin Gravesfce74c02016-05-10 11:42:58 -0600647TEST_F(VkLayerTest, ReservedParameter) {
648 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
649
650 ASSERT_NO_FATAL_FAILURE(InitState());
651
652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
653 " must be 0");
654 // Specify 0 for a reserved VkFlags parameter
655 // Expected to trigger an error with
656 // parameter_validation::validate_reserved_flags
657 VkEvent event_handle = VK_NULL_HANDLE;
658 VkEventCreateInfo event_info = {};
659 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
660 event_info.flags = 1;
661 vkCreateEvent(device(), &event_info, NULL, &event_handle);
662 m_errorMonitor->VerifyFound();
663}
664
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600665TEST_F(VkLayerTest, InvalidStructSType) {
666 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
667 "structure's sType field");
668
669 ASSERT_NO_FATAL_FAILURE(InitState());
670
671 m_errorMonitor->SetDesiredFailureMsg(
672 VK_DEBUG_REPORT_ERROR_BIT_EXT,
673 "parameter pAllocateInfo->sType must be");
674 // Zero struct memory, effectively setting sType to
675 // VK_STRUCTURE_TYPE_APPLICATION_INFO
676 // Expected to trigger an error with
677 // parameter_validation::validate_struct_type
678 VkMemoryAllocateInfo alloc_info = {};
679 VkDeviceMemory memory = VK_NULL_HANDLE;
680 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
681 m_errorMonitor->VerifyFound();
682
683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
684 "parameter pSubmits[0].sType must be");
685 // Zero struct memory, effectively setting sType to
686 // VK_STRUCTURE_TYPE_APPLICATION_INFO
687 // Expected to trigger an error with
688 // parameter_validation::validate_struct_type_array
689 VkSubmitInfo submit_info = {};
690 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
691 m_errorMonitor->VerifyFound();
692}
693
694TEST_F(VkLayerTest, InvalidStructPNext) {
695 TEST_DESCRIPTION(
696 "Specify an invalid value for a Vulkan structure's pNext field");
697
698 ASSERT_NO_FATAL_FAILURE(InitState());
699
700 m_errorMonitor->SetDesiredFailureMsg(
701 VK_DEBUG_REPORT_ERROR_BIT_EXT,
702 "value of pAllocateInfo->pNext must be NULL");
703 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be
704 // NULL
705 // Expected to trigger an error with
706 // parameter_validation::validate_struct_pnext
707 VkDeviceMemory memory = VK_NULL_HANDLE;
708 // Zero-initialization will provide the correct sType
709 VkApplicationInfo app_info = {};
Dustin Graves47b6cba2016-05-10 17:34:38 -0600710 VkMemoryAllocateInfo memory_alloc_info = {};
711 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
712 memory_alloc_info.pNext = &app_info;
713 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600714 m_errorMonitor->VerifyFound();
715
Dustin Graves47b6cba2016-05-10 17:34:38 -0600716 m_errorMonitor->SetDesiredFailureMsg(
717 VK_DEBUG_REPORT_ERROR_BIT_EXT,
718 " chain includes a structure with unexpected VkStructureType ");
719 // Set VkGraphicsPipelineCreateInfo::VkPipelineRasterizationStateCreateInfo::pNext to an invalid structure, when pNext is allowed to be a non-NULL value
720 // Expected to trigger an error with
721 // parameter_validation::validate_struct_pnext
722 VkDescriptorPoolSize ds_type_count = {};
723 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
724 ds_type_count.descriptorCount = 1;
725
726 VkDescriptorPoolCreateInfo ds_pool_ci = {};
727 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
728 ds_pool_ci.pNext = NULL;
729 ds_pool_ci.maxSets = 1;
730 ds_pool_ci.poolSizeCount = 1;
731 ds_pool_ci.pPoolSizes = &ds_type_count;
732
733 VkDescriptorPool ds_pool;
734 VkResult err =
735 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
736 ASSERT_VK_SUCCESS(err);
737
738 VkDescriptorSetLayoutBinding dsl_binding = {};
739 dsl_binding.binding = 0;
740 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
741 dsl_binding.descriptorCount = 1;
742 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
743 dsl_binding.pImmutableSamplers = NULL;
744
745 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
746 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
747 ds_layout_ci.pNext = NULL;
748 ds_layout_ci.bindingCount = 1;
749 ds_layout_ci.pBindings = &dsl_binding;
750
751 VkDescriptorSetLayout ds_layout;
752 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
753 &ds_layout);
754 ASSERT_VK_SUCCESS(err);
755
756 VkDescriptorSet descriptorSet;
757 VkDescriptorSetAllocateInfo ds_alloc_info = {};
758 ds_alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
759 ds_alloc_info.descriptorSetCount = 1;
760 ds_alloc_info.descriptorPool = ds_pool;
761 ds_alloc_info.pSetLayouts = &ds_layout;
762 err = vkAllocateDescriptorSets(m_device->device(), &ds_alloc_info,
763 &descriptorSet);
764 ASSERT_VK_SUCCESS(err);
765
766 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
767 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
768 pipeline_layout_ci.setLayoutCount = 1;
769 pipeline_layout_ci.pSetLayouts = &ds_layout;
770
771 VkPipelineLayout pipeline_layout;
772 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
773 &pipeline_layout);
774 ASSERT_VK_SUCCESS(err);
775
776 VkViewport vp = {}; // Just need dummy vp to point to
777 VkRect2D sc = {}; // dummy scissor to point to
778
779 VkPipelineViewportStateCreateInfo vp_state_ci = {};
780 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
781 vp_state_ci.scissorCount = 1;
782 vp_state_ci.pScissors = &sc;
783 vp_state_ci.viewportCount = 1;
784 vp_state_ci.pViewports = &vp;
785
786 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
787 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
788 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
789 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
790 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
791 rs_state_ci.depthClampEnable = VK_FALSE;
792 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
793 rs_state_ci.depthBiasEnable = VK_FALSE;
794
795 VkGraphicsPipelineCreateInfo gp_ci = {};
796 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
797 gp_ci.pViewportState = &vp_state_ci;
798 gp_ci.pRasterizationState = &rs_state_ci;
799 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
800 gp_ci.layout = pipeline_layout;
801 gp_ci.renderPass = renderPass();
802
803 VkPipelineCacheCreateInfo pc_ci = {};
804 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
805 pc_ci.initialDataSize = 0;
806 pc_ci.pInitialData = 0;
807
808 VkPipeline pipeline;
809 VkPipelineCache pipelineCache;
810
811 err =
812 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
813 ASSERT_VK_SUCCESS(err);
814
815 // Set VkPipelineRasterizationStateCreateInfo::pNext to an invalid value
816 VkApplicationInfo invalid_pnext_struct = {};
817 rs_state_ci.pNext = &invalid_pnext_struct;
818
819 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
820 &gp_ci, NULL, &pipeline);
821 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600822}
Dustin Graves5d33d532016-05-09 16:21:12 -0600823
824TEST_F(VkLayerTest, UnrecognizedValue) {
825 TEST_DESCRIPTION(
826 "Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
827
828 ASSERT_NO_FATAL_FAILURE(InitState());
829
830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
831 "does not fall within the begin..end "
832 "range of the core VkFormat "
833 "enumeration tokens");
834 // Specify an invalid VkFormat value
835 // Expected to trigger an error with
836 // parameter_validation::validate_ranged_enum
837 VkFormatProperties format_properties;
838 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000),
839 &format_properties);
840 m_errorMonitor->VerifyFound();
841
842 m_errorMonitor->SetDesiredFailureMsg(
843 VK_DEBUG_REPORT_ERROR_BIT_EXT,
844 "contains flag bits that are not recognized members of");
845 // Specify an invalid VkFlags bitmask value
846 // Expected to trigger an error with parameter_validation::validate_flags
847 VkImageFormatProperties image_format_properties;
848 vkGetPhysicalDeviceImageFormatProperties(
849 gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D,
850 VK_IMAGE_TILING_OPTIMAL, static_cast<VkImageUsageFlags>(1 << 25), 0,
851 &image_format_properties);
852 m_errorMonitor->VerifyFound();
853
854 m_errorMonitor->SetDesiredFailureMsg(
855 VK_DEBUG_REPORT_ERROR_BIT_EXT,
856 "contains flag bits that are not recognized members of");
857 // Specify an invalid VkFlags array entry
858 // Expected to trigger an error with
859 // parameter_validation::validate_flags_array
860 VkSemaphore semaphore = VK_NULL_HANDLE;
861 VkPipelineStageFlags stage_flags =
862 static_cast<VkPipelineStageFlags>(1 << 25);
863 VkSubmitInfo submit_info = {};
864 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
865 submit_info.waitSemaphoreCount = 1;
866 submit_info.pWaitSemaphores = &semaphore;
867 submit_info.pWaitDstStageMask = &stage_flags;
868 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
869 m_errorMonitor->VerifyFound();
870
871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
872 "is neither VK_TRUE nor VK_FALSE");
873 // Specify an invalid VkBool32 value
874 // Expected to trigger a warning with
875 // parameter_validation::validate_bool32
876 VkSampler sampler = VK_NULL_HANDLE;
877 VkSamplerCreateInfo sampler_info = {};
878 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
879 sampler_info.pNext = NULL;
880 sampler_info.magFilter = VK_FILTER_NEAREST;
881 sampler_info.minFilter = VK_FILTER_NEAREST;
882 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
883 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
884 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
885 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
886 sampler_info.mipLodBias = 1.0;
887 sampler_info.maxAnisotropy = 1;
888 sampler_info.compareEnable = VK_FALSE;
889 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
890 sampler_info.minLod = 1.0;
891 sampler_info.maxLod = 1.0;
892 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
893 sampler_info.unnormalizedCoordinates = VK_FALSE;
894 // Not VK_TRUE or VK_FALSE
895 sampler_info.anisotropyEnable = 3;
896 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
897 m_errorMonitor->VerifyFound();
898}
Dustin Gravesfce74c02016-05-10 11:42:58 -0600899
900TEST_F(VkLayerTest, FailedReturnValue) {
901 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
902
903 ASSERT_NO_FATAL_FAILURE(InitState());
904
905 m_errorMonitor->SetDesiredFailureMsg(
906 VK_DEBUG_REPORT_WARNING_BIT_EXT,
907 "the requested format is not supported on this device");
908 // Specify invalid VkFormat value to generate a
909 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
910 // Expected to trigger a warning from parameter_validation::validate_result
911 VkImageFormatProperties image_format_properties;
912 VkResult err = vkGetPhysicalDeviceImageFormatProperties(
913 gpu(), static_cast<VkFormat>(0x8000), VK_IMAGE_TYPE_2D,
914 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0,
915 &image_format_properties);
916 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
917 m_errorMonitor->VerifyFound();
918}
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600919#endif // PARAMETER_VALIDATION_TESTS
920
Tobin Ehlis0788f522015-05-26 16:11:58 -0600921#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700922#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800923TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500924{
925 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500926 VkFenceCreateInfo fenceInfo = {};
927 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
928 fenceInfo.pNext = NULL;
929 fenceInfo.flags = 0;
930
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600932
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500933 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600934
935 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
936 vk_testing::Buffer buffer;
937 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500938
Tony Barbourfe3351b2015-07-28 10:17:20 -0600939 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800940 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600941 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500942
943 testFence.init(*m_device, fenceInfo);
944
945 // Bypass framework since it does the waits automatically
946 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600947 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800948 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
949 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800950 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600951 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700952 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800953 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800954 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800955 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600956 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600957
958 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500959 ASSERT_VK_SUCCESS( err );
960
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500961 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800962 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500963
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200964 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500965}
966
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800967TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500968{
969 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500970 VkFenceCreateInfo fenceInfo = {};
971 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
972 fenceInfo.pNext = NULL;
973 fenceInfo.flags = 0;
974
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600976
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500977 ASSERT_NO_FATAL_FAILURE(InitState());
978 ASSERT_NO_FATAL_FAILURE(InitViewport());
979 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
980
Tony Barbourfe3351b2015-07-28 10:17:20 -0600981 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800982 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600983 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500984
985 testFence.init(*m_device, fenceInfo);
986
987 // Bypass framework since it does the waits automatically
988 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600989 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800990 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
991 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800992 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600993 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700994 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800995 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800996 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800997 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600998 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600999
1000 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001001 ASSERT_VK_SUCCESS( err );
1002
Jon Ashburnf19916e2016-01-11 13:12:43 -07001003 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001004 VkCommandBufferBeginInfo info = {};
1005 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1006 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001007 info.renderPass = VK_NULL_HANDLE;
1008 info.subpass = 0;
1009 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001010 info.occlusionQueryEnable = VK_FALSE;
1011 info.queryFlags = 0;
1012 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001013
1014 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001015 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001016
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001017 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001018}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001019#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001020
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001021// This is a positive test. No failures are expected.
1022TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
1023 VkResult err;
1024 bool pass;
1025
1026 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
1027 "the buffer, create an image, and bind the same memory to "
1028 "it");
1029
1030 m_errorMonitor->ExpectSuccess();
1031
1032 ASSERT_NO_FATAL_FAILURE(InitState());
1033
1034 VkBuffer buffer;
1035 VkImage image;
1036 VkDeviceMemory mem;
1037 VkMemoryRequirements mem_reqs;
1038
1039 VkBufferCreateInfo buf_info = {};
1040 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1041 buf_info.pNext = NULL;
1042 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1043 buf_info.size = 256;
1044 buf_info.queueFamilyIndexCount = 0;
1045 buf_info.pQueueFamilyIndices = NULL;
1046 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1047 buf_info.flags = 0;
1048 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1049 ASSERT_VK_SUCCESS(err);
1050
1051 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1052
1053 VkMemoryAllocateInfo alloc_info = {};
1054 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1055 alloc_info.pNext = NULL;
1056 alloc_info.memoryTypeIndex = 0;
1057
1058 // Ensure memory is big enough for both bindings
1059 alloc_info.allocationSize = 0x10000;
1060
1061 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1062 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1063 if (!pass) {
1064 vkDestroyBuffer(m_device->device(), buffer, NULL);
1065 return;
1066 }
1067
1068 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1069 ASSERT_VK_SUCCESS(err);
1070
1071 uint8_t *pData;
1072 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1073 (void **)&pData);
1074 ASSERT_VK_SUCCESS(err);
1075
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001076 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001077
1078 vkUnmapMemory(m_device->device(), mem);
1079
1080 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1081 ASSERT_VK_SUCCESS(err);
1082
1083 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1084 // memory. In fact, it was never used by the GPU.
1085 // Just be be sure, wait for idle.
1086 vkDestroyBuffer(m_device->device(), buffer, NULL);
1087 vkDeviceWaitIdle(m_device->device());
1088
1089 VkImageCreateInfo image_create_info = {};
1090 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1091 image_create_info.pNext = NULL;
1092 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1093 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1094 image_create_info.extent.width = 64;
1095 image_create_info.extent.height = 64;
1096 image_create_info.extent.depth = 1;
1097 image_create_info.mipLevels = 1;
1098 image_create_info.arrayLayers = 1;
1099 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1100 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1101 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1102 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1103 image_create_info.queueFamilyIndexCount = 0;
1104 image_create_info.pQueueFamilyIndices = NULL;
1105 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1106 image_create_info.flags = 0;
1107
1108 VkMemoryAllocateInfo mem_alloc = {};
1109 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1110 mem_alloc.pNext = NULL;
1111 mem_alloc.allocationSize = 0;
1112 mem_alloc.memoryTypeIndex = 0;
1113
1114 /* Create a mappable image. It will be the texture if linear images are ok
1115 * to be textures or it will be the staging image if they are not.
1116 */
1117 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1118 ASSERT_VK_SUCCESS(err);
1119
1120 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1121
1122 mem_alloc.allocationSize = mem_reqs.size;
1123
1124 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
1125 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1126 if (!pass) {
1127 vkDestroyImage(m_device->device(), image, NULL);
1128 return;
1129 }
1130
Tobin Ehlis077ded32016-05-12 17:39:13 -06001131 // VALIDATION FAILURE:
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001132 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1133 ASSERT_VK_SUCCESS(err);
1134
1135 m_errorMonitor->VerifyNotFound();
1136
1137 vkDestroyBuffer(m_device->device(), buffer, NULL);
1138 vkDestroyImage(m_device->device(), image, NULL);
1139}
1140
Tobin Ehlisf11be982016-05-11 13:52:53 -06001141TEST_F(VkLayerTest, InvalidMemoryAliasing) {
1142 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
1143 "buffer and image to memory such that they will alias.");
1144 VkResult err;
1145 bool pass;
1146 ASSERT_NO_FATAL_FAILURE(InitState());
1147
Tobin Ehlis077ded32016-05-12 17:39:13 -06001148 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001149 VkImage image;
1150 VkDeviceMemory mem; // buffer will be bound first
1151 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001152 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001153
1154 VkBufferCreateInfo buf_info = {};
1155 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1156 buf_info.pNext = NULL;
1157 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1158 buf_info.size = 256;
1159 buf_info.queueFamilyIndexCount = 0;
1160 buf_info.pQueueFamilyIndices = NULL;
1161 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1162 buf_info.flags = 0;
1163 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1164 ASSERT_VK_SUCCESS(err);
1165
Tobin Ehlis077ded32016-05-12 17:39:13 -06001166 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001167
1168 VkImageCreateInfo image_create_info = {};
1169 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1170 image_create_info.pNext = NULL;
1171 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1172 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1173 image_create_info.extent.width = 64;
1174 image_create_info.extent.height = 64;
1175 image_create_info.extent.depth = 1;
1176 image_create_info.mipLevels = 1;
1177 image_create_info.arrayLayers = 1;
1178 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1179 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1180 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1181 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1182 image_create_info.queueFamilyIndexCount = 0;
1183 image_create_info.pQueueFamilyIndices = NULL;
1184 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1185 image_create_info.flags = 0;
1186
Tobin Ehlisf11be982016-05-11 13:52:53 -06001187 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1188 ASSERT_VK_SUCCESS(err);
1189
Tobin Ehlis077ded32016-05-12 17:39:13 -06001190 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1191
1192 VkMemoryAllocateInfo alloc_info = {};
1193 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1194 alloc_info.pNext = NULL;
1195 alloc_info.memoryTypeIndex = 0;
1196 // Ensure memory is big enough for both bindings
1197 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
1198 pass = m_device->phy().set_memory_type(
1199 buff_mem_reqs.memoryTypeBits | img_mem_reqs.memoryTypeBits, &alloc_info,
1200 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001201 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001202 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001203 vkDestroyImage(m_device->device(), image, NULL);
1204 return;
1205 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001206 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1207 ASSERT_VK_SUCCESS(err);
1208 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1209 ASSERT_VK_SUCCESS(err);
1210
Tobin Ehlisf11be982016-05-11 13:52:53 -06001211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1212 " is aliased with buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001213 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001214 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1215 m_errorMonitor->VerifyFound();
1216
1217 // Now correctly bind image to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001218 // aliasing buffer2
1219 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1220 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001221 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1222 ASSERT_VK_SUCCESS(err);
1223 err = vkBindImageMemory(m_device->device(), image, mem_img, 0);
1224 ASSERT_VK_SUCCESS(err);
1225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1226 " is aliased with image 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001227 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001228 m_errorMonitor->VerifyFound();
1229
1230 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001231 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001232 vkDestroyImage(m_device->device(), image, NULL);
1233 vkFreeMemory(m_device->device(), mem, NULL);
1234 vkFreeMemory(m_device->device(), mem_img, NULL);
1235}
1236
Tobin Ehlis35372522016-05-12 08:32:31 -06001237TEST_F(VkLayerTest, InvalidMemoryMapping) {
1238 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1239 VkResult err;
1240 bool pass;
1241 ASSERT_NO_FATAL_FAILURE(InitState());
1242
1243 VkBuffer buffer;
1244 VkDeviceMemory mem;
1245 VkMemoryRequirements mem_reqs;
1246
1247 VkBufferCreateInfo buf_info = {};
1248 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1249 buf_info.pNext = NULL;
1250 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1251 buf_info.size = 256;
1252 buf_info.queueFamilyIndexCount = 0;
1253 buf_info.pQueueFamilyIndices = NULL;
1254 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1255 buf_info.flags = 0;
1256 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1257 ASSERT_VK_SUCCESS(err);
1258
1259 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1260 VkMemoryAllocateInfo alloc_info = {};
1261 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1262 alloc_info.pNext = NULL;
1263 alloc_info.memoryTypeIndex = 0;
1264
1265 // Ensure memory is big enough for both bindings
1266 static const VkDeviceSize allocation_size = 0x10000;
1267 alloc_info.allocationSize = allocation_size;
1268 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1269 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1270 if (!pass) {
1271 vkDestroyBuffer(m_device->device(), buffer, NULL);
1272 return;
1273 }
1274 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1275 ASSERT_VK_SUCCESS(err);
1276
1277 uint8_t *pData;
1278 // Attempt to map memory size 0 is invalid
1279 m_errorMonitor->SetDesiredFailureMsg(
1280 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1281 "VkMapMemory: Attempting to map memory range of size zero");
1282 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1283 m_errorMonitor->VerifyFound();
1284 // Map memory twice
1285 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1286 (void **)&pData);
1287 ASSERT_VK_SUCCESS(err);
1288 m_errorMonitor->SetDesiredFailureMsg(
1289 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1290 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1291 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1292 (void **)&pData);
1293 m_errorMonitor->VerifyFound();
1294
1295 // Unmap the memory to avoid re-map error
1296 vkUnmapMemory(m_device->device(), mem);
1297 // overstep allocation with VK_WHOLE_SIZE
1298 m_errorMonitor->SetDesiredFailureMsg(
1299 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1300 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1301 err = vkMapMemory(m_device->device(), mem, allocation_size + 1,
1302 VK_WHOLE_SIZE, 0, (void **)&pData);
1303 m_errorMonitor->VerifyFound();
1304 // overstep allocation w/o VK_WHOLE_SIZE
1305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1306 " oversteps total array size 0x");
1307 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0,
1308 (void **)&pData);
1309 m_errorMonitor->VerifyFound();
1310 // Now error due to unmapping memory that's not mapped
1311 m_errorMonitor->SetDesiredFailureMsg(
1312 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1313 "Unmapping Memory without memory being mapped: ");
1314 vkUnmapMemory(m_device->device(), mem);
1315 m_errorMonitor->VerifyFound();
1316 // Now map memory and cause errors due to flushing invalid ranges
1317 err = vkMapMemory(m_device->device(), mem, 16, VK_WHOLE_SIZE, 0,
1318 (void **)&pData);
1319 ASSERT_VK_SUCCESS(err);
1320 VkMappedMemoryRange mmr = {};
1321 mmr.memory = mem;
1322 mmr.offset = 15; // Error b/c offset less than offset of mapped mem
1323 m_errorMonitor->SetDesiredFailureMsg(
1324 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1325 ") is less than Memory Object's offset (");
1326 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1327 m_errorMonitor->VerifyFound();
1328 // Now flush range that oversteps mapped range
1329 vkUnmapMemory(m_device->device(), mem);
1330 err = vkMapMemory(m_device->device(), mem, 0, 256, 0, (void **)&pData);
1331 ASSERT_VK_SUCCESS(err);
1332 mmr.offset = 16;
1333 mmr.size = 256; // flushing bounds (272) exceed mapped bounds (256)
1334 m_errorMonitor->SetDesiredFailureMsg(
1335 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1336 ") exceeds the Memory Object's upper-bound (");
1337 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1338 m_errorMonitor->VerifyFound();
1339
1340 pass =
1341 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1342 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1343 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
1344 if (!pass) {
1345 vkFreeMemory(m_device->device(), mem, NULL);
1346 vkDestroyBuffer(m_device->device(), buffer, NULL);
1347 return;
1348 }
1349 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1350 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1351
1352 vkDestroyBuffer(m_device->device(), buffer, NULL);
1353 vkFreeMemory(m_device->device(), mem, NULL);
1354}
1355
Ian Elliott1c32c772016-04-28 14:47:13 -06001356TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1357 VkResult err;
1358 bool pass;
1359
Ian Elliott489eec02016-05-05 14:12:44 -06001360// FIXME: After we turn on this code for non-Linux platforms, uncomment the
1361// following declaration (which is temporarily being moved below):
1362// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001363 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
1364 VkSwapchainCreateInfoKHR swapchain_create_info = {};
1365 uint32_t swapchain_image_count = 0;
1366// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
1367 uint32_t image_index = 0;
1368// VkPresentInfoKHR present_info = {};
1369
1370 ASSERT_NO_FATAL_FAILURE(InitState());
1371
Ian Elliott3f06ce52016-04-29 14:46:21 -06001372#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1373#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1374 // Use the functions from the VK_KHR_android_surface extension without
1375 // enabling that extension:
1376
1377 // Create a surface:
1378 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06001379 m_errorMonitor->SetDesiredFailureMsg(
1380 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1381 "extension was not enabled for this");
1382 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
1383 &surface);
1384 pass = (err != VK_SUCCESS);
1385 ASSERT_TRUE(pass);
1386 m_errorMonitor->VerifyFound();
1387#endif // VK_USE_PLATFORM_ANDROID_KHR
1388
1389
1390#if defined(VK_USE_PLATFORM_MIR_KHR)
1391 // Use the functions from the VK_KHR_mir_surface extension without enabling
1392 // that extension:
1393
1394 // Create a surface:
1395 VkMirSurfaceCreateInfoKHR mir_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06001396 m_errorMonitor->SetDesiredFailureMsg(
1397 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1398 "extension was not enabled for this");
1399 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1400 pass = (err != VK_SUCCESS);
1401 ASSERT_TRUE(pass);
1402 m_errorMonitor->VerifyFound();
1403
1404 // Tell whether an mir_connection supports presentation:
1405 MirConnection *mir_connection = NULL;
1406 m_errorMonitor->SetDesiredFailureMsg(
1407 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1408 "extension was not enabled for this");
1409 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
1410 visual_id);
1411 m_errorMonitor->VerifyFound();
1412#endif // VK_USE_PLATFORM_MIR_KHR
1413
1414
1415#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1416 // Use the functions from the VK_KHR_wayland_surface extension without
1417 // enabling that extension:
1418
1419 // Create a surface:
1420 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06001421 m_errorMonitor->SetDesiredFailureMsg(
1422 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1423 "extension was not enabled for this");
1424 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
1425 &surface);
1426 pass = (err != VK_SUCCESS);
1427 ASSERT_TRUE(pass);
1428 m_errorMonitor->VerifyFound();
1429
1430 // Tell whether an wayland_display supports presentation:
1431 struct wl_display wayland_display = {};
1432 m_errorMonitor->SetDesiredFailureMsg(
1433 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1434 "extension was not enabled for this");
1435 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
1436 &wayland_display);
1437 m_errorMonitor->VerifyFound();
1438#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06001439#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001440
1441
1442#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06001443// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1444// TO NON-LINUX PLATFORMS:
1445VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001446 // Use the functions from the VK_KHR_win32_surface extension without
1447 // enabling that extension:
1448
1449 // Create a surface:
1450 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06001451 m_errorMonitor->SetDesiredFailureMsg(
1452 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1453 "extension was not enabled for this");
1454 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
1455 &surface);
1456 pass = (err != VK_SUCCESS);
1457 ASSERT_TRUE(pass);
1458 m_errorMonitor->VerifyFound();
1459
1460 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001461 m_errorMonitor->SetDesiredFailureMsg(
1462 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1463 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001464 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001465 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001466// Set this (for now, until all platforms are supported and tested):
1467#define NEED_TO_TEST_THIS_ON_PLATFORM
1468#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001469
1470
Ian Elliott1c32c772016-04-28 14:47:13 -06001471#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06001472// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1473// TO NON-LINUX PLATFORMS:
1474VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001475 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1476 // that extension:
1477
1478 // Create a surface:
1479 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001480 m_errorMonitor->SetDesiredFailureMsg(
1481 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1482 "extension was not enabled for this");
1483 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1484 pass = (err != VK_SUCCESS);
1485 ASSERT_TRUE(pass);
1486 m_errorMonitor->VerifyFound();
1487
1488 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001489 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001490 xcb_visualid_t visual_id = 0;
1491 m_errorMonitor->SetDesiredFailureMsg(
1492 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1493 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001494 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06001495 visual_id);
1496 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001497// Set this (for now, until all platforms are supported and tested):
1498#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001499#endif // VK_USE_PLATFORM_XCB_KHR
1500
1501
Ian Elliott12630812016-04-29 14:35:43 -06001502#if defined(VK_USE_PLATFORM_XLIB_KHR)
1503 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1504 // that extension:
1505
1506 // Create a surface:
1507 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
Ian Elliott12630812016-04-29 14:35:43 -06001508 m_errorMonitor->SetDesiredFailureMsg(
1509 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1510 "extension was not enabled for this");
1511 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1512 pass = (err != VK_SUCCESS);
1513 ASSERT_TRUE(pass);
1514 m_errorMonitor->VerifyFound();
1515
1516 // Tell whether an Xlib VisualID supports presentation:
1517 Display *dpy = NULL;
1518 VisualID visual = 0;
1519 m_errorMonitor->SetDesiredFailureMsg(
1520 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1521 "extension was not enabled for this");
1522 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1523 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001524// Set this (for now, until all platforms are supported and tested):
1525#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06001526#endif // VK_USE_PLATFORM_XLIB_KHR
1527
1528
Ian Elliott1c32c772016-04-28 14:47:13 -06001529 // Use the functions from the VK_KHR_surface extension without enabling
1530 // that extension:
1531
Ian Elliott489eec02016-05-05 14:12:44 -06001532#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001533 // Destroy a surface:
1534 m_errorMonitor->SetDesiredFailureMsg(
1535 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1536 "extension was not enabled for this");
1537 vkDestroySurfaceKHR(instance(), surface, NULL);
1538 m_errorMonitor->VerifyFound();
1539
1540 // Check if surface supports presentation:
1541 VkBool32 supported = false;
1542 m_errorMonitor->SetDesiredFailureMsg(
1543 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1544 "extension was not enabled for this");
1545 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1546 pass = (err != VK_SUCCESS);
1547 ASSERT_TRUE(pass);
1548 m_errorMonitor->VerifyFound();
1549
1550 // Check surface capabilities:
1551 VkSurfaceCapabilitiesKHR capabilities = {};
1552 m_errorMonitor->SetDesiredFailureMsg(
1553 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1554 "extension was not enabled for this");
1555 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
1556 &capabilities);
1557 pass = (err != VK_SUCCESS);
1558 ASSERT_TRUE(pass);
1559 m_errorMonitor->VerifyFound();
1560
1561 // Check surface formats:
1562 uint32_t format_count = 0;
1563 VkSurfaceFormatKHR *formats = NULL;
1564 m_errorMonitor->SetDesiredFailureMsg(
1565 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1566 "extension was not enabled for this");
1567 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1568 &format_count, formats);
1569 pass = (err != VK_SUCCESS);
1570 ASSERT_TRUE(pass);
1571 m_errorMonitor->VerifyFound();
1572
1573 // Check surface present modes:
1574 uint32_t present_mode_count = 0;
1575 VkSurfaceFormatKHR *present_modes = NULL;
1576 m_errorMonitor->SetDesiredFailureMsg(
1577 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1578 "extension was not enabled for this");
1579 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1580 &present_mode_count, present_modes);
1581 pass = (err != VK_SUCCESS);
1582 ASSERT_TRUE(pass);
1583 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001584#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001585
1586
1587 // Use the functions from the VK_KHR_swapchain extension without enabling
1588 // that extension:
1589
1590 // Create a swapchain:
1591 m_errorMonitor->SetDesiredFailureMsg(
1592 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1593 "extension was not enabled for this");
1594 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1595 swapchain_create_info.pNext = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001596 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1597 NULL, &swapchain);
1598 pass = (err != VK_SUCCESS);
1599 ASSERT_TRUE(pass);
1600 m_errorMonitor->VerifyFound();
1601
1602 // Get the images from the swapchain:
1603 m_errorMonitor->SetDesiredFailureMsg(
1604 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1605 "extension was not enabled for this");
1606 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
1607 &swapchain_image_count, NULL);
1608 pass = (err != VK_SUCCESS);
1609 ASSERT_TRUE(pass);
1610 m_errorMonitor->VerifyFound();
1611
1612 // Try to acquire an image:
1613 m_errorMonitor->SetDesiredFailureMsg(
1614 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1615 "extension was not enabled for this");
1616 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
1617 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
1618 pass = (err != VK_SUCCESS);
1619 ASSERT_TRUE(pass);
1620 m_errorMonitor->VerifyFound();
1621
1622 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001623 //
1624 // NOTE: Currently can't test this because a real swapchain is needed (as
1625 // opposed to the fake one we created) in order for the layer to lookup the
1626 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001627
1628 // Destroy the swapchain:
1629 m_errorMonitor->SetDesiredFailureMsg(
1630 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1631 "extension was not enabled for this");
1632 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1633 m_errorMonitor->VerifyFound();
1634}
1635
Ian Elliott2c1daf52016-05-12 09:41:46 -06001636TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
1637 VkResult err;
1638 bool pass;
1639
1640 VkSurfaceKHR surface = VK_NULL_HANDLE;
1641#if defined(VK_USE_PLATFORM_XCB_KHR)
1642 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
1643 VkSwapchainCreateInfoKHR swapchain_create_info = {};
1644// uint32_t swapchain_image_count = 0;
1645// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
1646// uint32_t image_index = 0;
1647// VkPresentInfoKHR present_info = {};
1648
1649 ASSERT_NO_FATAL_FAILURE(InitState());
1650
1651 // Use the create function from one of the VK_KHR_*_surface extension in
1652 // order to create a surface, testing all known errors in the process,
1653 // before successfully creating a surface:
1654 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
1655 m_errorMonitor->SetDesiredFailureMsg(
1656 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1657 "called with NULL pointer");
1658 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
1659 pass = (err != VK_SUCCESS);
1660 ASSERT_TRUE(pass);
1661 m_errorMonitor->VerifyFound();
1662
1663 // Next, try to create a surface with the wrong
1664 // VkXcbSurfaceCreateInfoKHR::sType:
1665 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
1666 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
1667 m_errorMonitor->SetDesiredFailureMsg(
1668 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1669 "called with the wrong value for");
1670 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1671 pass = (err != VK_SUCCESS);
1672 ASSERT_TRUE(pass);
1673 m_errorMonitor->VerifyFound();
1674
1675
1676 // Create a native window, and then correctly create a surface:
1677 xcb_connection_t *connection;
1678 xcb_screen_t *screen;
1679 xcb_window_t xcb_window;
1680 xcb_intern_atom_reply_t *atom_wm_delete_window;
1681
1682 const xcb_setup_t *setup;
1683 xcb_screen_iterator_t iter;
1684 int scr;
1685 uint32_t value_mask, value_list[32];
1686 int width = 1;
1687 int height = 1;
1688
1689 connection = xcb_connect(NULL, &scr);
1690 ASSERT_TRUE(connection != NULL);
1691 setup = xcb_get_setup(connection);
1692 iter = xcb_setup_roots_iterator(setup);
1693 while (scr-- > 0)
1694 xcb_screen_next(&iter);
1695 screen = iter.data;
1696
1697 xcb_window = xcb_generate_id(connection);
1698
1699 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
1700 value_list[0] = screen->black_pixel;
1701 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE |
1702 XCB_EVENT_MASK_STRUCTURE_NOTIFY;
1703
1704 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window,
1705 screen->root, 0, 0, width, height, 0,
1706 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual,
1707 value_mask, value_list);
1708
1709 /* Magic code that will send notification when window is destroyed */
1710 xcb_intern_atom_cookie_t cookie =
1711 xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
1712 xcb_intern_atom_reply_t *reply =
1713 xcb_intern_atom_reply(connection, cookie, 0);
1714
1715 xcb_intern_atom_cookie_t cookie2 =
1716 xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
1717 atom_wm_delete_window =
1718 xcb_intern_atom_reply(connection, cookie2, 0);
1719 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window,
1720 (*reply).atom, 4, 32, 1,
1721 &(*atom_wm_delete_window).atom);
1722 free(reply);
1723
1724 xcb_map_window(connection, xcb_window);
1725
1726 // Force the x/y coordinates to 100,100 results are identical in consecutive
1727 // runs
1728 const uint32_t coords[] = {100, 100};
1729 xcb_configure_window(connection, xcb_window,
1730 XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
1731
1732
1733
1734 // Finally, try to correctly create a surface:
1735 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
1736 xcb_create_info.pNext = NULL;
1737 xcb_create_info.flags = 0;
1738 xcb_create_info.connection = connection;
1739 xcb_create_info.window = xcb_window;
1740 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1741 pass = (err == VK_SUCCESS);
1742 ASSERT_TRUE(pass);
1743
1744
1745
1746 // Check if surface supports presentation:
1747
1748 // 1st, do so without having queried the queue families:
1749 VkBool32 supported = false;
1750 // TODO: Get the following error to come out:
1751 m_errorMonitor->SetDesiredFailureMsg(
1752 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1753 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
1754 "function");
1755 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1756 pass = (err != VK_SUCCESS);
1757// ASSERT_TRUE(pass);
1758// m_errorMonitor->VerifyFound();
1759
1760 // Next, query a queue family index that's too large:
1761 m_errorMonitor->SetDesiredFailureMsg(
1762 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1763 "called with a queueFamilyIndex that is too large");
1764 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
1765 pass = (err != VK_SUCCESS);
1766 ASSERT_TRUE(pass);
1767 m_errorMonitor->VerifyFound();
1768
1769 // Finally, do so correctly:
1770// FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S SUPPORTED
1771 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1772 pass = (err == VK_SUCCESS);
1773 ASSERT_TRUE(pass);
1774
1775
1776
1777 // Before proceeding, try to create a swapchain without having called
1778 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
1779 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1780 swapchain_create_info.pNext = NULL;
1781 swapchain_create_info.flags = 0;
1782 m_errorMonitor->SetDesiredFailureMsg(
1783 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1784 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
1785 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1786 NULL, &swapchain);
1787 pass = (err != VK_SUCCESS);
1788 ASSERT_TRUE(pass);
1789 m_errorMonitor->VerifyFound();
1790
1791
1792
1793 // Get the surface capabilities:
1794 VkSurfaceCapabilitiesKHR surface_capabilities;
1795
1796 // Do so correctly (only error logged by this entrypoint is if the
1797 // extension isn't enabled):
1798 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
1799 &surface_capabilities);
1800 pass = (err == VK_SUCCESS);
1801 ASSERT_TRUE(pass);
1802
1803
1804
1805 // Get the surface formats:
1806 uint32_t surface_format_count;
1807
1808 // First, try without a pointer to surface_format_count:
1809 m_errorMonitor->SetDesiredFailureMsg(
1810 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1811 "called with NULL pointer");
1812 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
1813 pass = (err == VK_SUCCESS);
1814 ASSERT_TRUE(pass);
1815 m_errorMonitor->VerifyFound();
1816
1817 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
1818 // correctly done a 1st try (to get the count):
1819 m_errorMonitor->SetDesiredFailureMsg(
1820 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1821 "but no prior positive value has been seen for");
1822 surface_format_count = 0;
1823 vkGetPhysicalDeviceSurfaceFormatsKHR(
1824 gpu(),
1825 surface,
1826 &surface_format_count,
1827 (VkSurfaceFormatKHR *) &surface_format_count);
1828 pass = (err == VK_SUCCESS);
1829 ASSERT_TRUE(pass);
1830 m_errorMonitor->VerifyFound();
1831
1832 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
1833 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1834 &surface_format_count, NULL);
1835 pass = (err == VK_SUCCESS);
1836 ASSERT_TRUE(pass);
1837
1838 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
1839 VkSurfaceFormatKHR *surface_formats =
1840 (VkSurfaceFormatKHR *)malloc(surface_format_count *
1841 sizeof(VkSurfaceFormatKHR));
1842
1843 // Next, do a 2nd try with surface_format_count being set too high:
1844 surface_format_count += 5;
1845 m_errorMonitor->SetDesiredFailureMsg(
1846 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1847 "that is greater than the value");
1848 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1849 &surface_format_count,
1850 surface_formats);
1851 pass = (err == VK_SUCCESS);
1852 ASSERT_TRUE(pass);
1853 m_errorMonitor->VerifyFound();
1854
1855 // Finally, do a correct 1st and 2nd try:
1856 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1857 &surface_format_count, NULL);
1858 pass = (err == VK_SUCCESS);
1859 ASSERT_TRUE(pass);
1860 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1861 &surface_format_count,
1862 surface_formats);
1863 pass = (err == VK_SUCCESS);
1864 ASSERT_TRUE(pass);
1865
1866
1867
1868 // Get the surface present modes:
1869 uint32_t surface_present_mode_count;
1870
1871 // First, try without a pointer to surface_format_count:
1872 m_errorMonitor->SetDesiredFailureMsg(
1873 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1874 "called with NULL pointer");
1875 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
1876 pass = (err == VK_SUCCESS);
1877 ASSERT_TRUE(pass);
1878 m_errorMonitor->VerifyFound();
1879
1880 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
1881 // correctly done a 1st try (to get the count):
1882 m_errorMonitor->SetDesiredFailureMsg(
1883 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1884 "but no prior positive value has been seen for");
1885 surface_present_mode_count = 0;
1886 vkGetPhysicalDeviceSurfacePresentModesKHR(
1887 gpu(),
1888 surface,
1889 &surface_present_mode_count,
1890 (VkPresentModeKHR *) &surface_present_mode_count);
1891 pass = (err == VK_SUCCESS);
1892 ASSERT_TRUE(pass);
1893 m_errorMonitor->VerifyFound();
1894
1895 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
1896 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface,
1897 &surface_present_mode_count,
1898 NULL);
1899 pass = (err == VK_SUCCESS);
1900 ASSERT_TRUE(pass);
1901
1902 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
1903 VkPresentModeKHR *surface_present_modes =
1904 (VkPresentModeKHR *)malloc(surface_present_mode_count *
1905 sizeof(VkPresentModeKHR));
1906
1907 // Next, do a 2nd try with surface_format_count being set too high:
1908 surface_present_mode_count += 5;
1909 m_errorMonitor->SetDesiredFailureMsg(
1910 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1911 "that is greater than the value");
1912 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface,
1913 &surface_present_mode_count,
1914 surface_present_modes);
1915 pass = (err == VK_SUCCESS);
1916 ASSERT_TRUE(pass);
1917 m_errorMonitor->VerifyFound();
1918
1919 // Finally, do a correct 1st and 2nd try:
1920 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface,
1921 &surface_present_mode_count,
1922 NULL);
1923 pass = (err == VK_SUCCESS);
1924 ASSERT_TRUE(pass);
1925 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface,
1926 &surface_present_mode_count,
1927 surface_present_modes);
1928 pass = (err == VK_SUCCESS);
1929 ASSERT_TRUE(pass);
1930
1931
1932
1933 // Create a swapchain:
1934
1935 // First, try without a pointer to swapchain_create_info:
1936 m_errorMonitor->SetDesiredFailureMsg(
1937 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1938 "called with NULL pointer");
1939 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
1940 pass = (err != VK_SUCCESS);
1941 ASSERT_TRUE(pass);
1942 m_errorMonitor->VerifyFound();
1943
1944 // Next, call with a non-NULL swapchain_create_info, that has the wrong
1945 // sType:
1946 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
1947 m_errorMonitor->SetDesiredFailureMsg(
1948 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1949 "called with the wrong value for");
1950 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1951 NULL, &swapchain);
1952 pass = (err != VK_SUCCESS);
1953 ASSERT_TRUE(pass);
1954 m_errorMonitor->VerifyFound();
1955
1956 // Next, call with a NULL swapchain pointer:
1957 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1958 swapchain_create_info.pNext = NULL;
1959 swapchain_create_info.flags = 0;
1960 m_errorMonitor->SetDesiredFailureMsg(
1961 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1962 "called with NULL pointer");
1963 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1964 NULL, NULL);
1965 pass = (err != VK_SUCCESS);
1966 ASSERT_TRUE(pass);
1967 m_errorMonitor->VerifyFound();
1968
1969// TODO: Enhance swapchain layer so that
1970// swapchain_create_info.queueFamilyIndexCount is checked against something?
1971
1972 // Next, call with a queue family index that's too large:
1973 uint32_t queueFamilyIndex[2] = {100000, 0};
1974 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
1975 swapchain_create_info.queueFamilyIndexCount = 2;
1976 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
1977 m_errorMonitor->SetDesiredFailureMsg(
1978 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1979 "called with a queueFamilyIndex that is too large");
1980 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1981 NULL, &swapchain);
1982 pass = (err != VK_SUCCESS);
1983 ASSERT_TRUE(pass);
1984 m_errorMonitor->VerifyFound();
1985
1986 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
1987 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
1988 swapchain_create_info.queueFamilyIndexCount = 1;
1989 m_errorMonitor->SetDesiredFailureMsg(
1990 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1991 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
1992 "pCreateInfo->pQueueFamilyIndices).");
1993 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1994 NULL, &swapchain);
1995 pass = (err != VK_SUCCESS);
1996 ASSERT_TRUE(pass);
1997 m_errorMonitor->VerifyFound();
1998
1999 // Next, call with an invalid imageSharingMode:
2000 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
2001 swapchain_create_info.queueFamilyIndexCount = 1;
2002 m_errorMonitor->SetDesiredFailureMsg(
2003 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2004 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
2005 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
2006 NULL, &swapchain);
2007 pass = (err != VK_SUCCESS);
2008 ASSERT_TRUE(pass);
2009 m_errorMonitor->VerifyFound();
2010 // Fix for the future:
2011// FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S SUPPORTED
2012 swapchain_create_info.queueFamilyIndexCount = 0;
2013 queueFamilyIndex[0] = 0;
2014 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
2015
2016// TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
2017
2018
2019
2020 // Get the images from a swapchain:
2021
2022
2023
2024 // Acquire an image from a swapchain:
2025
2026
2027
2028 // Present an image to a swapchain:
2029
2030
2031
2032 // Destroy the swapchain:
2033
2034
2035
2036// TODOs:
2037//
2038// - Try destroying the device without first destroying the swapchain
2039//
2040// - Try destroying the device without first destroying the surface
2041//
2042// - Try destroying the surface without first destroying the swapchain
2043
2044
2045 // Destroy the surface:
2046 vkDestroySurfaceKHR(instance(), surface, NULL);
2047
2048
2049 // Tear down the window:
2050 xcb_destroy_window(connection, xcb_window);
2051 xcb_disconnect(connection);
2052
2053#else // VK_USE_PLATFORM_XCB_KHR
2054 err = (surface == VK_NULL_HANDLE) ? VK_SUCCESS : VK_SUCCESS;
2055 pass = (err != VK_SUCCESS);
2056 ASSERT_TRUE(pass);
2057#endif // VK_USE_PLATFORM_XCB_KHR
2058}
2059
Karl Schultz6addd812016-02-02 17:17:23 -07002060TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2061 VkResult err;
2062 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002063
Karl Schultz6addd812016-02-02 17:17:23 -07002064 m_errorMonitor->SetDesiredFailureMsg(
2065 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002066 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
2067
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002068 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002069
2070 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002071 VkImage image;
2072 VkDeviceMemory mem;
2073 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002074
Karl Schultz6addd812016-02-02 17:17:23 -07002075 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2076 const int32_t tex_width = 32;
2077 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002078
Tony Barboureb254902015-07-15 12:50:33 -06002079 VkImageCreateInfo image_create_info = {};
2080 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002081 image_create_info.pNext = NULL;
2082 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2083 image_create_info.format = tex_format;
2084 image_create_info.extent.width = tex_width;
2085 image_create_info.extent.height = tex_height;
2086 image_create_info.extent.depth = 1;
2087 image_create_info.mipLevels = 1;
2088 image_create_info.arrayLayers = 1;
2089 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2090 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2091 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2092 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002093
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002094 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002095 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002096 mem_alloc.pNext = NULL;
2097 mem_alloc.allocationSize = 0;
2098 // Introduce failure, do NOT set memProps to
2099 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
2100 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002101
Chia-I Wuf7458c52015-10-26 21:10:41 +08002102 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002103 ASSERT_VK_SUCCESS(err);
2104
Karl Schultz6addd812016-02-02 17:17:23 -07002105 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002106
Mark Lobodzinski23065352015-05-29 09:32:35 -05002107 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002108
Karl Schultz6addd812016-02-02 17:17:23 -07002109 pass =
2110 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
2111 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2112 if (!pass) { // If we can't find any unmappable memory this test doesn't
2113 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002114 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002115 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002116 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002117
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002118 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002119 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002120 ASSERT_VK_SUCCESS(err);
2121
2122 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002123 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002124 ASSERT_VK_SUCCESS(err);
2125
2126 // Map memory as if to initialize the image
2127 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002128 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
2129 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002130
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002131 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002132
Chia-I Wuf7458c52015-10-26 21:10:41 +08002133 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002134}
2135
Karl Schultz6addd812016-02-02 17:17:23 -07002136TEST_F(VkLayerTest, RebindMemory) {
2137 VkResult err;
2138 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002139
Karl Schultz6addd812016-02-02 17:17:23 -07002140 m_errorMonitor->SetDesiredFailureMsg(
2141 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002142 "which has already been bound to mem object");
2143
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002144 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002145
2146 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002147 VkImage image;
2148 VkDeviceMemory mem1;
2149 VkDeviceMemory mem2;
2150 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002151
Karl Schultz6addd812016-02-02 17:17:23 -07002152 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2153 const int32_t tex_width = 32;
2154 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002155
Tony Barboureb254902015-07-15 12:50:33 -06002156 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002157 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2158 image_create_info.pNext = NULL;
2159 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2160 image_create_info.format = tex_format;
2161 image_create_info.extent.width = tex_width;
2162 image_create_info.extent.height = tex_height;
2163 image_create_info.extent.depth = 1;
2164 image_create_info.mipLevels = 1;
2165 image_create_info.arrayLayers = 1;
2166 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2167 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2168 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2169 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002170
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002171 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002172 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2173 mem_alloc.pNext = NULL;
2174 mem_alloc.allocationSize = 0;
2175 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002176
Karl Schultz6addd812016-02-02 17:17:23 -07002177 // Introduce failure, do NOT set memProps to
2178 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002179 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002180 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002181 ASSERT_VK_SUCCESS(err);
2182
Karl Schultz6addd812016-02-02 17:17:23 -07002183 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002184
2185 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002186 pass =
2187 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002188 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002189
2190 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002191 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002192 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002193 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002194 ASSERT_VK_SUCCESS(err);
2195
2196 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002197 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002198 ASSERT_VK_SUCCESS(err);
2199
Karl Schultz6addd812016-02-02 17:17:23 -07002200 // Introduce validation failure, try to bind a different memory object to
2201 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002202 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002203
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002204 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002205
Chia-I Wuf7458c52015-10-26 21:10:41 +08002206 vkDestroyImage(m_device->device(), image, NULL);
2207 vkFreeMemory(m_device->device(), mem1, NULL);
2208 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002209}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002210
Karl Schultz6addd812016-02-02 17:17:23 -07002211TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002212 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002213
Karl Schultz6addd812016-02-02 17:17:23 -07002214 m_errorMonitor->SetDesiredFailureMsg(
2215 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
2216 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002217
2218 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002219 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2220 fenceInfo.pNext = NULL;
2221 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002222
Tony Barbour300a6082015-04-07 13:44:53 -06002223 ASSERT_NO_FATAL_FAILURE(InitState());
2224 ASSERT_NO_FATAL_FAILURE(InitViewport());
2225 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2226
Tony Barbourfe3351b2015-07-28 10:17:20 -06002227 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002228 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2229 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06002230 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002231
2232 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002233
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002234 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002235 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2236 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002237 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002238 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002239 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002240 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002241 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002242 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002243 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002244
2245 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002246 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002247
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002248 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002249}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002250// This is a positive test. We used to expect error in this case but spec now
2251// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07002252TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002253 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002254 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002255 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002256 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2257 fenceInfo.pNext = NULL;
2258
Tony Barbour0b4d9562015-04-09 10:48:04 -06002259 ASSERT_NO_FATAL_FAILURE(InitState());
2260 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08002261 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002262 VkResult result = vkResetFences(m_device->device(), 1, fences);
2263 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06002264
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002265 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06002266}
Tobin Ehlis41376e12015-07-03 08:45:14 -06002267
2268TEST_F(VkLayerTest, InvalidUsageBits)
2269{
Tony Barbourf92621a2016-05-02 14:28:12 -06002270 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002271 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06002272 "Initialize buffer with wrong usage then perform copy expecting errors "
2273 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002274 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002275 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002276
2277 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06002278 VkImageObj image(m_device);
2279 // Initialize image with USAGE_INPUT_ATTACHMENT
2280 image.init(128, 128, VK_FORMAT_D32_SFLOAT_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002281 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2282 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002283
Tony Barbourf92621a2016-05-02 14:28:12 -06002284 VkImageView dsv;
2285 VkImageViewCreateInfo dsvci = {};
2286 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2287 dsvci.image = image.handle();
2288 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
2289 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
2290 dsvci.subresourceRange.layerCount = 1;
2291 dsvci.subresourceRange.baseMipLevel = 0;
2292 dsvci.subresourceRange.levelCount = 1;
2293 dsvci.subresourceRange.aspectMask =
2294 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002295
Tony Barbourf92621a2016-05-02 14:28:12 -06002296 // Create a view with depth / stencil aspect for image with different usage
2297 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002298
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002299 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002300
2301 // Initialize buffer with TRANSFER_DST usage
2302 vk_testing::Buffer buffer;
2303 VkMemoryPropertyFlags reqs = 0;
2304 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2305 VkBufferImageCopy region = {};
2306 region.bufferRowLength = 128;
2307 region.bufferImageHeight = 128;
2308 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2309 region.imageSubresource.layerCount = 1;
2310 region.imageExtent.height = 16;
2311 region.imageExtent.width = 16;
2312 region.imageExtent.depth = 1;
2313
2314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2315 "Invalid usage flag for buffer ");
2316 // Buffer usage not set to TRANSFER_SRC and image usage not set to
2317 // TRANSFER_DST
2318 BeginCommandBuffer();
2319 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
2320 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
2321 1, &region);
2322 m_errorMonitor->VerifyFound();
2323
2324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2325 "Invalid usage flag for image ");
2326 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
2327 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
2328 1, &region);
2329 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002330}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002331#endif // MEM_TRACKER_TESTS
2332
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06002333#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002334
2335TEST_F(VkLayerTest, LeakAnObject) {
2336 VkResult err;
2337
2338 TEST_DESCRIPTION(
2339 "Create a fence and destroy its device without first destroying the fence.");
2340
2341 // Note that we have to create a new device since destroying the
2342 // framework's device causes Teardown() to fail and just calling Teardown
2343 // will destroy the errorMonitor.
2344
2345 m_errorMonitor->SetDesiredFailureMsg(
2346 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2347 "OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT object");
2348
2349 ASSERT_NO_FATAL_FAILURE(InitState());
2350
2351 const std::vector<VkQueueFamilyProperties> queue_props =
2352 m_device->queue_props;
2353 std::vector<VkDeviceQueueCreateInfo> queue_info;
2354 queue_info.reserve(queue_props.size());
2355 std::vector<std::vector<float>> queue_priorities;
2356 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2357 VkDeviceQueueCreateInfo qi = {};
2358 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2359 qi.pNext = NULL;
2360 qi.queueFamilyIndex = i;
2361 qi.queueCount = queue_props[i].queueCount;
2362 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2363 qi.pQueuePriorities = queue_priorities[i].data();
2364 queue_info.push_back(qi);
2365 }
2366
2367 std::vector<const char *> device_layer_names;
2368 std::vector<const char *> device_extension_names;
2369 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
2370 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
2371 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
2372 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
2373 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
2374 device_layer_names.push_back("VK_LAYER_LUNARG_image");
2375 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
2376
2377 // The sacrificial device object
2378 VkDevice testDevice;
2379 VkDeviceCreateInfo device_create_info = {};
2380 auto features = m_device->phy().features();
2381 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2382 device_create_info.pNext = NULL;
2383 device_create_info.queueCreateInfoCount = queue_info.size();
2384 device_create_info.pQueueCreateInfos = queue_info.data();
2385 device_create_info.enabledLayerCount = device_layer_names.size();
2386 device_create_info.ppEnabledLayerNames = device_layer_names.data();
2387 device_create_info.pEnabledFeatures = &features;
2388 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2389 ASSERT_VK_SUCCESS(err);
2390
2391 VkFence fence;
2392 VkFenceCreateInfo fence_create_info = {};
2393 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2394 fence_create_info.pNext = NULL;
2395 fence_create_info.flags = 0;
2396 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2397 ASSERT_VK_SUCCESS(err);
2398
2399 // Induce failure by not calling vkDestroyFence
2400 vkDestroyDevice(testDevice, NULL);
2401 m_errorMonitor->VerifyFound();
2402}
2403
2404TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
2405
2406 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
2407 "attempt to delete them from another.");
2408
2409 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2410 "FreeCommandBuffers is attempting to free Command Buffer");
2411
2412 VkCommandPool command_pool_one;
2413 VkCommandPool command_pool_two;
2414
2415 VkCommandPoolCreateInfo pool_create_info{};
2416 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2417 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2418 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2419
2420 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2421 &command_pool_one);
2422
2423 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2424 &command_pool_two);
2425
2426 VkCommandBuffer command_buffer[9];
2427 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2428 command_buffer_allocate_info.sType =
2429 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2430 command_buffer_allocate_info.commandPool = command_pool_one;
2431 command_buffer_allocate_info.commandBufferCount = 9;
2432 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2433 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2434 command_buffer);
2435
2436 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
2437 &command_buffer[3]);
2438
2439 m_errorMonitor->VerifyFound();
2440
2441 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2442 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2443}
2444
2445TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2446 VkResult err;
2447
2448 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
2449 "attempt to delete them from another.");
2450
2451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2452 "FreeDescriptorSets is attempting to free descriptorSet");
2453
2454 ASSERT_NO_FATAL_FAILURE(InitState());
2455 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2456
2457 VkDescriptorPoolSize ds_type_count = {};
2458 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2459 ds_type_count.descriptorCount = 1;
2460
2461 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2462 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2463 ds_pool_ci.pNext = NULL;
2464 ds_pool_ci.flags = 0;
2465 ds_pool_ci.maxSets = 1;
2466 ds_pool_ci.poolSizeCount = 1;
2467 ds_pool_ci.pPoolSizes = &ds_type_count;
2468
2469 VkDescriptorPool ds_pool_one;
2470 err =
2471 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
2472 ASSERT_VK_SUCCESS(err);
2473
2474 // Create a second descriptor pool
2475 VkDescriptorPool ds_pool_two;
2476 err =
2477 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
2478 ASSERT_VK_SUCCESS(err);
2479
2480 VkDescriptorSetLayoutBinding dsl_binding = {};
2481 dsl_binding.binding = 0;
2482 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2483 dsl_binding.descriptorCount = 1;
2484 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2485 dsl_binding.pImmutableSamplers = NULL;
2486
2487 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2488 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2489 ds_layout_ci.pNext = NULL;
2490 ds_layout_ci.bindingCount = 1;
2491 ds_layout_ci.pBindings = &dsl_binding;
2492
2493 VkDescriptorSetLayout ds_layout;
2494 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2495 &ds_layout);
2496 ASSERT_VK_SUCCESS(err);
2497
2498 VkDescriptorSet descriptorSet;
2499 VkDescriptorSetAllocateInfo alloc_info = {};
2500 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2501 alloc_info.descriptorSetCount = 1;
2502 alloc_info.descriptorPool = ds_pool_one;
2503 alloc_info.pSetLayouts = &ds_layout;
2504 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2505 &descriptorSet);
2506 ASSERT_VK_SUCCESS(err);
2507
2508 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2509
2510 m_errorMonitor->VerifyFound();
2511
2512 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2513 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2514 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2515}
2516
2517TEST_F(VkLayerTest, CreateUnknownObject) {
2518 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2519 "Invalid VkImage Object ");
2520
2521 TEST_DESCRIPTION(
2522 "Pass an invalid image object handle into a Vulkan API call.");
2523
2524 ASSERT_NO_FATAL_FAILURE(InitState());
2525
2526 // Pass bogus handle into GetImageMemoryRequirements
2527 VkMemoryRequirements mem_reqs;
2528 uint64_t fakeImageHandle = 0xCADECADE;
2529 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2530
2531 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2532
2533 m_errorMonitor->VerifyFound();
2534}
2535
Karl Schultz6addd812016-02-02 17:17:23 -07002536TEST_F(VkLayerTest, PipelineNotBound) {
2537 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002538
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002539 TEST_DESCRIPTION(
2540 "Pass in an invalid pipeline object handle into a Vulkan API call.");
2541
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002543 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002544
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002545 ASSERT_NO_FATAL_FAILURE(InitState());
2546 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002547
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002548 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002549 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2550 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002551
2552 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002553 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2554 ds_pool_ci.pNext = NULL;
2555 ds_pool_ci.maxSets = 1;
2556 ds_pool_ci.poolSizeCount = 1;
2557 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002558
2559 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002560 err =
2561 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002562 ASSERT_VK_SUCCESS(err);
2563
2564 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002565 dsl_binding.binding = 0;
2566 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2567 dsl_binding.descriptorCount = 1;
2568 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2569 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002570
2571 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002572 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2573 ds_layout_ci.pNext = NULL;
2574 ds_layout_ci.bindingCount = 1;
2575 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002576
2577 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002578 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2579 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002580 ASSERT_VK_SUCCESS(err);
2581
2582 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002583 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002584 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002585 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002586 alloc_info.descriptorPool = ds_pool;
2587 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002588 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2589 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002590 ASSERT_VK_SUCCESS(err);
2591
2592 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002593 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2594 pipeline_layout_ci.pNext = NULL;
2595 pipeline_layout_ci.setLayoutCount = 1;
2596 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002597
2598 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002599 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2600 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002601 ASSERT_VK_SUCCESS(err);
2602
Mark Youngad779052016-01-06 14:26:04 -07002603 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002604
2605 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002606 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2607 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002608
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002609 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002610
Chia-I Wuf7458c52015-10-26 21:10:41 +08002611 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2612 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2613 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002614}
2615
Karl Schultz6addd812016-02-02 17:17:23 -07002616TEST_F(VkLayerTest, BindInvalidMemory) {
2617 VkResult err;
2618 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002619
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002621 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002622
Tobin Ehlisec598302015-09-15 15:02:17 -06002623 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002624
2625 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002626 VkImage image;
2627 VkDeviceMemory mem;
2628 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002629
Karl Schultz6addd812016-02-02 17:17:23 -07002630 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2631 const int32_t tex_width = 32;
2632 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002633
2634 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002635 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2636 image_create_info.pNext = NULL;
2637 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2638 image_create_info.format = tex_format;
2639 image_create_info.extent.width = tex_width;
2640 image_create_info.extent.height = tex_height;
2641 image_create_info.extent.depth = 1;
2642 image_create_info.mipLevels = 1;
2643 image_create_info.arrayLayers = 1;
2644 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2645 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2646 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2647 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002648
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002649 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002650 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2651 mem_alloc.pNext = NULL;
2652 mem_alloc.allocationSize = 0;
2653 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002654
Chia-I Wuf7458c52015-10-26 21:10:41 +08002655 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002656 ASSERT_VK_SUCCESS(err);
2657
Karl Schultz6addd812016-02-02 17:17:23 -07002658 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002659
2660 mem_alloc.allocationSize = mem_reqs.size;
2661
Karl Schultz6addd812016-02-02 17:17:23 -07002662 pass =
2663 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002664 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002665
2666 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002667 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002668 ASSERT_VK_SUCCESS(err);
2669
2670 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002671 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002672
2673 // Try to bind free memory that has been freed
2674 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2675 // This may very well return an error.
2676 (void)err;
2677
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002678 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002679
Chia-I Wuf7458c52015-10-26 21:10:41 +08002680 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002681}
2682
Karl Schultz6addd812016-02-02 17:17:23 -07002683TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2684 VkResult err;
2685 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002686
Karl Schultz6addd812016-02-02 17:17:23 -07002687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2688 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002689
Tobin Ehlisec598302015-09-15 15:02:17 -06002690 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002691
Karl Schultz6addd812016-02-02 17:17:23 -07002692 // Create an image object, allocate memory, destroy the object and then try
2693 // to bind it
2694 VkImage image;
2695 VkDeviceMemory mem;
2696 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002697
Karl Schultz6addd812016-02-02 17:17:23 -07002698 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2699 const int32_t tex_width = 32;
2700 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002701
2702 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002703 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2704 image_create_info.pNext = NULL;
2705 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2706 image_create_info.format = tex_format;
2707 image_create_info.extent.width = tex_width;
2708 image_create_info.extent.height = tex_height;
2709 image_create_info.extent.depth = 1;
2710 image_create_info.mipLevels = 1;
2711 image_create_info.arrayLayers = 1;
2712 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2713 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2714 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2715 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002716
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002717 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002718 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2719 mem_alloc.pNext = NULL;
2720 mem_alloc.allocationSize = 0;
2721 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002722
Chia-I Wuf7458c52015-10-26 21:10:41 +08002723 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002724 ASSERT_VK_SUCCESS(err);
2725
Karl Schultz6addd812016-02-02 17:17:23 -07002726 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002727
2728 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002729 pass =
2730 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002731 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002732
2733 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002734 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002735 ASSERT_VK_SUCCESS(err);
2736
2737 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002738 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002739 ASSERT_VK_SUCCESS(err);
2740
2741 // Now Try to bind memory to this destroyed object
2742 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2743 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002744 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002745
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002746 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002747
Chia-I Wuf7458c52015-10-26 21:10:41 +08002748 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002749}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002750
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002751#endif // OBJ_TRACKER_TESTS
2752
Tobin Ehlis0788f522015-05-26 16:11:58 -06002753#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002754
2755// This is a positive test. No errors should be generated.
2756TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
2757
2758 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2759 "submitted on separate queues followed by a QueueWaitIdle.");
2760
Dustin Graves48458142016-04-29 16:11:55 -06002761 if ((m_device->queue_props.empty()) ||
2762 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002763 return;
2764
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002765 m_errorMonitor->ExpectSuccess();
2766
2767 VkSemaphore semaphore;
2768 VkSemaphoreCreateInfo semaphore_create_info{};
2769 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2770 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2771 &semaphore);
2772
2773 VkCommandPool command_pool;
2774 VkCommandPoolCreateInfo pool_create_info{};
2775 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2776 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2777 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2778 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2779 &command_pool);
2780
2781 VkCommandBuffer command_buffer[2];
2782 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2783 command_buffer_allocate_info.sType =
2784 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2785 command_buffer_allocate_info.commandPool = command_pool;
2786 command_buffer_allocate_info.commandBufferCount = 2;
2787 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2788 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2789 command_buffer);
2790
2791 VkQueue queue = VK_NULL_HANDLE;
2792 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2793 1, &queue);
2794
2795 {
2796 VkCommandBufferBeginInfo begin_info{};
2797 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2798 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2799
2800 vkCmdPipelineBarrier(command_buffer[0],
2801 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2802 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2803 0, nullptr, 0, nullptr);
2804
2805 VkViewport viewport{};
2806 viewport.maxDepth = 1.0f;
2807 viewport.minDepth = 0.0f;
2808 viewport.width = 512;
2809 viewport.height = 512;
2810 viewport.x = 0;
2811 viewport.y = 0;
2812 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2813 vkEndCommandBuffer(command_buffer[0]);
2814 }
2815 {
2816 VkCommandBufferBeginInfo begin_info{};
2817 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2818 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2819
2820 VkViewport viewport{};
2821 viewport.maxDepth = 1.0f;
2822 viewport.minDepth = 0.0f;
2823 viewport.width = 512;
2824 viewport.height = 512;
2825 viewport.x = 0;
2826 viewport.y = 0;
2827 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2828 vkEndCommandBuffer(command_buffer[1]);
2829 }
2830 {
2831 VkSubmitInfo submit_info{};
2832 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2833 submit_info.commandBufferCount = 1;
2834 submit_info.pCommandBuffers = &command_buffer[0];
2835 submit_info.signalSemaphoreCount = 1;
2836 submit_info.pSignalSemaphores = &semaphore;
2837 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2838 }
2839 {
2840 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2841 VkSubmitInfo submit_info{};
2842 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2843 submit_info.commandBufferCount = 1;
2844 submit_info.pCommandBuffers = &command_buffer[1];
2845 submit_info.waitSemaphoreCount = 1;
2846 submit_info.pWaitSemaphores = &semaphore;
2847 submit_info.pWaitDstStageMask = flags;
2848 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2849 }
2850
2851 vkQueueWaitIdle(m_device->m_queue);
2852
2853 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2854 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2855 &command_buffer[0]);
2856 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2857
2858 m_errorMonitor->VerifyNotFound();
2859}
2860
2861// This is a positive test. No errors should be generated.
2862TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
2863
2864 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2865 "submitted on separate queues, the second having a fence"
2866 "followed by a QueueWaitIdle.");
2867
Dustin Graves48458142016-04-29 16:11:55 -06002868 if ((m_device->queue_props.empty()) ||
2869 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002870 return;
2871
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002872 m_errorMonitor->ExpectSuccess();
2873
2874 VkFence fence;
2875 VkFenceCreateInfo fence_create_info{};
2876 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2877 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2878
2879 VkSemaphore semaphore;
2880 VkSemaphoreCreateInfo semaphore_create_info{};
2881 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2882 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2883 &semaphore);
2884
2885 VkCommandPool command_pool;
2886 VkCommandPoolCreateInfo pool_create_info{};
2887 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2888 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2889 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2890 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2891 &command_pool);
2892
2893 VkCommandBuffer command_buffer[2];
2894 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2895 command_buffer_allocate_info.sType =
2896 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2897 command_buffer_allocate_info.commandPool = command_pool;
2898 command_buffer_allocate_info.commandBufferCount = 2;
2899 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2900 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2901 command_buffer);
2902
2903 VkQueue queue = VK_NULL_HANDLE;
2904 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2905 1, &queue);
2906
2907 {
2908 VkCommandBufferBeginInfo begin_info{};
2909 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2910 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2911
2912 vkCmdPipelineBarrier(command_buffer[0],
2913 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2914 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2915 0, nullptr, 0, nullptr);
2916
2917 VkViewport viewport{};
2918 viewport.maxDepth = 1.0f;
2919 viewport.minDepth = 0.0f;
2920 viewport.width = 512;
2921 viewport.height = 512;
2922 viewport.x = 0;
2923 viewport.y = 0;
2924 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2925 vkEndCommandBuffer(command_buffer[0]);
2926 }
2927 {
2928 VkCommandBufferBeginInfo begin_info{};
2929 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2930 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2931
2932 VkViewport viewport{};
2933 viewport.maxDepth = 1.0f;
2934 viewport.minDepth = 0.0f;
2935 viewport.width = 512;
2936 viewport.height = 512;
2937 viewport.x = 0;
2938 viewport.y = 0;
2939 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2940 vkEndCommandBuffer(command_buffer[1]);
2941 }
2942 {
2943 VkSubmitInfo submit_info{};
2944 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2945 submit_info.commandBufferCount = 1;
2946 submit_info.pCommandBuffers = &command_buffer[0];
2947 submit_info.signalSemaphoreCount = 1;
2948 submit_info.pSignalSemaphores = &semaphore;
2949 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2950 }
2951 {
2952 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2953 VkSubmitInfo submit_info{};
2954 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2955 submit_info.commandBufferCount = 1;
2956 submit_info.pCommandBuffers = &command_buffer[1];
2957 submit_info.waitSemaphoreCount = 1;
2958 submit_info.pWaitSemaphores = &semaphore;
2959 submit_info.pWaitDstStageMask = flags;
2960 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2961 }
2962
2963 vkQueueWaitIdle(m_device->m_queue);
2964
2965 vkDestroyFence(m_device->device(), fence, nullptr);
2966 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2967 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2968 &command_buffer[0]);
2969 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2970
2971 m_errorMonitor->VerifyNotFound();
2972}
2973
2974// This is a positive test. No errors should be generated.
2975TEST_F(VkLayerTest,
2976 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
2977
2978 TEST_DESCRIPTION(
2979 "Two command buffers, each in a separate QueueSubmit call "
2980 "submitted on separate queues, the second having a fence"
2981 "followed by two consecutive WaitForFences calls on the same fence.");
2982
Dustin Graves48458142016-04-29 16:11:55 -06002983 if ((m_device->queue_props.empty()) ||
2984 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002985 return;
2986
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002987 m_errorMonitor->ExpectSuccess();
2988
2989 VkFence fence;
2990 VkFenceCreateInfo fence_create_info{};
2991 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2992 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2993
2994 VkSemaphore semaphore;
2995 VkSemaphoreCreateInfo semaphore_create_info{};
2996 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2997 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2998 &semaphore);
2999
3000 VkCommandPool command_pool;
3001 VkCommandPoolCreateInfo pool_create_info{};
3002 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3003 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3004 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3005 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3006 &command_pool);
3007
3008 VkCommandBuffer command_buffer[2];
3009 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3010 command_buffer_allocate_info.sType =
3011 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3012 command_buffer_allocate_info.commandPool = command_pool;
3013 command_buffer_allocate_info.commandBufferCount = 2;
3014 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3015 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3016 command_buffer);
3017
3018 VkQueue queue = VK_NULL_HANDLE;
3019 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
3020 1, &queue);
3021
3022 {
3023 VkCommandBufferBeginInfo begin_info{};
3024 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3025 vkBeginCommandBuffer(command_buffer[0], &begin_info);
3026
3027 vkCmdPipelineBarrier(command_buffer[0],
3028 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3029 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
3030 0, nullptr, 0, nullptr);
3031
3032 VkViewport viewport{};
3033 viewport.maxDepth = 1.0f;
3034 viewport.minDepth = 0.0f;
3035 viewport.width = 512;
3036 viewport.height = 512;
3037 viewport.x = 0;
3038 viewport.y = 0;
3039 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
3040 vkEndCommandBuffer(command_buffer[0]);
3041 }
3042 {
3043 VkCommandBufferBeginInfo begin_info{};
3044 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3045 vkBeginCommandBuffer(command_buffer[1], &begin_info);
3046
3047 VkViewport viewport{};
3048 viewport.maxDepth = 1.0f;
3049 viewport.minDepth = 0.0f;
3050 viewport.width = 512;
3051 viewport.height = 512;
3052 viewport.x = 0;
3053 viewport.y = 0;
3054 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
3055 vkEndCommandBuffer(command_buffer[1]);
3056 }
3057 {
3058 VkSubmitInfo submit_info{};
3059 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3060 submit_info.commandBufferCount = 1;
3061 submit_info.pCommandBuffers = &command_buffer[0];
3062 submit_info.signalSemaphoreCount = 1;
3063 submit_info.pSignalSemaphores = &semaphore;
3064 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
3065 }
3066 {
3067 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
3068 VkSubmitInfo submit_info{};
3069 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3070 submit_info.commandBufferCount = 1;
3071 submit_info.pCommandBuffers = &command_buffer[1];
3072 submit_info.waitSemaphoreCount = 1;
3073 submit_info.pWaitSemaphores = &semaphore;
3074 submit_info.pWaitDstStageMask = flags;
3075 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
3076 }
3077
3078 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3079 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3080
3081 vkDestroyFence(m_device->device(), fence, nullptr);
3082 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
3083 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
3084 &command_buffer[0]);
3085 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3086
3087 m_errorMonitor->VerifyNotFound();
3088}
3089
3090// This is a positive test. No errors should be generated.
3091TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
3092
3093 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
3094 "submitted on separate queues, the second having a fence, "
3095 "followed by a WaitForFences call.");
3096
Dustin Graves48458142016-04-29 16:11:55 -06003097 if ((m_device->queue_props.empty()) ||
3098 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06003099 return;
3100
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003101 m_errorMonitor->ExpectSuccess();
3102
3103 VkFence fence;
3104 VkFenceCreateInfo fence_create_info{};
3105 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3106 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
3107
3108 VkSemaphore semaphore;
3109 VkSemaphoreCreateInfo semaphore_create_info{};
3110 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
3111 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
3112 &semaphore);
3113
3114 VkCommandPool command_pool;
3115 VkCommandPoolCreateInfo pool_create_info{};
3116 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3117 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3118 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3119 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3120 &command_pool);
3121
3122 VkCommandBuffer command_buffer[2];
3123 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3124 command_buffer_allocate_info.sType =
3125 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3126 command_buffer_allocate_info.commandPool = command_pool;
3127 command_buffer_allocate_info.commandBufferCount = 2;
3128 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3129 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3130 command_buffer);
3131
3132 VkQueue queue = VK_NULL_HANDLE;
3133 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
3134 1, &queue);
3135
3136
3137 {
3138 VkCommandBufferBeginInfo begin_info{};
3139 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3140 vkBeginCommandBuffer(command_buffer[0], &begin_info);
3141
3142 vkCmdPipelineBarrier(command_buffer[0],
3143 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3144 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
3145 0, nullptr, 0, nullptr);
3146
3147 VkViewport viewport{};
3148 viewport.maxDepth = 1.0f;
3149 viewport.minDepth = 0.0f;
3150 viewport.width = 512;
3151 viewport.height = 512;
3152 viewport.x = 0;
3153 viewport.y = 0;
3154 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
3155 vkEndCommandBuffer(command_buffer[0]);
3156 }
3157 {
3158 VkCommandBufferBeginInfo begin_info{};
3159 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3160 vkBeginCommandBuffer(command_buffer[1], &begin_info);
3161
3162 VkViewport viewport{};
3163 viewport.maxDepth = 1.0f;
3164 viewport.minDepth = 0.0f;
3165 viewport.width = 512;
3166 viewport.height = 512;
3167 viewport.x = 0;
3168 viewport.y = 0;
3169 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
3170 vkEndCommandBuffer(command_buffer[1]);
3171 }
3172 {
3173 VkSubmitInfo submit_info{};
3174 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3175 submit_info.commandBufferCount = 1;
3176 submit_info.pCommandBuffers = &command_buffer[0];
3177 submit_info.signalSemaphoreCount = 1;
3178 submit_info.pSignalSemaphores = &semaphore;
3179 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
3180 }
3181 {
3182 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
3183 VkSubmitInfo submit_info{};
3184 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3185 submit_info.commandBufferCount = 1;
3186 submit_info.pCommandBuffers = &command_buffer[1];
3187 submit_info.waitSemaphoreCount = 1;
3188 submit_info.pWaitSemaphores = &semaphore;
3189 submit_info.pWaitDstStageMask = flags;
3190 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
3191 }
3192
3193 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3194
3195 vkDestroyFence(m_device->device(), fence, nullptr);
3196 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
3197 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
3198 &command_buffer[0]);
3199 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3200
3201 m_errorMonitor->VerifyNotFound();
3202}
3203
3204// This is a positive test. No errors should be generated.
3205TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
3206
3207 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
3208 "on the same queue, sharing a signal/wait semaphore, the "
3209 "second having a fence, "
3210 "followed by a WaitForFences call.");
3211
3212 m_errorMonitor->ExpectSuccess();
3213
3214 VkFence fence;
3215 VkFenceCreateInfo fence_create_info{};
3216 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3217 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
3218
3219 VkSemaphore semaphore;
3220 VkSemaphoreCreateInfo semaphore_create_info{};
3221 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
3222 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
3223 &semaphore);
3224
3225 VkCommandPool command_pool;
3226 VkCommandPoolCreateInfo pool_create_info{};
3227 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3228 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3229 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3230 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3231 &command_pool);
3232
3233 VkCommandBuffer command_buffer[2];
3234 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3235 command_buffer_allocate_info.sType =
3236 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3237 command_buffer_allocate_info.commandPool = command_pool;
3238 command_buffer_allocate_info.commandBufferCount = 2;
3239 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3240 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3241 command_buffer);
3242
3243 {
3244 VkCommandBufferBeginInfo begin_info{};
3245 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3246 vkBeginCommandBuffer(command_buffer[0], &begin_info);
3247
3248 vkCmdPipelineBarrier(command_buffer[0],
3249 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3250 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
3251 0, nullptr, 0, nullptr);
3252
3253 VkViewport viewport{};
3254 viewport.maxDepth = 1.0f;
3255 viewport.minDepth = 0.0f;
3256 viewport.width = 512;
3257 viewport.height = 512;
3258 viewport.x = 0;
3259 viewport.y = 0;
3260 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
3261 vkEndCommandBuffer(command_buffer[0]);
3262 }
3263 {
3264 VkCommandBufferBeginInfo begin_info{};
3265 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3266 vkBeginCommandBuffer(command_buffer[1], &begin_info);
3267
3268 VkViewport viewport{};
3269 viewport.maxDepth = 1.0f;
3270 viewport.minDepth = 0.0f;
3271 viewport.width = 512;
3272 viewport.height = 512;
3273 viewport.x = 0;
3274 viewport.y = 0;
3275 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
3276 vkEndCommandBuffer(command_buffer[1]);
3277 }
3278 {
3279 VkSubmitInfo submit_info{};
3280 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3281 submit_info.commandBufferCount = 1;
3282 submit_info.pCommandBuffers = &command_buffer[0];
3283 submit_info.signalSemaphoreCount = 1;
3284 submit_info.pSignalSemaphores = &semaphore;
3285 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
3286 }
3287 {
3288 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
3289 VkSubmitInfo submit_info{};
3290 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3291 submit_info.commandBufferCount = 1;
3292 submit_info.pCommandBuffers = &command_buffer[1];
3293 submit_info.waitSemaphoreCount = 1;
3294 submit_info.pWaitSemaphores = &semaphore;
3295 submit_info.pWaitDstStageMask = flags;
3296 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
3297 }
3298
3299 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3300
3301 vkDestroyFence(m_device->device(), fence, nullptr);
3302 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
3303 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
3304 &command_buffer[0]);
3305 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3306
3307 m_errorMonitor->VerifyNotFound();
3308}
3309
3310// This is a positive test. No errors should be generated.
3311TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
3312
3313 TEST_DESCRIPTION(
3314 "Two command buffers, each in a separate QueueSubmit call "
3315 "on the same queue, no fences, followed by a third QueueSubmit with NO "
3316 "SubmitInfos but with a fence, followed by a WaitForFences call.");
3317
3318 m_errorMonitor->ExpectSuccess();
3319
3320 VkFence fence;
3321 VkFenceCreateInfo fence_create_info{};
3322 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3323 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
3324
3325 VkCommandPool command_pool;
3326 VkCommandPoolCreateInfo pool_create_info{};
3327 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3328 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3329 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3330 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3331 &command_pool);
3332
3333 VkCommandBuffer command_buffer[2];
3334 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3335 command_buffer_allocate_info.sType =
3336 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3337 command_buffer_allocate_info.commandPool = command_pool;
3338 command_buffer_allocate_info.commandBufferCount = 2;
3339 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3340 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3341 command_buffer);
3342
3343 {
3344 VkCommandBufferBeginInfo begin_info{};
3345 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3346 vkBeginCommandBuffer(command_buffer[0], &begin_info);
3347
3348 vkCmdPipelineBarrier(command_buffer[0],
3349 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3350 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
3351 0, nullptr, 0, nullptr);
3352
3353 VkViewport viewport{};
3354 viewport.maxDepth = 1.0f;
3355 viewport.minDepth = 0.0f;
3356 viewport.width = 512;
3357 viewport.height = 512;
3358 viewport.x = 0;
3359 viewport.y = 0;
3360 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
3361 vkEndCommandBuffer(command_buffer[0]);
3362 }
3363 {
3364 VkCommandBufferBeginInfo begin_info{};
3365 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3366 vkBeginCommandBuffer(command_buffer[1], &begin_info);
3367
3368 VkViewport viewport{};
3369 viewport.maxDepth = 1.0f;
3370 viewport.minDepth = 0.0f;
3371 viewport.width = 512;
3372 viewport.height = 512;
3373 viewport.x = 0;
3374 viewport.y = 0;
3375 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
3376 vkEndCommandBuffer(command_buffer[1]);
3377 }
3378 {
3379 VkSubmitInfo submit_info{};
3380 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3381 submit_info.commandBufferCount = 1;
3382 submit_info.pCommandBuffers = &command_buffer[0];
3383 submit_info.signalSemaphoreCount = 0;
3384 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
3385 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
3386 }
3387 {
3388 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
3389 VkSubmitInfo submit_info{};
3390 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3391 submit_info.commandBufferCount = 1;
3392 submit_info.pCommandBuffers = &command_buffer[1];
3393 submit_info.waitSemaphoreCount = 0;
3394 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
3395 submit_info.pWaitDstStageMask = flags;
3396 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
3397 }
3398
3399 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
3400
3401 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3402
3403 vkDestroyFence(m_device->device(), fence, nullptr);
3404 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
3405 &command_buffer[0]);
3406 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3407
3408 m_errorMonitor->VerifyNotFound();
3409}
3410
3411// This is a positive test. No errors should be generated.
3412TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
3413
3414 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
3415 "on the same queue, the second having a fence, followed "
3416 "by a WaitForFences call.");
3417
3418 m_errorMonitor->ExpectSuccess();
3419
3420 VkFence fence;
3421 VkFenceCreateInfo fence_create_info{};
3422 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3423 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
3424
3425 VkCommandPool command_pool;
3426 VkCommandPoolCreateInfo pool_create_info{};
3427 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3428 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3429 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3430 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3431 &command_pool);
3432
3433 VkCommandBuffer command_buffer[2];
3434 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3435 command_buffer_allocate_info.sType =
3436 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3437 command_buffer_allocate_info.commandPool = command_pool;
3438 command_buffer_allocate_info.commandBufferCount = 2;
3439 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3440 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3441 command_buffer);
3442
3443 {
3444 VkCommandBufferBeginInfo begin_info{};
3445 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3446 vkBeginCommandBuffer(command_buffer[0], &begin_info);
3447
3448 vkCmdPipelineBarrier(command_buffer[0],
3449 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3450 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
3451 0, nullptr, 0, nullptr);
3452
3453 VkViewport viewport{};
3454 viewport.maxDepth = 1.0f;
3455 viewport.minDepth = 0.0f;
3456 viewport.width = 512;
3457 viewport.height = 512;
3458 viewport.x = 0;
3459 viewport.y = 0;
3460 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
3461 vkEndCommandBuffer(command_buffer[0]);
3462 }
3463 {
3464 VkCommandBufferBeginInfo begin_info{};
3465 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3466 vkBeginCommandBuffer(command_buffer[1], &begin_info);
3467
3468 VkViewport viewport{};
3469 viewport.maxDepth = 1.0f;
3470 viewport.minDepth = 0.0f;
3471 viewport.width = 512;
3472 viewport.height = 512;
3473 viewport.x = 0;
3474 viewport.y = 0;
3475 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
3476 vkEndCommandBuffer(command_buffer[1]);
3477 }
3478 {
3479 VkSubmitInfo submit_info{};
3480 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3481 submit_info.commandBufferCount = 1;
3482 submit_info.pCommandBuffers = &command_buffer[0];
3483 submit_info.signalSemaphoreCount = 0;
3484 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
3485 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
3486 }
3487 {
3488 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
3489 VkSubmitInfo submit_info{};
3490 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3491 submit_info.commandBufferCount = 1;
3492 submit_info.pCommandBuffers = &command_buffer[1];
3493 submit_info.waitSemaphoreCount = 0;
3494 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
3495 submit_info.pWaitDstStageMask = flags;
3496 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
3497 }
3498
3499 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3500
3501 vkDestroyFence(m_device->device(), fence, nullptr);
3502 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
3503 &command_buffer[0]);
3504 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3505
3506 m_errorMonitor->VerifyNotFound();
3507}
3508
3509// This is a positive test. No errors should be generated.
3510TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
3511
3512 TEST_DESCRIPTION(
3513 "Two command buffers each in a separate SubmitInfo sent in a single "
3514 "QueueSubmit call followed by a WaitForFences call.");
3515
3516 m_errorMonitor->ExpectSuccess();
3517
3518 VkFence fence;
3519 VkFenceCreateInfo fence_create_info{};
3520 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3521 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
3522
3523 VkSemaphore semaphore;
3524 VkSemaphoreCreateInfo semaphore_create_info{};
3525 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
3526 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
3527 &semaphore);
3528
3529 VkCommandPool command_pool;
3530 VkCommandPoolCreateInfo pool_create_info{};
3531 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3532 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3533 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3534 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3535 &command_pool);
3536
3537 VkCommandBuffer command_buffer[2];
3538 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3539 command_buffer_allocate_info.sType =
3540 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3541 command_buffer_allocate_info.commandPool = command_pool;
3542 command_buffer_allocate_info.commandBufferCount = 2;
3543 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3544 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3545 command_buffer);
3546
3547 {
3548 VkCommandBufferBeginInfo begin_info{};
3549 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3550 vkBeginCommandBuffer(command_buffer[0], &begin_info);
3551
3552 vkCmdPipelineBarrier(command_buffer[0],
3553 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3554 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
3555 0, nullptr, 0, nullptr);
3556
3557 VkViewport viewport{};
3558 viewport.maxDepth = 1.0f;
3559 viewport.minDepth = 0.0f;
3560 viewport.width = 512;
3561 viewport.height = 512;
3562 viewport.x = 0;
3563 viewport.y = 0;
3564 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
3565 vkEndCommandBuffer(command_buffer[0]);
3566 }
3567 {
3568 VkCommandBufferBeginInfo begin_info{};
3569 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3570 vkBeginCommandBuffer(command_buffer[1], &begin_info);
3571
3572 VkViewport viewport{};
3573 viewport.maxDepth = 1.0f;
3574 viewport.minDepth = 0.0f;
3575 viewport.width = 512;
3576 viewport.height = 512;
3577 viewport.x = 0;
3578 viewport.y = 0;
3579 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
3580 vkEndCommandBuffer(command_buffer[1]);
3581 }
3582 {
3583 VkSubmitInfo submit_info[2];
3584 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
3585
3586 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3587 submit_info[0].pNext = NULL;
3588 submit_info[0].commandBufferCount = 1;
3589 submit_info[0].pCommandBuffers = &command_buffer[0];
3590 submit_info[0].signalSemaphoreCount = 1;
3591 submit_info[0].pSignalSemaphores = &semaphore;
3592 submit_info[0].waitSemaphoreCount = 0;
3593 submit_info[0].pWaitSemaphores = NULL;
3594 submit_info[0].pWaitDstStageMask = 0;
3595
3596 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3597 submit_info[1].pNext = NULL;
3598 submit_info[1].commandBufferCount = 1;
3599 submit_info[1].pCommandBuffers = &command_buffer[1];
3600 submit_info[1].waitSemaphoreCount = 1;
3601 submit_info[1].pWaitSemaphores = &semaphore;
3602 submit_info[1].pWaitDstStageMask = flags;
3603 submit_info[1].signalSemaphoreCount = 0;
3604 submit_info[1].pSignalSemaphores = NULL;
3605 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
3606 }
3607
3608 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3609
3610 vkDestroyFence(m_device->device(), fence, nullptr);
3611 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
3612 &command_buffer[0]);
3613 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3614
3615 m_errorMonitor->VerifyNotFound();
3616}
3617
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003618TEST_F(VkLayerTest, DynamicStatesNotBound) {
3619 TEST_DESCRIPTION(
3620 "Run a series of simple draw calls to validate all the different "
3621 "failure cases that can occur when dynamic state is required but not "
3622 "correctly bound."
3623 "Here are the different dynamic state cases verified by this test:\n"
3624 "-Line Width\n-Depth Bias\n-Viewport State\n-Scissor State\n-Blend "
3625 "State\n-Depth Bounds\n-Stencil Read Mask\n-Stencil Write "
3626 "Mask\n-Stencil Reference");
3627
3628 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07003629 m_errorMonitor->SetDesiredFailureMsg(
3630 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003631 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003632 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3633 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003634 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003635 // Dynamic depth bias
Karl Schultz6addd812016-02-02 17:17:23 -07003636 m_errorMonitor->SetDesiredFailureMsg(
3637 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003638 "Dynamic depth bias state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003639 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3640 BsoFailDepthBias);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003641 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003642 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07003643 m_errorMonitor->SetDesiredFailureMsg(
3644 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003645 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003646 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3647 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003648 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003649 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07003650 m_errorMonitor->SetDesiredFailureMsg(
3651 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003652 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003653 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3654 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003655 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003656 // Dynamic blend state
Karl Schultz6addd812016-02-02 17:17:23 -07003657 m_errorMonitor->SetDesiredFailureMsg(
3658 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003659 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003660 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3661 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003662 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003663 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07003664 m_errorMonitor->SetDesiredFailureMsg(
3665 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003666 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003667 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3668 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003669 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003670 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07003671 m_errorMonitor->SetDesiredFailureMsg(
3672 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003673 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003674 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3675 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003676 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003677 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07003678 m_errorMonitor->SetDesiredFailureMsg(
3679 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003680 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003681 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3682 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003683 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06003684}
3685
Karl Schultz6addd812016-02-02 17:17:23 -07003686TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003687 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003688
Karl Schultz6addd812016-02-02 17:17:23 -07003689 m_errorMonitor->SetDesiredFailureMsg(
3690 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3691 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
3692 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003693
3694 VkFenceCreateInfo fenceInfo = {};
3695 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3696 fenceInfo.pNext = NULL;
3697 fenceInfo.flags = 0;
3698
3699 ASSERT_NO_FATAL_FAILURE(InitState());
3700 ASSERT_NO_FATAL_FAILURE(InitViewport());
3701 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3702
Karl Schultz6addd812016-02-02 17:17:23 -07003703 // We luck out b/c by default the framework creates CB w/ the
3704 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003705 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003706 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
3707 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003708 EndCommandBuffer();
3709
3710 testFence.init(*m_device, fenceInfo);
3711
3712 // Bypass framework since it does the waits automatically
3713 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003714 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003715 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3716 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003717 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003718 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003719 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003720 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003721 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003722 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003723 submit_info.pSignalSemaphores = NULL;
3724
Karl Schultz6addd812016-02-02 17:17:23 -07003725 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
3726 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003727
Karl Schultz6addd812016-02-02 17:17:23 -07003728 // Cause validation error by re-submitting cmd buffer that should only be
3729 // submitted once
3730 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003731
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003732 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003733}
3734
Karl Schultz6addd812016-02-02 17:17:23 -07003735TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003736 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07003737 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003738
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003739 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003740 "Unable to allocate 1 descriptors of "
3741 "type "
3742 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003743
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003744 ASSERT_NO_FATAL_FAILURE(InitState());
3745 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003746
Karl Schultz6addd812016-02-02 17:17:23 -07003747 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
3748 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003749 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003750 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3751 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003752
3753 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003754 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3755 ds_pool_ci.pNext = NULL;
3756 ds_pool_ci.flags = 0;
3757 ds_pool_ci.maxSets = 1;
3758 ds_pool_ci.poolSizeCount = 1;
3759 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003760
3761 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003762 err =
3763 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003764 ASSERT_VK_SUCCESS(err);
3765
3766 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003767 dsl_binding.binding = 0;
3768 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3769 dsl_binding.descriptorCount = 1;
3770 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3771 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003772
3773 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003774 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3775 ds_layout_ci.pNext = NULL;
3776 ds_layout_ci.bindingCount = 1;
3777 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003778
3779 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003780 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3781 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003782 ASSERT_VK_SUCCESS(err);
3783
3784 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003785 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003786 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003787 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003788 alloc_info.descriptorPool = ds_pool;
3789 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003790 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3791 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003792
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003793 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003794
Chia-I Wuf7458c52015-10-26 21:10:41 +08003795 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3796 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003797}
3798
Karl Schultz6addd812016-02-02 17:17:23 -07003799TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
3800 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06003801
Karl Schultz6addd812016-02-02 17:17:23 -07003802 m_errorMonitor->SetDesiredFailureMsg(
3803 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3804 "It is invalid to call vkFreeDescriptorSets() with a pool created "
3805 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003806
Tobin Ehlise735c692015-10-08 13:13:50 -06003807 ASSERT_NO_FATAL_FAILURE(InitState());
3808 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06003809
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003810 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003811 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3812 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06003813
3814 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003815 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3816 ds_pool_ci.pNext = NULL;
3817 ds_pool_ci.maxSets = 1;
3818 ds_pool_ci.poolSizeCount = 1;
3819 ds_pool_ci.flags = 0;
3820 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
3821 // app can only call vkResetDescriptorPool on this pool.;
3822 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06003823
3824 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003825 err =
3826 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06003827 ASSERT_VK_SUCCESS(err);
3828
3829 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003830 dsl_binding.binding = 0;
3831 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3832 dsl_binding.descriptorCount = 1;
3833 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3834 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06003835
3836 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003837 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3838 ds_layout_ci.pNext = NULL;
3839 ds_layout_ci.bindingCount = 1;
3840 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06003841
3842 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003843 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3844 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06003845 ASSERT_VK_SUCCESS(err);
3846
3847 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003848 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003849 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003850 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003851 alloc_info.descriptorPool = ds_pool;
3852 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003853 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3854 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06003855 ASSERT_VK_SUCCESS(err);
3856
3857 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003858 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06003859
Chia-I Wuf7458c52015-10-26 21:10:41 +08003860 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3861 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06003862}
3863
Karl Schultz6addd812016-02-02 17:17:23 -07003864TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003865 // Attempt to clear Descriptor Pool with bad object.
3866 // ObjectTracker should catch this.
3867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3868 "Invalid VkDescriptorPool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003869 uint64_t fake_pool_handle = 0xbaad6001;
3870 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
3871 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06003872 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003873}
3874
Karl Schultz6addd812016-02-02 17:17:23 -07003875TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003876 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
3877 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003878 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06003879 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003880
3881 uint64_t fake_set_handle = 0xbaad6001;
3882 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003883 VkResult err;
3884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3885 "Invalid VkDescriptorSet Object 0xbaad6001");
3886
3887 ASSERT_NO_FATAL_FAILURE(InitState());
3888
3889 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
3890 layout_bindings[0].binding = 0;
3891 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3892 layout_bindings[0].descriptorCount = 1;
3893 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3894 layout_bindings[0].pImmutableSamplers = NULL;
3895
3896 VkDescriptorSetLayout descriptor_set_layout;
3897 VkDescriptorSetLayoutCreateInfo dslci = {};
3898 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3899 dslci.pNext = NULL;
3900 dslci.bindingCount = 1;
3901 dslci.pBindings = layout_bindings;
3902 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003903 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003904
3905 VkPipelineLayout pipeline_layout;
3906 VkPipelineLayoutCreateInfo plci = {};
3907 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3908 plci.pNext = NULL;
3909 plci.setLayoutCount = 1;
3910 plci.pSetLayouts = &descriptor_set_layout;
3911 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003912 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003913
3914 BeginCommandBuffer();
3915 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003916 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06003917 m_errorMonitor->VerifyFound();
3918 EndCommandBuffer();
3919 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
3920 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003921}
3922
Karl Schultz6addd812016-02-02 17:17:23 -07003923TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003924 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
3925 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003926 uint64_t fake_layout_handle = 0xbaad6001;
3927 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3929 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
3930
3931 VkPipelineLayout pipeline_layout;
3932 VkPipelineLayoutCreateInfo plci = {};
3933 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3934 plci.pNext = NULL;
3935 plci.setLayoutCount = 1;
3936 plci.pSetLayouts = &bad_layout;
3937 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
3938
3939 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003940}
3941
Karl Schultz6addd812016-02-02 17:17:23 -07003942TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003943 // Attempt to bind an invalid Pipeline to a valid Command Buffer
3944 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003945 // Create a valid cmd buffer
3946 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003947 uint64_t fake_pipeline_handle = 0xbaad6001;
3948 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3950 "Invalid VkPipeline Object 0xbaad6001");
3951 ASSERT_NO_FATAL_FAILURE(InitState());
3952 BeginCommandBuffer();
3953 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3954 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
3955 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06003956
3957 // Now issue a draw call with no pipeline bound
3958 m_errorMonitor->SetDesiredFailureMsg(
3959 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3960 "At Draw/Dispatch time no valid VkPipeline is bound!");
3961 ASSERT_NO_FATAL_FAILURE(InitState());
3962 BeginCommandBuffer();
3963 Draw(1, 0, 0, 0);
3964 m_errorMonitor->VerifyFound();
3965 // Finally same check once more but with Dispatch/Compute
3966 m_errorMonitor->SetDesiredFailureMsg(
3967 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3968 "At Draw/Dispatch time no valid VkPipeline is bound!");
3969 ASSERT_NO_FATAL_FAILURE(InitState());
3970 BeginCommandBuffer();
3971 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
3972 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003973}
3974
Karl Schultz6addd812016-02-02 17:17:23 -07003975TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
3976 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
3977 // CommandBuffer
3978 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003979
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003981 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003982
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003983 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06003984 ASSERT_NO_FATAL_FAILURE(InitViewport());
3985 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003986 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003987 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3988 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003989
3990 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003991 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3992 ds_pool_ci.pNext = NULL;
3993 ds_pool_ci.maxSets = 1;
3994 ds_pool_ci.poolSizeCount = 1;
3995 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06003996
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003997 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003998 err =
3999 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004000 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004001
Tony Barboureb254902015-07-15 12:50:33 -06004002 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004003 dsl_binding.binding = 0;
4004 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4005 dsl_binding.descriptorCount = 1;
4006 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4007 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004008
Tony Barboureb254902015-07-15 12:50:33 -06004009 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004010 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4011 ds_layout_ci.pNext = NULL;
4012 ds_layout_ci.bindingCount = 1;
4013 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004014 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004015 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4016 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004017 ASSERT_VK_SUCCESS(err);
4018
4019 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004020 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004021 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004022 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004023 alloc_info.descriptorPool = ds_pool;
4024 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004025 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4026 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004027 ASSERT_VK_SUCCESS(err);
4028
Tony Barboureb254902015-07-15 12:50:33 -06004029 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004030 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4031 pipeline_layout_ci.pNext = NULL;
4032 pipeline_layout_ci.setLayoutCount = 1;
4033 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004034
4035 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004036 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4037 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004038 ASSERT_VK_SUCCESS(err);
4039
Karl Schultz6addd812016-02-02 17:17:23 -07004040 VkShaderObj vs(m_device, bindStateVertShaderText,
4041 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06004042 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07004043 // on more devices
4044 VkShaderObj fs(m_device, bindStateFragShaderText,
4045 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004046
Tony Barbourc95e4ac2015-08-04 17:05:26 -06004047 VkPipelineObj pipe(m_device);
4048 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004049 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06004050 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06004051 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06004052
4053 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004054 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4055 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4056 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4057 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4058 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004059
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004060 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004061
Chia-I Wuf7458c52015-10-26 21:10:41 +08004062 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4063 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4064 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004065}
4066
Karl Schultz6addd812016-02-02 17:17:23 -07004067TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004068 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07004069 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004070
Karl Schultz6addd812016-02-02 17:17:23 -07004071 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06004072 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
4073 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004074
4075 ASSERT_NO_FATAL_FAILURE(InitState());
4076 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004077 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
4078 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004079
4080 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004081 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4082 ds_pool_ci.pNext = NULL;
4083 ds_pool_ci.maxSets = 1;
4084 ds_pool_ci.poolSizeCount = 1;
4085 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004086
4087 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004088 err =
4089 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004090 ASSERT_VK_SUCCESS(err);
4091
4092 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004093 dsl_binding.binding = 0;
4094 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
4095 dsl_binding.descriptorCount = 1;
4096 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4097 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004098
4099 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004100 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4101 ds_layout_ci.pNext = NULL;
4102 ds_layout_ci.bindingCount = 1;
4103 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004104 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004105 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4106 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004107 ASSERT_VK_SUCCESS(err);
4108
4109 VkDescriptorSet descriptorSet;
4110 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004111 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004112 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004113 alloc_info.descriptorPool = ds_pool;
4114 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004115 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4116 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004117 ASSERT_VK_SUCCESS(err);
4118
Karl Schultz6addd812016-02-02 17:17:23 -07004119 VkBufferView view =
4120 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004121 VkWriteDescriptorSet descriptor_write;
4122 memset(&descriptor_write, 0, sizeof(descriptor_write));
4123 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4124 descriptor_write.dstSet = descriptorSet;
4125 descriptor_write.dstBinding = 0;
4126 descriptor_write.descriptorCount = 1;
4127 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
4128 descriptor_write.pTexelBufferView = &view;
4129
4130 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4131
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004132 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004133
4134 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4135 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4136}
4137
Karl Schultz6addd812016-02-02 17:17:23 -07004138TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
4139 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
4140 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07004141 // 1. No dynamicOffset supplied
4142 // 2. Too many dynamicOffsets supplied
4143 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07004144 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004145 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004146 " requires 1 dynamicOffsets, but only "
4147 "0 dynamicOffsets are left in "
4148 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004149
4150 ASSERT_NO_FATAL_FAILURE(InitState());
4151 ASSERT_NO_FATAL_FAILURE(InitViewport());
4152 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4153
4154 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004155 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
4156 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004157
4158 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004159 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4160 ds_pool_ci.pNext = NULL;
4161 ds_pool_ci.maxSets = 1;
4162 ds_pool_ci.poolSizeCount = 1;
4163 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004164
4165 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004166 err =
4167 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004168 ASSERT_VK_SUCCESS(err);
4169
4170 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004171 dsl_binding.binding = 0;
4172 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
4173 dsl_binding.descriptorCount = 1;
4174 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4175 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004176
4177 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004178 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4179 ds_layout_ci.pNext = NULL;
4180 ds_layout_ci.bindingCount = 1;
4181 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004182 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004183 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4184 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004185 ASSERT_VK_SUCCESS(err);
4186
4187 VkDescriptorSet descriptorSet;
4188 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004189 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004190 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004191 alloc_info.descriptorPool = ds_pool;
4192 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004193 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4194 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004195 ASSERT_VK_SUCCESS(err);
4196
4197 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004198 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4199 pipeline_layout_ci.pNext = NULL;
4200 pipeline_layout_ci.setLayoutCount = 1;
4201 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004202
4203 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004204 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4205 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004206 ASSERT_VK_SUCCESS(err);
4207
4208 // Create a buffer to update the descriptor with
4209 uint32_t qfi = 0;
4210 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004211 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4212 buffCI.size = 1024;
4213 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4214 buffCI.queueFamilyIndexCount = 1;
4215 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004216
4217 VkBuffer dyub;
4218 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4219 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06004220 // Allocate memory and bind to buffer so we can make it to the appropriate
4221 // error
4222 VkMemoryAllocateInfo mem_alloc = {};
4223 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4224 mem_alloc.pNext = NULL;
4225 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12004226 mem_alloc.memoryTypeIndex = 0;
4227
4228 VkMemoryRequirements memReqs;
4229 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
4230 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
4231 0);
4232 if (!pass) {
4233 vkDestroyBuffer(m_device->device(), dyub, NULL);
4234 return;
4235 }
4236
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06004237 VkDeviceMemory mem;
4238 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
4239 ASSERT_VK_SUCCESS(err);
4240 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4241 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004242 // Correctly update descriptor to avoid "NOT_UPDATED" error
4243 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004244 buffInfo.buffer = dyub;
4245 buffInfo.offset = 0;
4246 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004247
4248 VkWriteDescriptorSet descriptor_write;
4249 memset(&descriptor_write, 0, sizeof(descriptor_write));
4250 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4251 descriptor_write.dstSet = descriptorSet;
4252 descriptor_write.dstBinding = 0;
4253 descriptor_write.descriptorCount = 1;
4254 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
4255 descriptor_write.pBufferInfo = &buffInfo;
4256
4257 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4258
4259 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004260 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4261 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4262 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004263 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07004264 uint32_t pDynOff[2] = {512, 756};
4265 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07004266 m_errorMonitor->SetDesiredFailureMsg(
4267 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07004268 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07004269 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4270 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4271 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12004272 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07004273 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06004274 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4275 " dynamic offset 512 combined with "
4276 "offset 0 and range 1024 that "
4277 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07004278 // Create PSO to be used for draw-time errors below
4279 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004280 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07004281 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07004282 "out gl_PerVertex { \n"
4283 " vec4 gl_Position;\n"
4284 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07004285 "void main(){\n"
4286 " gl_Position = vec4(1);\n"
4287 "}\n";
4288 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004289 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07004290 "\n"
4291 "layout(location=0) out vec4 x;\n"
4292 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
4293 "void main(){\n"
4294 " x = vec4(bar.y);\n"
4295 "}\n";
4296 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4297 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4298 VkPipelineObj pipe(m_device);
4299 pipe.AddShader(&vs);
4300 pipe.AddShader(&fs);
4301 pipe.AddColorAttachment();
4302 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4303
Karl Schultz6addd812016-02-02 17:17:23 -07004304 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4305 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4306 // This update should succeed, but offset size of 512 will overstep buffer
4307 // /w range 1024 & size 1024
4308 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4309 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4310 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07004311 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004312 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004313
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06004314 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06004315 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06004316
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004317 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4318 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4319}
4320
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004321TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004322 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004323 ASSERT_NO_FATAL_FAILURE(InitState());
4324 ASSERT_NO_FATAL_FAILURE(InitViewport());
4325 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4326
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004327 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004328 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004329 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4330 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4331 pipeline_layout_ci.pushConstantRangeCount = 1;
4332 pipeline_layout_ci.pPushConstantRanges = &pc_range;
4333
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004334 //
4335 // Check for invalid push constant ranges in pipeline layouts.
4336 //
4337 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06004338 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004339 char const *msg;
4340 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004341
Karl Schultzc81037d2016-05-12 08:11:23 -06004342 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
4343 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
4344 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
4345 "vkCreatePipelineLayout() call has push constants index 0 with "
4346 "size 0."},
4347 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
4348 "vkCreatePipelineLayout() call has push constants index 0 with "
4349 "size 1."},
4350 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
4351 "vkCreatePipelineLayout() call has push constants index 0 with "
4352 "size 1."},
4353 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
4354 "vkCreatePipelineLayout() call has push constants index 0 with "
4355 "size 0."},
4356 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
4357 "vkCreatePipelineLayout() call has push constants index 0 with "
4358 "offset 1. Offset must"},
4359 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
4360 "vkCreatePipelineLayout() call has push constants index 0 "
4361 "with offset "},
4362 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
4363 "vkCreatePipelineLayout() call has push constants "
4364 "index 0 with offset "},
4365 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
4366 "vkCreatePipelineLayout() call has push constants index 0 "
4367 "with offset "},
4368 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
4369 "vkCreatePipelineLayout() call has push "
4370 "constants index 0 with offset "},
4371 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
4372 "vkCreatePipelineLayout() call has push "
4373 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004374 }};
4375
4376 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06004377 for (const auto &iter : range_tests) {
4378 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4380 iter.msg);
4381 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
4382 NULL, &pipeline_layout);
4383 m_errorMonitor->VerifyFound();
4384 if (VK_SUCCESS == err) {
4385 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4386 }
4387 }
4388
4389 // Check for invalid stage flag
4390 pc_range.offset = 0;
4391 pc_range.size = 16;
4392 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004393 m_errorMonitor->SetDesiredFailureMsg(
4394 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004395 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004396 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4397 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004398 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004399 if (VK_SUCCESS == err) {
4400 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4401 }
4402
4403 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06004404 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004405 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06004406 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004407 char const *msg;
4408 };
4409
Karl Schultzc81037d2016-05-12 08:11:23 -06004410 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004411 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4412 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4413 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4414 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4415 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
4416 "vkCreatePipelineLayout() call has push constants with overlapping "
4417 "ranges: 0:[0, 4), 1:[0, 4)"},
4418 {
4419 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4420 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
4421 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
4422 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
4423 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
4424 "vkCreatePipelineLayout() call has push constants with "
4425 "overlapping "
4426 "ranges: 3:[12, 20), 4:[16, 20)",
4427 },
4428 {
4429 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
4430 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
4431 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
4432 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
4433 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
4434 "vkCreatePipelineLayout() call has push constants with "
4435 "overlapping "
4436 "ranges: 0:[16, 20), 1:[12, 20)",
4437 },
4438 {
4439 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
4440 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
4441 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
4442 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
4443 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
4444 "vkCreatePipelineLayout() call has push constants with "
4445 "overlapping "
4446 "ranges: 0:[16, 20), 3:[12, 20)",
4447 },
4448 {
4449 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
4450 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
4451 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
4452 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
4453 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
4454 "vkCreatePipelineLayout() call has push constants with "
4455 "overlapping "
4456 "ranges: 0:[16, 20), 2:[4, 100)",
4457 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004458
Karl Schultzc81037d2016-05-12 08:11:23 -06004459 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004460 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06004461 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
4462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004463 iter.msg);
4464 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
4465 NULL, &pipeline_layout);
4466 m_errorMonitor->VerifyFound();
4467 if (VK_SUCCESS == err) {
4468 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4469 }
4470 }
4471
4472 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06004473 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
4474 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4475 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
4476 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
4477 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
4478 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
4479 ""},
4480 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
4481 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
4482 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
4483 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
4484 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
4485 ""}}};
4486 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004487 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
4488 m_errorMonitor->ExpectSuccess();
4489 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
4490 NULL, &pipeline_layout);
4491 m_errorMonitor->VerifyNotFound();
4492 if (VK_SUCCESS == err) {
4493 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4494 }
4495 }
4496
4497 //
4498 // CmdPushConstants tests
4499 //
Karl Schultzc81037d2016-05-12 08:11:23 -06004500 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004501
4502 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06004503 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
4504 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
4505 "vkCmdPushConstants() call has push constants with size 0. Size "
4506 "must be greater than zero and a multiple of 4."},
4507 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
4508 "vkCmdPushConstants() call has push constants with size 1. Size "
4509 "must be greater than zero and a multiple of 4."},
4510 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
4511 "vkCmdPushConstants() call has push constants with size 1. Size "
4512 "must be greater than zero and a multiple of 4."},
4513 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
4514 "vkCmdPushConstants() call has push constants with offset 1. "
4515 "Offset must be a multiple of 4."},
4516 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
4517 "vkCmdPushConstants() call has push constants with offset 1. "
4518 "Offset must be a multiple of 4."},
4519 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
4520 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
4521 "0x1 not within flag-matching ranges in pipeline layout"},
4522 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
4523 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
4524 "0x1 not within flag-matching ranges in pipeline layout"},
4525 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
4526 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
4527 "0x1 not within flag-matching ranges in pipeline layout"},
4528 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
4529 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
4530 "0x1 not within flag-matching ranges in pipeline layout"},
4531 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
4532 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
4533 "any of the ranges in pipeline layout"},
4534 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
4535 0, 16},
4536 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
4537 "any of the ranges in pipeline layout"},
4538 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004539 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06004540 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004541 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06004542 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004543 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06004544 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004545 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06004546 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004547 "vkCmdPushConstants() call has push constants with offset "},
4548 }};
4549
4550 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06004551 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004552 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06004553 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004554 };
Karl Schultzc81037d2016-05-12 08:11:23 -06004555 pipeline_layout_ci.pushConstantRangeCount =
4556 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004557 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004558 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4559 &pipeline_layout);
4560 ASSERT_VK_SUCCESS(err);
4561 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06004562 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004563 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4564 iter.msg);
4565 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06004566 iter.range.stageFlags, iter.range.offset,
4567 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004568 m_errorMonitor->VerifyFound();
4569 }
4570
4571 // Check for invalid stage flag
4572 m_errorMonitor->SetDesiredFailureMsg(
4573 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4574 "vkCmdPushConstants() call has no stageFlags set.");
4575 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06004576 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004577 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06004578 EndCommandBuffer();
4579 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
4580 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004581
Karl Schultzc81037d2016-05-12 08:11:23 -06004582 // overlapping range tests with cmd
4583 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
4584 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
4585 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
4586 "0x1 not within flag-matching ranges in pipeline layout"},
4587 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
4588 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
4589 "0x1 not within flag-matching ranges in pipeline layout"},
4590 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
4591 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
4592 "0x1 not within flag-matching ranges in pipeline layout"},
4593 }};
4594 const VkPushConstantRange pc_range3[] = {
4595 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
4596 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
4597 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4598 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
4599 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
4600 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
4601 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
4602 };
4603 pipeline_layout_ci.pushConstantRangeCount =
4604 sizeof(pc_range3) / sizeof(VkPushConstantRange);
4605 pipeline_layout_ci.pPushConstantRanges = pc_range3;
4606 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4607 &pipeline_layout);
4608 ASSERT_VK_SUCCESS(err);
4609 BeginCommandBuffer();
4610 for (const auto &iter : cmd_overlap_tests) {
4611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4612 iter.msg);
4613 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
4614 iter.range.stageFlags, iter.range.offset,
4615 iter.range.size, dummy_values);
4616 m_errorMonitor->VerifyFound();
4617 }
4618 EndCommandBuffer();
4619 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
4620 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4621
4622 // positive overlapping range tests with cmd
4623 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
4624 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
4625 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
4626 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
4627 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
4628 }};
4629 const VkPushConstantRange pc_range4[] = {
4630 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
4631 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
4632 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
4633 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4634 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
4635 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
4636 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
4637 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
4638 };
4639 pipeline_layout_ci.pushConstantRangeCount =
4640 sizeof(pc_range4) / sizeof(VkPushConstantRange);
4641 pipeline_layout_ci.pPushConstantRanges = pc_range4;
4642 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4643 &pipeline_layout);
4644 ASSERT_VK_SUCCESS(err);
4645 BeginCommandBuffer();
4646 for (const auto &iter : cmd_overlap_tests_pos) {
4647 m_errorMonitor->ExpectSuccess();
4648 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
4649 iter.range.stageFlags, iter.range.offset,
4650 iter.range.size, dummy_values);
4651 m_errorMonitor->VerifyNotFound();
4652 }
4653 EndCommandBuffer();
4654 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004655 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4656}
4657
Karl Schultz6addd812016-02-02 17:17:23 -07004658TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07004659 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07004660 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004661
4662 ASSERT_NO_FATAL_FAILURE(InitState());
4663 ASSERT_NO_FATAL_FAILURE(InitViewport());
4664 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4665
4666 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
4667 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004668 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4669 ds_type_count[0].descriptorCount = 10;
4670 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
4671 ds_type_count[1].descriptorCount = 2;
4672 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
4673 ds_type_count[2].descriptorCount = 2;
4674 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
4675 ds_type_count[3].descriptorCount = 5;
4676 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
4677 // type
4678 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4679 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4680 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004681
4682 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004683 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4684 ds_pool_ci.pNext = NULL;
4685 ds_pool_ci.maxSets = 5;
4686 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
4687 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004688
4689 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004690 err =
4691 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004692 ASSERT_VK_SUCCESS(err);
4693
4694 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
4695 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004696 dsl_binding[0].binding = 0;
4697 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4698 dsl_binding[0].descriptorCount = 5;
4699 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4700 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004701
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004702 // Create layout identical to set0 layout but w/ different stageFlags
4703 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004704 dsl_fs_stage_only.binding = 0;
4705 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4706 dsl_fs_stage_only.descriptorCount = 5;
4707 dsl_fs_stage_only.stageFlags =
4708 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
4709 // bind time
4710 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004711 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004712 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4713 ds_layout_ci.pNext = NULL;
4714 ds_layout_ci.bindingCount = 1;
4715 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004716 static const uint32_t NUM_LAYOUTS = 4;
4717 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004718 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004719 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
4720 // layout for error case
4721 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4722 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004723 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004724 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07004725 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4726 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004727 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004728 dsl_binding[0].binding = 0;
4729 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004730 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004731 dsl_binding[1].binding = 1;
4732 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
4733 dsl_binding[1].descriptorCount = 2;
4734 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
4735 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004736 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004737 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07004738 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4739 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004740 ASSERT_VK_SUCCESS(err);
4741 dsl_binding[0].binding = 0;
4742 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004743 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004744 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07004745 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4746 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004747 ASSERT_VK_SUCCESS(err);
4748 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004749 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07004750 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4751 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004752 ASSERT_VK_SUCCESS(err);
4753
4754 static const uint32_t NUM_SETS = 4;
4755 VkDescriptorSet descriptorSet[NUM_SETS] = {};
4756 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004757 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004758 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004759 alloc_info.descriptorPool = ds_pool;
4760 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004761 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4762 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004763 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004764 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07004765 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004766 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07004767 err =
4768 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004769 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004770
4771 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004772 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4773 pipeline_layout_ci.pNext = NULL;
4774 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
4775 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004776
4777 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004778 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4779 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004780 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004781 // Create pipelineLayout with only one setLayout
4782 pipeline_layout_ci.setLayoutCount = 1;
4783 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004784 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4785 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004786 ASSERT_VK_SUCCESS(err);
4787 // Create pipelineLayout with 2 descriptor setLayout at index 0
4788 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
4789 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07004790 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4791 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004792 ASSERT_VK_SUCCESS(err);
4793 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
4794 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
4795 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07004796 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4797 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004798 ASSERT_VK_SUCCESS(err);
4799 // Create pipelineLayout with UB type, but stageFlags for FS only
4800 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
4801 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07004802 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4803 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004804 ASSERT_VK_SUCCESS(err);
4805 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
4806 VkDescriptorSetLayout pl_bad_s0[2] = {};
4807 pl_bad_s0[0] = ds_layout_fs_only;
4808 pl_bad_s0[1] = ds_layout[1];
4809 pipeline_layout_ci.setLayoutCount = 2;
4810 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
4811 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07004812 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4813 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004814 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004815
4816 // Create a buffer to update the descriptor with
4817 uint32_t qfi = 0;
4818 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004819 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4820 buffCI.size = 1024;
4821 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4822 buffCI.queueFamilyIndexCount = 1;
4823 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004824
4825 VkBuffer dyub;
4826 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4827 ASSERT_VK_SUCCESS(err);
4828 // Correctly update descriptor to avoid "NOT_UPDATED" error
4829 static const uint32_t NUM_BUFFS = 5;
4830 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004831 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07004832 buffInfo[i].buffer = dyub;
4833 buffInfo[i].offset = 0;
4834 buffInfo[i].range = 1024;
4835 }
Karl Schultz6addd812016-02-02 17:17:23 -07004836 VkImage image;
4837 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4838 const int32_t tex_width = 32;
4839 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004840 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004841 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4842 image_create_info.pNext = NULL;
4843 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4844 image_create_info.format = tex_format;
4845 image_create_info.extent.width = tex_width;
4846 image_create_info.extent.height = tex_height;
4847 image_create_info.extent.depth = 1;
4848 image_create_info.mipLevels = 1;
4849 image_create_info.arrayLayers = 1;
4850 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4851 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4852 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4853 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004854 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
4855 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004856
Karl Schultz6addd812016-02-02 17:17:23 -07004857 VkMemoryRequirements memReqs;
4858 VkDeviceMemory imageMem;
4859 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004860 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004861 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4862 memAlloc.pNext = NULL;
4863 memAlloc.allocationSize = 0;
4864 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004865 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
4866 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07004867 pass =
4868 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004869 ASSERT_TRUE(pass);
4870 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
4871 ASSERT_VK_SUCCESS(err);
4872 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
4873 ASSERT_VK_SUCCESS(err);
4874
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004875 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004876 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4877 image_view_create_info.image = image;
4878 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
4879 image_view_create_info.format = tex_format;
4880 image_view_create_info.subresourceRange.layerCount = 1;
4881 image_view_create_info.subresourceRange.baseMipLevel = 0;
4882 image_view_create_info.subresourceRange.levelCount = 1;
4883 image_view_create_info.subresourceRange.aspectMask =
4884 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004885
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004886 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07004887 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
4888 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004889 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004890 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004891 imageInfo[0].imageView = view;
4892 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4893 imageInfo[1].imageView = view;
4894 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004895 imageInfo[2].imageView = view;
4896 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4897 imageInfo[3].imageView = view;
4898 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004899
4900 static const uint32_t NUM_SET_UPDATES = 3;
4901 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
4902 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4903 descriptor_write[0].dstSet = descriptorSet[0];
4904 descriptor_write[0].dstBinding = 0;
4905 descriptor_write[0].descriptorCount = 5;
4906 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4907 descriptor_write[0].pBufferInfo = buffInfo;
4908 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4909 descriptor_write[1].dstSet = descriptorSet[1];
4910 descriptor_write[1].dstBinding = 0;
4911 descriptor_write[1].descriptorCount = 2;
4912 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
4913 descriptor_write[1].pImageInfo = imageInfo;
4914 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4915 descriptor_write[2].dstSet = descriptorSet[1];
4916 descriptor_write[2].dstBinding = 1;
4917 descriptor_write[2].descriptorCount = 2;
4918 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004919 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004920
4921 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004922
Tobin Ehlis88452832015-12-03 09:40:56 -07004923 // Create PSO to be used for draw-time errors below
4924 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004925 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004926 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07004927 "out gl_PerVertex {\n"
4928 " vec4 gl_Position;\n"
4929 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004930 "void main(){\n"
4931 " gl_Position = vec4(1);\n"
4932 "}\n";
4933 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004934 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004935 "\n"
4936 "layout(location=0) out vec4 x;\n"
4937 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
4938 "void main(){\n"
4939 " x = vec4(bar.y);\n"
4940 "}\n";
4941 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4942 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004943 VkPipelineObj pipe(m_device);
4944 pipe.AddShader(&vs);
4945 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07004946 pipe.AddColorAttachment();
4947 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07004948
4949 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07004950
Karl Schultz6addd812016-02-02 17:17:23 -07004951 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4952 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4953 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
4954 // of PSO
4955 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
4956 // cmd_pipeline.c
4957 // due to the fact that cmd_alloc_dset_data() has not been called in
4958 // cmd_bind_graphics_pipeline()
4959 // TODO : Want to cause various binding incompatibility issues here to test
4960 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07004961 // First cause various verify_layout_compatibility() fails
4962 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004963 // verify_set_layout_compatibility fail cases:
4964 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07004965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4966 " due to: invalid VkPipelineLayout ");
4967 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4968 VK_PIPELINE_BIND_POINT_GRAPHICS,
4969 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
4970 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004971 m_errorMonitor->VerifyFound();
4972
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004973 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07004974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4975 " attempting to bind set to index 1");
4976 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4977 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
4978 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004979 m_errorMonitor->VerifyFound();
4980
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004981 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004982 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
4983 // descriptors
4984 m_errorMonitor->SetDesiredFailureMsg(
4985 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06004986 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07004987 vkCmdBindDescriptorSets(
4988 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4989 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004990 m_errorMonitor->VerifyFound();
4991
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004992 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
4993 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07004994 m_errorMonitor->SetDesiredFailureMsg(
4995 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06004996 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07004997 vkCmdBindDescriptorSets(
4998 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4999 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005000 m_errorMonitor->VerifyFound();
5001
Tobin Ehlis8fab6562015-12-01 09:57:09 -07005002 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
5003 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07005004 m_errorMonitor->SetDesiredFailureMsg(
5005 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06005006 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07005007 vkCmdBindDescriptorSets(
5008 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
5009 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005010 m_errorMonitor->VerifyFound();
5011
Tobin Ehlis8fab6562015-12-01 09:57:09 -07005012 // Cause INFO messages due to disturbing previously bound Sets
5013 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07005014 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
5015 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
5016 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07005017 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07005018 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005019 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005020 " previously bound as set #0 was disturbed ");
5021 vkCmdBindDescriptorSets(
5022 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
5023 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005024 m_errorMonitor->VerifyFound();
5025
Karl Schultz6addd812016-02-02 17:17:23 -07005026 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
5027 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
5028 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07005029 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005030 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005031 " newly bound as set #0 so set #1 and "
5032 "any subsequent sets were disturbed ");
5033 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
5034 VK_PIPELINE_BIND_POINT_GRAPHICS,
5035 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005036 m_errorMonitor->VerifyFound();
5037
Tobin Ehlis88452832015-12-03 09:40:56 -07005038 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07005039 // 1. Error due to not binding required set (we actually use same code as
5040 // above to disturb set0)
5041 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
5042 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
5043 2, &descriptorSet[0], 0, NULL);
5044 vkCmdBindDescriptorSets(
5045 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
5046 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
5047 m_errorMonitor->SetDesiredFailureMsg(
5048 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5049 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07005050 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005051 m_errorMonitor->VerifyFound();
5052
Tobin Ehlis991d45a2016-01-06 08:48:41 -07005053 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07005054 // 2. Error due to bound set not being compatible with PSO's
5055 // VkPipelineLayout (diff stageFlags in this case)
5056 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
5057 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
5058 2, &descriptorSet[0], 0, NULL);
5059 m_errorMonitor->SetDesiredFailureMsg(
5060 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5061 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07005062 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005063 m_errorMonitor->VerifyFound();
5064
Tobin Ehlis8fab6562015-12-01 09:57:09 -07005065 // Remaining clean-up
5066 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07005067 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07005068 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
5069 }
5070 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06005071 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
5072 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07005073 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07005074 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5075 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5076}
Tobin Ehlis559c6382015-11-05 09:52:49 -07005077
Karl Schultz6addd812016-02-02 17:17:23 -07005078TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005079
Karl Schultz6addd812016-02-02 17:17:23 -07005080 m_errorMonitor->SetDesiredFailureMsg(
5081 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005082 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005083
5084 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005085 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005086 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005087 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005088
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005089 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005090}
5091
Karl Schultz6addd812016-02-02 17:17:23 -07005092TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
5093 VkResult err;
5094 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005095
Karl Schultz6addd812016-02-02 17:17:23 -07005096 m_errorMonitor->SetDesiredFailureMsg(
5097 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07005098 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005099
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06005100 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06005101
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005102 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005103 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06005104 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005105 cmd.commandPool = m_commandPool;
5106 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005107 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06005108
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005109 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06005110 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06005111
5112 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005113 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07005114 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005115 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06005116 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07005117 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
5118 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005119 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06005120
5121 // The error should be caught by validation of the BeginCommandBuffer call
5122 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
5123
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005124 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005125 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06005126}
5127
Karl Schultz6addd812016-02-02 17:17:23 -07005128TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005129 // Cause error due to Begin while recording CB
5130 // Then cause 2 errors for attempting to reset CB w/o having
5131 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
5132 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005133 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005134 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005135
5136 ASSERT_NO_FATAL_FAILURE(InitState());
5137
5138 // Calls AllocateCommandBuffers
5139 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
5140
Karl Schultz6addd812016-02-02 17:17:23 -07005141 // Force the failure by setting the Renderpass and Framebuffer fields with
5142 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005143 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07005144 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005145 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5146 cmd_buf_info.pNext = NULL;
5147 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005148 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005149
5150 // Begin CB to transition to recording state
5151 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
5152 // Can't re-begin. This should trigger error
5153 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005154 m_errorMonitor->VerifyFound();
5155
Karl Schultz6addd812016-02-02 17:17:23 -07005156 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5157 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005158 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
5159 // Reset attempt will trigger error due to incorrect CommandPool state
5160 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005161 m_errorMonitor->VerifyFound();
5162
Karl Schultz6addd812016-02-02 17:17:23 -07005163 m_errorMonitor->SetDesiredFailureMsg(
5164 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5165 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005166 // Transition CB to RECORDED state
5167 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
5168 // Now attempting to Begin will implicitly reset, which triggers error
5169 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005170 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005171}
5172
Karl Schultz6addd812016-02-02 17:17:23 -07005173TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005174 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07005175 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005176
Karl Schultz6addd812016-02-02 17:17:23 -07005177 m_errorMonitor->SetDesiredFailureMsg(
5178 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005179 "Invalid Pipeline CreateInfo State: Vtx Shader required");
5180
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005181 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005182 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005183
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005184 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005185 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5186 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005187
5188 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005189 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5190 ds_pool_ci.pNext = NULL;
5191 ds_pool_ci.maxSets = 1;
5192 ds_pool_ci.poolSizeCount = 1;
5193 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005194
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005195 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005196 err =
5197 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005198 ASSERT_VK_SUCCESS(err);
5199
Tony Barboureb254902015-07-15 12:50:33 -06005200 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005201 dsl_binding.binding = 0;
5202 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5203 dsl_binding.descriptorCount = 1;
5204 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5205 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005206
Tony Barboureb254902015-07-15 12:50:33 -06005207 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005208 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5209 ds_layout_ci.pNext = NULL;
5210 ds_layout_ci.bindingCount = 1;
5211 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005212
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005213 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005214 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5215 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005216 ASSERT_VK_SUCCESS(err);
5217
5218 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005219 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005220 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005221 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005222 alloc_info.descriptorPool = ds_pool;
5223 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005224 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5225 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005226 ASSERT_VK_SUCCESS(err);
5227
Tony Barboureb254902015-07-15 12:50:33 -06005228 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005229 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5230 pipeline_layout_ci.setLayoutCount = 1;
5231 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005232
5233 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005234 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5235 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005236 ASSERT_VK_SUCCESS(err);
5237
Tobin Ehlise68360f2015-10-01 11:15:13 -06005238 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07005239 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06005240
5241 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005242 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5243 vp_state_ci.scissorCount = 1;
5244 vp_state_ci.pScissors = &sc;
5245 vp_state_ci.viewportCount = 1;
5246 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005247
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005248 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
5249 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5250 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
5251 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
5252 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
5253 rs_state_ci.depthClampEnable = VK_FALSE;
5254 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
5255 rs_state_ci.depthBiasEnable = VK_FALSE;
5256
Tony Barboureb254902015-07-15 12:50:33 -06005257 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005258 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5259 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005260 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07005261 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5262 gp_ci.layout = pipeline_layout;
5263 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06005264
5265 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005266 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5267 pc_ci.initialDataSize = 0;
5268 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005269
5270 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06005271 VkPipelineCache pipelineCache;
5272
Karl Schultz6addd812016-02-02 17:17:23 -07005273 err =
5274 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06005275 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005276 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5277 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005278
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005279 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005280
Chia-I Wuf7458c52015-10-26 21:10:41 +08005281 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5282 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5283 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5284 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005285}
Tobin Ehlis912df022015-09-17 08:46:18 -06005286/*// TODO : This test should be good, but needs Tess support in compiler to run
5287TEST_F(VkLayerTest, InvalidPatchControlPoints)
5288{
5289 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06005290 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005291
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005293 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
5294primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005295
Tobin Ehlis912df022015-09-17 08:46:18 -06005296 ASSERT_NO_FATAL_FAILURE(InitState());
5297 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06005298
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005299 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06005300 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005301 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06005302
5303 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5304 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5305 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005306 ds_pool_ci.poolSizeCount = 1;
5307 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06005308
5309 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005310 err = vkCreateDescriptorPool(m_device->device(),
5311VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06005312 ASSERT_VK_SUCCESS(err);
5313
5314 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08005315 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06005316 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08005317 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06005318 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5319 dsl_binding.pImmutableSamplers = NULL;
5320
5321 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005322 ds_layout_ci.sType =
5323VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06005324 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005325 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07005326 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06005327
5328 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005329 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5330&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06005331 ASSERT_VK_SUCCESS(err);
5332
5333 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005334 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
5335VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06005336 ASSERT_VK_SUCCESS(err);
5337
5338 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005339 pipeline_layout_ci.sType =
5340VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06005341 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005342 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06005343 pipeline_layout_ci.pSetLayouts = &ds_layout;
5344
5345 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005346 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5347&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06005348 ASSERT_VK_SUCCESS(err);
5349
5350 VkPipelineShaderStageCreateInfo shaderStages[3];
5351 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
5352
Karl Schultz6addd812016-02-02 17:17:23 -07005353 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
5354this);
Tobin Ehlis912df022015-09-17 08:46:18 -06005355 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07005356 VkShaderObj
5357tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
5358this);
5359 VkShaderObj
5360te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
5361this);
Tobin Ehlis912df022015-09-17 08:46:18 -06005362
Karl Schultz6addd812016-02-02 17:17:23 -07005363 shaderStages[0].sType =
5364VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005365 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06005366 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07005367 shaderStages[1].sType =
5368VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005369 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06005370 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07005371 shaderStages[2].sType =
5372VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005373 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06005374 shaderStages[2].shader = te.handle();
5375
5376 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005377 iaCI.sType =
5378VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08005379 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06005380
5381 VkPipelineTessellationStateCreateInfo tsCI = {};
5382 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
5383 tsCI.patchControlPoints = 0; // This will cause an error
5384
5385 VkGraphicsPipelineCreateInfo gp_ci = {};
5386 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5387 gp_ci.pNext = NULL;
5388 gp_ci.stageCount = 3;
5389 gp_ci.pStages = shaderStages;
5390 gp_ci.pVertexInputState = NULL;
5391 gp_ci.pInputAssemblyState = &iaCI;
5392 gp_ci.pTessellationState = &tsCI;
5393 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005394 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06005395 gp_ci.pMultisampleState = NULL;
5396 gp_ci.pDepthStencilState = NULL;
5397 gp_ci.pColorBlendState = NULL;
5398 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5399 gp_ci.layout = pipeline_layout;
5400 gp_ci.renderPass = renderPass();
5401
5402 VkPipelineCacheCreateInfo pc_ci = {};
5403 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5404 pc_ci.pNext = NULL;
5405 pc_ci.initialSize = 0;
5406 pc_ci.initialData = 0;
5407 pc_ci.maxSize = 0;
5408
5409 VkPipeline pipeline;
5410 VkPipelineCache pipelineCache;
5411
Karl Schultz6addd812016-02-02 17:17:23 -07005412 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
5413&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06005414 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005415 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5416&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06005417
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005418 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005419
Chia-I Wuf7458c52015-10-26 21:10:41 +08005420 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5421 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5422 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5423 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06005424}
5425*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06005426// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07005427TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07005428 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005429
Karl Schultz6addd812016-02-02 17:17:23 -07005430 m_errorMonitor->SetDesiredFailureMsg(
5431 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005432 "Gfx Pipeline viewport count (1) must match scissor count (0).");
5433
Tobin Ehlise68360f2015-10-01 11:15:13 -06005434 ASSERT_NO_FATAL_FAILURE(InitState());
5435 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06005436
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005437 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005438 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5439 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005440
5441 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005442 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5443 ds_pool_ci.maxSets = 1;
5444 ds_pool_ci.poolSizeCount = 1;
5445 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005446
5447 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005448 err =
5449 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005450 ASSERT_VK_SUCCESS(err);
5451
5452 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005453 dsl_binding.binding = 0;
5454 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5455 dsl_binding.descriptorCount = 1;
5456 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005457
5458 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005459 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5460 ds_layout_ci.bindingCount = 1;
5461 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005462
5463 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005464 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5465 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005466 ASSERT_VK_SUCCESS(err);
5467
5468 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005469 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005470 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005471 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005472 alloc_info.descriptorPool = ds_pool;
5473 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005474 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5475 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005476 ASSERT_VK_SUCCESS(err);
5477
5478 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005479 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5480 pipeline_layout_ci.setLayoutCount = 1;
5481 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005482
5483 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005484 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5485 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005486 ASSERT_VK_SUCCESS(err);
5487
5488 VkViewport vp = {}; // Just need dummy vp to point to
5489
5490 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005491 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5492 vp_state_ci.scissorCount = 0;
5493 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
5494 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005495
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005496 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
5497 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5498 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
5499 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
5500 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
5501 rs_state_ci.depthClampEnable = VK_FALSE;
5502 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
5503 rs_state_ci.depthBiasEnable = VK_FALSE;
5504
Cody Northropeb3a6c12015-10-05 14:44:45 -06005505 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07005506 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06005507
Karl Schultz6addd812016-02-02 17:17:23 -07005508 VkShaderObj vs(m_device, bindStateVertShaderText,
5509 VK_SHADER_STAGE_VERTEX_BIT, this);
5510 VkShaderObj fs(m_device, bindStateFragShaderText,
5511 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005512 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005513 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08005514 shaderStages[0] = vs.GetStageCreateInfo();
5515 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005516
5517 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005518 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5519 gp_ci.stageCount = 2;
5520 gp_ci.pStages = shaderStages;
5521 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005522 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07005523 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5524 gp_ci.layout = pipeline_layout;
5525 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005526
5527 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005528 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005529
5530 VkPipeline pipeline;
5531 VkPipelineCache pipelineCache;
5532
Karl Schultz6addd812016-02-02 17:17:23 -07005533 err =
5534 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005535 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005536 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5537 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005538
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005539 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005540
Chia-I Wuf7458c52015-10-26 21:10:41 +08005541 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5542 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5543 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5544 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005545}
Karl Schultz6addd812016-02-02 17:17:23 -07005546// Don't set viewport state in PSO. This is an error b/c we always need this
5547// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06005548// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07005549TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06005550 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07005551 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005552
Karl Schultz6addd812016-02-02 17:17:23 -07005553 m_errorMonitor->SetDesiredFailureMsg(
5554 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005555 "Gfx Pipeline pViewportState is null. Even if ");
5556
Tobin Ehlise68360f2015-10-01 11:15:13 -06005557 ASSERT_NO_FATAL_FAILURE(InitState());
5558 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06005559
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005560 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005561 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5562 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005563
5564 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005565 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5566 ds_pool_ci.maxSets = 1;
5567 ds_pool_ci.poolSizeCount = 1;
5568 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005569
5570 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005571 err =
5572 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005573 ASSERT_VK_SUCCESS(err);
5574
5575 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005576 dsl_binding.binding = 0;
5577 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5578 dsl_binding.descriptorCount = 1;
5579 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005580
5581 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005582 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5583 ds_layout_ci.bindingCount = 1;
5584 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005585
5586 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005587 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5588 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005589 ASSERT_VK_SUCCESS(err);
5590
5591 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005592 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005593 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005594 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005595 alloc_info.descriptorPool = ds_pool;
5596 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005597 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5598 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005599 ASSERT_VK_SUCCESS(err);
5600
5601 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005602 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5603 pipeline_layout_ci.setLayoutCount = 1;
5604 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005605
5606 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005607 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5608 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005609 ASSERT_VK_SUCCESS(err);
5610
5611 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
5612 // Set scissor as dynamic to avoid second error
5613 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005614 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5615 dyn_state_ci.dynamicStateCount = 1;
5616 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005617
Cody Northropeb3a6c12015-10-05 14:44:45 -06005618 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07005619 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06005620
Karl Schultz6addd812016-02-02 17:17:23 -07005621 VkShaderObj vs(m_device, bindStateVertShaderText,
5622 VK_SHADER_STAGE_VERTEX_BIT, this);
5623 VkShaderObj fs(m_device, bindStateFragShaderText,
5624 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005625 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005626 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08005627 shaderStages[0] = vs.GetStageCreateInfo();
5628 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005629
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005630
5631 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
5632 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5633 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
5634 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
5635 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
5636 rs_state_ci.depthClampEnable = VK_FALSE;
5637 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
5638 rs_state_ci.depthBiasEnable = VK_FALSE;
5639
Tobin Ehlise68360f2015-10-01 11:15:13 -06005640 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005641 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5642 gp_ci.stageCount = 2;
5643 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005644 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07005645 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
5646 // should cause validation error
5647 gp_ci.pDynamicState = &dyn_state_ci;
5648 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5649 gp_ci.layout = pipeline_layout;
5650 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005651
5652 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005653 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005654
5655 VkPipeline pipeline;
5656 VkPipelineCache pipelineCache;
5657
Karl Schultz6addd812016-02-02 17:17:23 -07005658 err =
5659 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005660 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005661 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5662 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005663
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005664 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005665
Chia-I Wuf7458c52015-10-26 21:10:41 +08005666 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5667 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5668 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5669 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005670}
5671// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07005672// Then run second test where dynamic scissor count doesn't match PSO scissor
5673// count
5674TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
5675 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005676
Karl Schultz6addd812016-02-02 17:17:23 -07005677 m_errorMonitor->SetDesiredFailureMsg(
5678 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005679 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
5680
Tobin Ehlise68360f2015-10-01 11:15:13 -06005681 ASSERT_NO_FATAL_FAILURE(InitState());
5682 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06005683
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005684 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005685 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5686 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005687
5688 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005689 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5690 ds_pool_ci.maxSets = 1;
5691 ds_pool_ci.poolSizeCount = 1;
5692 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005693
5694 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005695 err =
5696 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005697 ASSERT_VK_SUCCESS(err);
5698
5699 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005700 dsl_binding.binding = 0;
5701 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5702 dsl_binding.descriptorCount = 1;
5703 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005704
5705 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005706 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5707 ds_layout_ci.bindingCount = 1;
5708 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005709
5710 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005711 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5712 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005713 ASSERT_VK_SUCCESS(err);
5714
5715 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005716 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005717 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005718 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005719 alloc_info.descriptorPool = ds_pool;
5720 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005721 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5722 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005723 ASSERT_VK_SUCCESS(err);
5724
5725 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005726 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5727 pipeline_layout_ci.setLayoutCount = 1;
5728 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005729
5730 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005731 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5732 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005733 ASSERT_VK_SUCCESS(err);
5734
5735 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005736 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5737 vp_state_ci.viewportCount = 1;
5738 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
5739 vp_state_ci.scissorCount = 1;
5740 vp_state_ci.pScissors =
5741 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06005742
5743 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
5744 // Set scissor as dynamic to avoid that error
5745 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005746 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5747 dyn_state_ci.dynamicStateCount = 1;
5748 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005749
Cody Northropeb3a6c12015-10-05 14:44:45 -06005750 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07005751 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06005752
Karl Schultz6addd812016-02-02 17:17:23 -07005753 VkShaderObj vs(m_device, bindStateVertShaderText,
5754 VK_SHADER_STAGE_VERTEX_BIT, this);
5755 VkShaderObj fs(m_device, bindStateFragShaderText,
5756 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005757 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005758 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08005759 shaderStages[0] = vs.GetStageCreateInfo();
5760 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005761
Cody Northropf6622dc2015-10-06 10:33:21 -06005762 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5763 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5764 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005765 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06005766 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005767 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06005768 vi_ci.pVertexAttributeDescriptions = nullptr;
5769
5770 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5771 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5772 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5773
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005774 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005775 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06005776 rs_ci.pNext = nullptr;
5777
Mark Youngc89c6312016-03-31 16:03:20 -06005778 VkPipelineColorBlendAttachmentState att = {};
5779 att.blendEnable = VK_FALSE;
5780 att.colorWriteMask = 0xf;
5781
Cody Northropf6622dc2015-10-06 10:33:21 -06005782 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5783 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5784 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06005785 cb_ci.attachmentCount = 1;
5786 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06005787
Tobin Ehlise68360f2015-10-01 11:15:13 -06005788 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005789 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5790 gp_ci.stageCount = 2;
5791 gp_ci.pStages = shaderStages;
5792 gp_ci.pVertexInputState = &vi_ci;
5793 gp_ci.pInputAssemblyState = &ia_ci;
5794 gp_ci.pViewportState = &vp_state_ci;
5795 gp_ci.pRasterizationState = &rs_ci;
5796 gp_ci.pColorBlendState = &cb_ci;
5797 gp_ci.pDynamicState = &dyn_state_ci;
5798 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5799 gp_ci.layout = pipeline_layout;
5800 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005801
5802 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005803 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005804
5805 VkPipeline pipeline;
5806 VkPipelineCache pipelineCache;
5807
Karl Schultz6addd812016-02-02 17:17:23 -07005808 err =
5809 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005810 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005811 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5812 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005813
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005814 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005815
Tobin Ehlisd332f282015-10-02 11:00:56 -06005816 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07005817 // First need to successfully create the PSO from above by setting
5818 // pViewports
5819 m_errorMonitor->SetDesiredFailureMsg(
5820 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5821 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
5822 "scissorCount is 1. These counts must match.");
5823
5824 VkViewport vp = {}; // Just need dummy vp to point to
5825 vp_state_ci.pViewports = &vp;
5826 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5827 &gp_ci, NULL, &pipeline);
5828 ASSERT_VK_SUCCESS(err);
5829 BeginCommandBuffer();
5830 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5831 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5832 VkRect2D scissors[2] = {}; // don't care about data
5833 // Count of 2 doesn't match PSO count of 1
5834 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
5835 Draw(1, 0, 0, 0);
5836
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005837 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07005838
5839 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5840 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5841 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5842 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5843}
5844// Create PSO w/o non-zero scissorCount but no scissor data
5845// Then run second test where dynamic viewportCount doesn't match PSO
5846// viewportCount
5847TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
5848 VkResult err;
5849
5850 m_errorMonitor->SetDesiredFailureMsg(
5851 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5852 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
5853
5854 ASSERT_NO_FATAL_FAILURE(InitState());
5855 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5856
5857 VkDescriptorPoolSize ds_type_count = {};
5858 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5859 ds_type_count.descriptorCount = 1;
5860
5861 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5862 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5863 ds_pool_ci.maxSets = 1;
5864 ds_pool_ci.poolSizeCount = 1;
5865 ds_pool_ci.pPoolSizes = &ds_type_count;
5866
5867 VkDescriptorPool ds_pool;
5868 err =
5869 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5870 ASSERT_VK_SUCCESS(err);
5871
5872 VkDescriptorSetLayoutBinding dsl_binding = {};
5873 dsl_binding.binding = 0;
5874 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5875 dsl_binding.descriptorCount = 1;
5876 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5877
5878 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5879 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5880 ds_layout_ci.bindingCount = 1;
5881 ds_layout_ci.pBindings = &dsl_binding;
5882
5883 VkDescriptorSetLayout ds_layout;
5884 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5885 &ds_layout);
5886 ASSERT_VK_SUCCESS(err);
5887
5888 VkDescriptorSet descriptorSet;
5889 VkDescriptorSetAllocateInfo alloc_info = {};
5890 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5891 alloc_info.descriptorSetCount = 1;
5892 alloc_info.descriptorPool = ds_pool;
5893 alloc_info.pSetLayouts = &ds_layout;
5894 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5895 &descriptorSet);
5896 ASSERT_VK_SUCCESS(err);
5897
5898 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5899 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5900 pipeline_layout_ci.setLayoutCount = 1;
5901 pipeline_layout_ci.pSetLayouts = &ds_layout;
5902
5903 VkPipelineLayout pipeline_layout;
5904 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5905 &pipeline_layout);
5906 ASSERT_VK_SUCCESS(err);
5907
5908 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5909 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5910 vp_state_ci.scissorCount = 1;
5911 vp_state_ci.pScissors =
5912 NULL; // Null scissor w/ count of 1 should cause error
5913 vp_state_ci.viewportCount = 1;
5914 vp_state_ci.pViewports =
5915 NULL; // vp is dynamic (below) so this won't cause error
5916
5917 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
5918 // Set scissor as dynamic to avoid that error
5919 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5920 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5921 dyn_state_ci.dynamicStateCount = 1;
5922 dyn_state_ci.pDynamicStates = &vp_state;
5923
5924 VkPipelineShaderStageCreateInfo shaderStages[2];
5925 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5926
5927 VkShaderObj vs(m_device, bindStateVertShaderText,
5928 VK_SHADER_STAGE_VERTEX_BIT, this);
5929 VkShaderObj fs(m_device, bindStateFragShaderText,
5930 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005931 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005932 // but add it to be able to run on more devices
5933 shaderStages[0] = vs.GetStageCreateInfo();
5934 shaderStages[1] = fs.GetStageCreateInfo();
5935
5936 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5937 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5938 vi_ci.pNext = nullptr;
5939 vi_ci.vertexBindingDescriptionCount = 0;
5940 vi_ci.pVertexBindingDescriptions = nullptr;
5941 vi_ci.vertexAttributeDescriptionCount = 0;
5942 vi_ci.pVertexAttributeDescriptions = nullptr;
5943
5944 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5945 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5946 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5947
5948 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5949 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5950 rs_ci.pNext = nullptr;
5951
Mark Youngc89c6312016-03-31 16:03:20 -06005952 VkPipelineColorBlendAttachmentState att = {};
5953 att.blendEnable = VK_FALSE;
5954 att.colorWriteMask = 0xf;
5955
Karl Schultz6addd812016-02-02 17:17:23 -07005956 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5957 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5958 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06005959 cb_ci.attachmentCount = 1;
5960 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07005961
5962 VkGraphicsPipelineCreateInfo gp_ci = {};
5963 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5964 gp_ci.stageCount = 2;
5965 gp_ci.pStages = shaderStages;
5966 gp_ci.pVertexInputState = &vi_ci;
5967 gp_ci.pInputAssemblyState = &ia_ci;
5968 gp_ci.pViewportState = &vp_state_ci;
5969 gp_ci.pRasterizationState = &rs_ci;
5970 gp_ci.pColorBlendState = &cb_ci;
5971 gp_ci.pDynamicState = &dyn_state_ci;
5972 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5973 gp_ci.layout = pipeline_layout;
5974 gp_ci.renderPass = renderPass();
5975
5976 VkPipelineCacheCreateInfo pc_ci = {};
5977 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5978
5979 VkPipeline pipeline;
5980 VkPipelineCache pipelineCache;
5981
5982 err =
5983 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5984 ASSERT_VK_SUCCESS(err);
5985 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5986 &gp_ci, NULL, &pipeline);
5987
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005988 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07005989
5990 // Now hit second fail case where we set scissor w/ different count than PSO
5991 // First need to successfully create the PSO from above by setting
5992 // pViewports
5993 m_errorMonitor->SetDesiredFailureMsg(
5994 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5995 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
5996 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005997
Tobin Ehlisd332f282015-10-02 11:00:56 -06005998 VkRect2D sc = {}; // Just need dummy vp to point to
5999 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07006000 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
6001 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006002 ASSERT_VK_SUCCESS(err);
6003 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006004 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6005 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006006 VkViewport viewports[2] = {}; // don't care about data
6007 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07006008 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006009 Draw(1, 0, 0, 0);
6010
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006011 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06006012
Chia-I Wuf7458c52015-10-26 21:10:41 +08006013 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
6014 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6015 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6016 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06006017}
6018
Mark Young7394fdd2016-03-31 14:56:43 -06006019TEST_F(VkLayerTest, PSOLineWidthInvalid) {
6020 VkResult err;
6021
6022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06006023 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06006024
6025 ASSERT_NO_FATAL_FAILURE(InitState());
6026 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6027
6028 VkDescriptorPoolSize ds_type_count = {};
6029 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6030 ds_type_count.descriptorCount = 1;
6031
6032 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6033 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6034 ds_pool_ci.maxSets = 1;
6035 ds_pool_ci.poolSizeCount = 1;
6036 ds_pool_ci.pPoolSizes = &ds_type_count;
6037
6038 VkDescriptorPool ds_pool;
6039 err =
6040 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6041 ASSERT_VK_SUCCESS(err);
6042
6043 VkDescriptorSetLayoutBinding dsl_binding = {};
6044 dsl_binding.binding = 0;
6045 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6046 dsl_binding.descriptorCount = 1;
6047 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6048
6049 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6050 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6051 ds_layout_ci.bindingCount = 1;
6052 ds_layout_ci.pBindings = &dsl_binding;
6053
6054 VkDescriptorSetLayout ds_layout;
6055 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6056 &ds_layout);
6057 ASSERT_VK_SUCCESS(err);
6058
6059 VkDescriptorSet descriptorSet;
6060 VkDescriptorSetAllocateInfo alloc_info = {};
6061 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6062 alloc_info.descriptorSetCount = 1;
6063 alloc_info.descriptorPool = ds_pool;
6064 alloc_info.pSetLayouts = &ds_layout;
6065 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6066 &descriptorSet);
6067 ASSERT_VK_SUCCESS(err);
6068
6069 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6070 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6071 pipeline_layout_ci.setLayoutCount = 1;
6072 pipeline_layout_ci.pSetLayouts = &ds_layout;
6073
6074 VkPipelineLayout pipeline_layout;
6075 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6076 &pipeline_layout);
6077 ASSERT_VK_SUCCESS(err);
6078
6079 VkPipelineViewportStateCreateInfo vp_state_ci = {};
6080 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
6081 vp_state_ci.scissorCount = 1;
6082 vp_state_ci.pScissors = NULL;
6083 vp_state_ci.viewportCount = 1;
6084 vp_state_ci.pViewports = NULL;
6085
6086 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
6087 VK_DYNAMIC_STATE_SCISSOR,
6088 VK_DYNAMIC_STATE_LINE_WIDTH};
6089 // Set scissor as dynamic to avoid that error
6090 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6091 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6092 dyn_state_ci.dynamicStateCount = 2;
6093 dyn_state_ci.pDynamicStates = dynamic_states;
6094
6095 VkPipelineShaderStageCreateInfo shaderStages[2];
6096 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
6097
6098 VkShaderObj vs(m_device, bindStateVertShaderText,
6099 VK_SHADER_STAGE_VERTEX_BIT, this);
6100 VkShaderObj fs(m_device, bindStateFragShaderText,
6101 VK_SHADER_STAGE_FRAGMENT_BIT,
6102 this); // TODO - We shouldn't need a fragment shader
6103 // but add it to be able to run on more devices
6104 shaderStages[0] = vs.GetStageCreateInfo();
6105 shaderStages[1] = fs.GetStageCreateInfo();
6106
6107 VkPipelineVertexInputStateCreateInfo vi_ci = {};
6108 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
6109 vi_ci.pNext = nullptr;
6110 vi_ci.vertexBindingDescriptionCount = 0;
6111 vi_ci.pVertexBindingDescriptions = nullptr;
6112 vi_ci.vertexAttributeDescriptionCount = 0;
6113 vi_ci.pVertexAttributeDescriptions = nullptr;
6114
6115 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
6116 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
6117 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
6118
6119 VkPipelineRasterizationStateCreateInfo rs_ci = {};
6120 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
6121 rs_ci.pNext = nullptr;
6122
Mark Young47107952016-05-02 15:59:55 -06006123 // Check too low (line width of -1.0f).
6124 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06006125
6126 VkPipelineColorBlendAttachmentState att = {};
6127 att.blendEnable = VK_FALSE;
6128 att.colorWriteMask = 0xf;
6129
6130 VkPipelineColorBlendStateCreateInfo cb_ci = {};
6131 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
6132 cb_ci.pNext = nullptr;
6133 cb_ci.attachmentCount = 1;
6134 cb_ci.pAttachments = &att;
6135
6136 VkGraphicsPipelineCreateInfo gp_ci = {};
6137 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
6138 gp_ci.stageCount = 2;
6139 gp_ci.pStages = shaderStages;
6140 gp_ci.pVertexInputState = &vi_ci;
6141 gp_ci.pInputAssemblyState = &ia_ci;
6142 gp_ci.pViewportState = &vp_state_ci;
6143 gp_ci.pRasterizationState = &rs_ci;
6144 gp_ci.pColorBlendState = &cb_ci;
6145 gp_ci.pDynamicState = &dyn_state_ci;
6146 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
6147 gp_ci.layout = pipeline_layout;
6148 gp_ci.renderPass = renderPass();
6149
6150 VkPipelineCacheCreateInfo pc_ci = {};
6151 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
6152
6153 VkPipeline pipeline;
6154 VkPipelineCache pipelineCache;
6155
6156 err =
6157 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
6158 ASSERT_VK_SUCCESS(err);
6159 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
6160 &gp_ci, NULL, &pipeline);
6161
6162 m_errorMonitor->VerifyFound();
6163
6164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6165 "Attempt to set lineWidth to 65536");
6166
6167 // Check too high (line width of 65536.0f).
6168 rs_ci.lineWidth = 65536.0f;
6169
6170 err =
6171 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
6172 ASSERT_VK_SUCCESS(err);
6173 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
6174 &gp_ci, NULL, &pipeline);
6175
6176 m_errorMonitor->VerifyFound();
6177
6178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06006179 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06006180
6181 dyn_state_ci.dynamicStateCount = 3;
6182
6183 rs_ci.lineWidth = 1.0f;
6184
6185 err =
6186 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
6187 ASSERT_VK_SUCCESS(err);
6188 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
6189 &gp_ci, NULL, &pipeline);
6190 BeginCommandBuffer();
6191 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6192 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
6193
6194 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06006195 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06006196 m_errorMonitor->VerifyFound();
6197
6198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6199 "Attempt to set lineWidth to 65536");
6200
6201 // Check too high with dynamic setting.
6202 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
6203 m_errorMonitor->VerifyFound();
6204 EndCommandBuffer();
6205
6206 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
6207 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6208 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6209 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6210}
6211
Karl Schultz6addd812016-02-02 17:17:23 -07006212TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06006213 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07006214 m_errorMonitor->SetDesiredFailureMsg(
6215 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006216 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06006217
6218 ASSERT_NO_FATAL_FAILURE(InitState());
6219 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06006220
Tony Barbourfe3351b2015-07-28 10:17:20 -06006221 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006222 // Don't care about RenderPass handle b/c error should be flagged before
6223 // that
6224 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
6225 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06006226
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006227 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06006228}
6229
Karl Schultz6addd812016-02-02 17:17:23 -07006230TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006231 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07006232 m_errorMonitor->SetDesiredFailureMsg(
6233 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006234 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006235
6236 ASSERT_NO_FATAL_FAILURE(InitState());
6237 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006238
Tony Barbourfe3351b2015-07-28 10:17:20 -06006239 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006240 // Just create a dummy Renderpass that's non-NULL so we can get to the
6241 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06006242 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006243 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
6244 rp_begin.pNext = NULL;
6245 rp_begin.renderPass = renderPass();
6246 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006247
Karl Schultz6addd812016-02-02 17:17:23 -07006248 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
6249 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006250
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006251 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006252}
6253
Cody Northrop3bb4d962016-05-09 16:15:57 -06006254TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
6255
6256 TEST_DESCRIPTION("End a command buffer with an active render pass");
6257
6258 m_errorMonitor->SetDesiredFailureMsg(
6259 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6260 "It is invalid to issue this call inside an active render pass");
6261
6262 ASSERT_NO_FATAL_FAILURE(InitState());
6263 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6264
6265 // The framework's BeginCommandBuffer calls CreateRenderPass
6266 BeginCommandBuffer();
6267
6268 // Call directly into vkEndCommandBuffer instead of the
6269 // the framework's EndCommandBuffer, which inserts a
6270 // vkEndRenderPass
6271 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
6272
6273 m_errorMonitor->VerifyFound();
6274
6275 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
6276 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
6277}
6278
Karl Schultz6addd812016-02-02 17:17:23 -07006279TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006280 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07006281 m_errorMonitor->SetDesiredFailureMsg(
6282 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006283 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006284
6285 ASSERT_NO_FATAL_FAILURE(InitState());
6286 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006287
6288 // Renderpass is started here
6289 BeginCommandBuffer();
6290
6291 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006292 vk_testing::Buffer dstBuffer;
6293 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006294
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006295 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006296
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006297 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006298}
6299
Karl Schultz6addd812016-02-02 17:17:23 -07006300TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006301 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07006302 m_errorMonitor->SetDesiredFailureMsg(
6303 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006304 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006305
6306 ASSERT_NO_FATAL_FAILURE(InitState());
6307 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006308
6309 // Renderpass is started here
6310 BeginCommandBuffer();
6311
6312 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006313 vk_testing::Buffer dstBuffer;
6314 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006315
Karl Schultz6addd812016-02-02 17:17:23 -07006316 VkDeviceSize dstOffset = 0;
6317 VkDeviceSize dataSize = 1024;
6318 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006319
Karl Schultz6addd812016-02-02 17:17:23 -07006320 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
6321 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006322
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006323 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006324}
6325
Karl Schultz6addd812016-02-02 17:17:23 -07006326TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006327 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07006328 m_errorMonitor->SetDesiredFailureMsg(
6329 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006330 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006331
6332 ASSERT_NO_FATAL_FAILURE(InitState());
6333 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006334
6335 // Renderpass is started here
6336 BeginCommandBuffer();
6337
Michael Lentine0a369f62016-02-03 16:51:46 -06006338 VkClearColorValue clear_color;
6339 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07006340 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
6341 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6342 const int32_t tex_width = 32;
6343 const int32_t tex_height = 32;
6344 VkImageCreateInfo image_create_info = {};
6345 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6346 image_create_info.pNext = NULL;
6347 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6348 image_create_info.format = tex_format;
6349 image_create_info.extent.width = tex_width;
6350 image_create_info.extent.height = tex_height;
6351 image_create_info.extent.depth = 1;
6352 image_create_info.mipLevels = 1;
6353 image_create_info.arrayLayers = 1;
6354 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6355 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6356 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006357
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006358 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07006359 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
6360 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006361
Karl Schultz6addd812016-02-02 17:17:23 -07006362 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
6363 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006364
Karl Schultz6addd812016-02-02 17:17:23 -07006365 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
6366 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006367
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006368 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006369}
6370
Karl Schultz6addd812016-02-02 17:17:23 -07006371TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006372 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07006373 m_errorMonitor->SetDesiredFailureMsg(
6374 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006375 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006376
6377 ASSERT_NO_FATAL_FAILURE(InitState());
6378 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006379
6380 // Renderpass is started here
6381 BeginCommandBuffer();
6382
6383 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07006384 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006385 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
6386 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6387 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
6388 image_create_info.extent.width = 64;
6389 image_create_info.extent.height = 64;
6390 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6391 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006392
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006393 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07006394 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
6395 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006396
Karl Schultz6addd812016-02-02 17:17:23 -07006397 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
6398 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006399
Karl Schultz6addd812016-02-02 17:17:23 -07006400 vkCmdClearDepthStencilImage(
6401 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
6402 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
6403 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006404
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006405 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006406}
6407
Karl Schultz6addd812016-02-02 17:17:23 -07006408TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006409 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07006410 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006411
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006413 "vkCmdClearAttachments: This call "
6414 "must be issued inside an active "
6415 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006416
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006417 ASSERT_NO_FATAL_FAILURE(InitState());
6418 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006419
6420 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006421 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006422 ASSERT_VK_SUCCESS(err);
6423
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006424 VkClearAttachment color_attachment;
6425 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6426 color_attachment.clearValue.color.float32[0] = 0;
6427 color_attachment.clearValue.color.float32[1] = 0;
6428 color_attachment.clearValue.color.float32[2] = 0;
6429 color_attachment.clearValue.color.float32[3] = 0;
6430 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006431 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
6432 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
6433 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006434
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006435 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006436}
6437
Karl Schultz9e66a292016-04-21 15:57:51 -06006438TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
6439 // Try to add a buffer memory barrier with no buffer.
6440 m_errorMonitor->SetDesiredFailureMsg(
6441 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6442 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
6443
6444 ASSERT_NO_FATAL_FAILURE(InitState());
6445 BeginCommandBuffer();
6446
6447 VkBufferMemoryBarrier buf_barrier = {};
6448 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
6449 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
6450 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
6451 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
6452 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
6453 buf_barrier.buffer = VK_NULL_HANDLE;
6454 buf_barrier.offset = 0;
6455 buf_barrier.size = VK_WHOLE_SIZE;
6456 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6457 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
6458 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
6459
6460 m_errorMonitor->VerifyFound();
6461}
6462
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06006463TEST_F(VkLayerTest, InvalidBarriers) {
6464 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
6465
6466 m_errorMonitor->SetDesiredFailureMsg(
6467 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
6468
6469 ASSERT_NO_FATAL_FAILURE(InitState());
6470 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6471
6472 VkMemoryBarrier mem_barrier = {};
6473 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
6474 mem_barrier.pNext = NULL;
6475 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
6476 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
6477 BeginCommandBuffer();
6478 // BeginCommandBuffer() starts a render pass
6479 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6480 VK_PIPELINE_STAGE_HOST_BIT,
6481 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
6482 &mem_barrier, 0, nullptr, 0, nullptr);
6483 m_errorMonitor->VerifyFound();
6484
6485 m_errorMonitor->SetDesiredFailureMsg(
6486 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6487 "Image Layout cannot be transitioned to UNDEFINED");
6488 VkImageObj image(m_device);
6489 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6490 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
6491 ASSERT_TRUE(image.initialized());
6492 VkImageMemoryBarrier img_barrier = {};
6493 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
6494 img_barrier.pNext = NULL;
6495 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
6496 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
6497 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
6498 // New layout can't be UNDEFINED
6499 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
6500 img_barrier.image = image.handle();
6501 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
6502 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
6503 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6504 img_barrier.subresourceRange.baseArrayLayer = 0;
6505 img_barrier.subresourceRange.baseMipLevel = 0;
6506 img_barrier.subresourceRange.layerCount = 1;
6507 img_barrier.subresourceRange.levelCount = 1;
6508 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6509 VK_PIPELINE_STAGE_HOST_BIT,
6510 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
6511 nullptr, 1, &img_barrier);
6512 m_errorMonitor->VerifyFound();
6513 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
6514
6515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6516 "Subresource must have the sum of the "
6517 "baseArrayLayer");
6518 // baseArrayLayer + layerCount must be <= image's arrayLayers
6519 img_barrier.subresourceRange.baseArrayLayer = 1;
6520 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6521 VK_PIPELINE_STAGE_HOST_BIT,
6522 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
6523 nullptr, 1, &img_barrier);
6524 m_errorMonitor->VerifyFound();
6525 img_barrier.subresourceRange.baseArrayLayer = 0;
6526
6527 m_errorMonitor->SetDesiredFailureMsg(
6528 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6529 "Subresource must have the sum of the baseMipLevel");
6530 // baseMipLevel + levelCount must be <= image's mipLevels
6531 img_barrier.subresourceRange.baseMipLevel = 1;
6532 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6533 VK_PIPELINE_STAGE_HOST_BIT,
6534 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
6535 nullptr, 1, &img_barrier);
6536 m_errorMonitor->VerifyFound();
6537 img_barrier.subresourceRange.baseMipLevel = 0;
6538
6539 m_errorMonitor->SetDesiredFailureMsg(
6540 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6541 "Buffer Barriers cannot be used during a render pass");
6542 vk_testing::Buffer buffer;
6543 buffer.init(*m_device, 256);
6544 VkBufferMemoryBarrier buf_barrier = {};
6545 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
6546 buf_barrier.pNext = NULL;
6547 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
6548 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
6549 buf_barrier.buffer = buffer.handle();
6550 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
6551 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
6552 buf_barrier.offset = 0;
6553 buf_barrier.size = VK_WHOLE_SIZE;
6554 // Can't send buffer barrier during a render pass
6555 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6556 VK_PIPELINE_STAGE_HOST_BIT,
6557 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
6558 &buf_barrier, 0, nullptr);
6559 m_errorMonitor->VerifyFound();
6560 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
6561
6562 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6563 "which is not less than total size");
6564 buf_barrier.offset = 257;
6565 // Offset greater than total size
6566 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6567 VK_PIPELINE_STAGE_HOST_BIT,
6568 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
6569 &buf_barrier, 0, nullptr);
6570 m_errorMonitor->VerifyFound();
6571 buf_barrier.offset = 0;
6572
6573 m_errorMonitor->SetDesiredFailureMsg(
6574 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
6575 buf_barrier.size = 257;
6576 // Size greater than total size
6577 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6578 VK_PIPELINE_STAGE_HOST_BIT,
6579 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
6580 &buf_barrier, 0, nullptr);
6581 m_errorMonitor->VerifyFound();
6582 buf_barrier.size = VK_WHOLE_SIZE;
6583
6584 m_errorMonitor->SetDesiredFailureMsg(
6585 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6586 "Image is a depth and stencil format and thus must "
6587 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
6588 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
6589 VkDepthStencilObj ds_image(m_device);
6590 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
6591 ASSERT_TRUE(ds_image.initialized());
6592 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
6593 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
6594 img_barrier.image = ds_image.handle();
6595 // Leave aspectMask at COLOR on purpose
6596 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6597 VK_PIPELINE_STAGE_HOST_BIT,
6598 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
6599 nullptr, 1, &img_barrier);
6600 m_errorMonitor->VerifyFound();
6601}
6602
Karl Schultz6addd812016-02-02 17:17:23 -07006603TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006604 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07006605 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006606
Karl Schultz6addd812016-02-02 17:17:23 -07006607 m_errorMonitor->SetDesiredFailureMsg(
6608 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006609 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
6610
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006611 ASSERT_NO_FATAL_FAILURE(InitState());
6612 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006613 uint32_t qfi = 0;
6614 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006615 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6616 buffCI.size = 1024;
6617 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
6618 buffCI.queueFamilyIndexCount = 1;
6619 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006620
6621 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006622 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006623 ASSERT_VK_SUCCESS(err);
6624
6625 BeginCommandBuffer();
6626 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07006627 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6628 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006629 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07006630 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
6631 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006632
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006633 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006634
Chia-I Wuf7458c52015-10-26 21:10:41 +08006635 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006636}
6637
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07006638TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
6639 // Create an out-of-range queueFamilyIndex
6640 m_errorMonitor->SetDesiredFailureMsg(
6641 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -06006642 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
6643 "of the indices specified when the device was created, via the "
6644 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07006645
6646 ASSERT_NO_FATAL_FAILURE(InitState());
6647 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6648 VkBufferCreateInfo buffCI = {};
6649 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6650 buffCI.size = 1024;
6651 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
6652 buffCI.queueFamilyIndexCount = 1;
6653 // Introduce failure by specifying invalid queue_family_index
6654 uint32_t qfi = 777;
6655 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06006656 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07006657
6658 VkBuffer ib;
6659 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
6660
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006661 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07006662}
6663
Karl Schultz6addd812016-02-02 17:17:23 -07006664TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
6665 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
6666 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006667
Karl Schultz6addd812016-02-02 17:17:23 -07006668 m_errorMonitor->SetDesiredFailureMsg(
6669 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006670 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06006671
6672 ASSERT_NO_FATAL_FAILURE(InitState());
6673 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06006674
6675 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006676 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006677 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
6678 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06006679
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006680 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06006681}
6682
Karl Schultz6addd812016-02-02 17:17:23 -07006683TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006684 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07006685 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006686
Karl Schultz6addd812016-02-02 17:17:23 -07006687 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006688 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6689 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
6690 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006691
Tobin Ehlis3b780662015-05-28 12:11:26 -06006692 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006693 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006694 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006695 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6696 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006697
6698 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006699 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6700 ds_pool_ci.pNext = NULL;
6701 ds_pool_ci.maxSets = 1;
6702 ds_pool_ci.poolSizeCount = 1;
6703 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006704
Tobin Ehlis3b780662015-05-28 12:11:26 -06006705 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006706 err =
6707 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006708 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06006709 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006710 dsl_binding.binding = 0;
6711 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6712 dsl_binding.descriptorCount = 1;
6713 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6714 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006715
Tony Barboureb254902015-07-15 12:50:33 -06006716 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006717 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6718 ds_layout_ci.pNext = NULL;
6719 ds_layout_ci.bindingCount = 1;
6720 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006721
Tobin Ehlis3b780662015-05-28 12:11:26 -06006722 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006723 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6724 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006725 ASSERT_VK_SUCCESS(err);
6726
6727 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006728 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006729 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006730 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006731 alloc_info.descriptorPool = ds_pool;
6732 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006733 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6734 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006735 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006736
Tobin Ehlis30db8f82016-05-05 08:19:48 -06006737 VkSamplerCreateInfo sampler_ci = {};
6738 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6739 sampler_ci.pNext = NULL;
6740 sampler_ci.magFilter = VK_FILTER_NEAREST;
6741 sampler_ci.minFilter = VK_FILTER_NEAREST;
6742 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6743 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6744 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6745 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6746 sampler_ci.mipLodBias = 1.0;
6747 sampler_ci.anisotropyEnable = VK_FALSE;
6748 sampler_ci.maxAnisotropy = 1;
6749 sampler_ci.compareEnable = VK_FALSE;
6750 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6751 sampler_ci.minLod = 1.0;
6752 sampler_ci.maxLod = 1.0;
6753 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6754 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6755 VkSampler sampler;
6756 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6757 ASSERT_VK_SUCCESS(err);
6758
6759 VkDescriptorImageInfo info = {};
6760 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006761
6762 VkWriteDescriptorSet descriptor_write;
6763 memset(&descriptor_write, 0, sizeof(descriptor_write));
6764 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006765 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006766 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006767 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006768 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006769 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006770
6771 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6772
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006773 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006774
Chia-I Wuf7458c52015-10-26 21:10:41 +08006775 vkDestroySampler(m_device->device(), sampler, NULL);
6776 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6777 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006778}
6779
Karl Schultz6addd812016-02-02 17:17:23 -07006780TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006781 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07006782 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006783
Karl Schultz6addd812016-02-02 17:17:23 -07006784 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006785 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6786 " binding #0 with 1 total descriptors but update of 1 descriptors "
6787 "starting at binding offset of 0 combined with update array element "
6788 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006789
Tobin Ehlis3b780662015-05-28 12:11:26 -06006790 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006791 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006792 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006793 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6794 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006795
6796 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006797 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6798 ds_pool_ci.pNext = NULL;
6799 ds_pool_ci.maxSets = 1;
6800 ds_pool_ci.poolSizeCount = 1;
6801 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006802
Tobin Ehlis3b780662015-05-28 12:11:26 -06006803 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006804 err =
6805 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006806 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006807
Tony Barboureb254902015-07-15 12:50:33 -06006808 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006809 dsl_binding.binding = 0;
6810 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6811 dsl_binding.descriptorCount = 1;
6812 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6813 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06006814
6815 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006816 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6817 ds_layout_ci.pNext = NULL;
6818 ds_layout_ci.bindingCount = 1;
6819 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006820
Tobin Ehlis3b780662015-05-28 12:11:26 -06006821 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006822 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6823 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006824 ASSERT_VK_SUCCESS(err);
6825
6826 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006827 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006828 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006829 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006830 alloc_info.descriptorPool = ds_pool;
6831 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006832 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6833 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006834 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006835
Tobin Ehlis30db8f82016-05-05 08:19:48 -06006836 // Correctly update descriptor to avoid "NOT_UPDATED" error
6837 VkDescriptorBufferInfo buff_info = {};
6838 buff_info.buffer =
6839 VkBuffer(0); // Don't care about buffer handle for this test
6840 buff_info.offset = 0;
6841 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006842
6843 VkWriteDescriptorSet descriptor_write;
6844 memset(&descriptor_write, 0, sizeof(descriptor_write));
6845 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006846 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006847 descriptor_write.dstArrayElement =
6848 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08006849 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006850 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6851 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006852
6853 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6854
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006855 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006856
Chia-I Wuf7458c52015-10-26 21:10:41 +08006857 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6858 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006859}
6860
Karl Schultz6addd812016-02-02 17:17:23 -07006861TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
6862 // Create layout w/ count of 1 and attempt update to that layout w/ binding
6863 // index 2
6864 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006865
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006866 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6867 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006868
Tobin Ehlis3b780662015-05-28 12:11:26 -06006869 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006870 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006871 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006872 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6873 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006874
6875 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006876 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6877 ds_pool_ci.pNext = NULL;
6878 ds_pool_ci.maxSets = 1;
6879 ds_pool_ci.poolSizeCount = 1;
6880 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006881
Tobin Ehlis3b780662015-05-28 12:11:26 -06006882 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006883 err =
6884 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006885 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006886
Tony Barboureb254902015-07-15 12:50:33 -06006887 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006888 dsl_binding.binding = 0;
6889 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6890 dsl_binding.descriptorCount = 1;
6891 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6892 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06006893
6894 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006895 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6896 ds_layout_ci.pNext = NULL;
6897 ds_layout_ci.bindingCount = 1;
6898 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006899 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006900 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6901 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006902 ASSERT_VK_SUCCESS(err);
6903
6904 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006905 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006906 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006907 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006908 alloc_info.descriptorPool = ds_pool;
6909 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006910 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6911 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006912 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006913
Tony Barboureb254902015-07-15 12:50:33 -06006914 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006915 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6916 sampler_ci.pNext = NULL;
6917 sampler_ci.magFilter = VK_FILTER_NEAREST;
6918 sampler_ci.minFilter = VK_FILTER_NEAREST;
6919 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6920 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6921 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6922 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6923 sampler_ci.mipLodBias = 1.0;
6924 sampler_ci.anisotropyEnable = VK_FALSE;
6925 sampler_ci.maxAnisotropy = 1;
6926 sampler_ci.compareEnable = VK_FALSE;
6927 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6928 sampler_ci.minLod = 1.0;
6929 sampler_ci.maxLod = 1.0;
6930 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6931 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06006932
Tobin Ehlis3b780662015-05-28 12:11:26 -06006933 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006934 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006935 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006936
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006937 VkDescriptorImageInfo info = {};
6938 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006939
6940 VkWriteDescriptorSet descriptor_write;
6941 memset(&descriptor_write, 0, sizeof(descriptor_write));
6942 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006943 descriptor_write.dstSet = descriptorSet;
6944 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006945 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006946 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006947 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006948 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006949
6950 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6951
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006952 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006953
Chia-I Wuf7458c52015-10-26 21:10:41 +08006954 vkDestroySampler(m_device->device(), sampler, NULL);
6955 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6956 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006957}
6958
Karl Schultz6addd812016-02-02 17:17:23 -07006959TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
6960 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
6961 // types
6962 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006963
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006965 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006966
Tobin Ehlis3b780662015-05-28 12:11:26 -06006967 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006968
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006969 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006970 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6971 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006972
6973 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006974 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6975 ds_pool_ci.pNext = NULL;
6976 ds_pool_ci.maxSets = 1;
6977 ds_pool_ci.poolSizeCount = 1;
6978 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006979
Tobin Ehlis3b780662015-05-28 12:11:26 -06006980 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006981 err =
6982 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006983 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06006984 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006985 dsl_binding.binding = 0;
6986 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6987 dsl_binding.descriptorCount = 1;
6988 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6989 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006990
Tony Barboureb254902015-07-15 12:50:33 -06006991 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006992 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6993 ds_layout_ci.pNext = NULL;
6994 ds_layout_ci.bindingCount = 1;
6995 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006996
Tobin Ehlis3b780662015-05-28 12:11:26 -06006997 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006998 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6999 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007000 ASSERT_VK_SUCCESS(err);
7001
7002 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007003 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007004 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007005 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007006 alloc_info.descriptorPool = ds_pool;
7007 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007008 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7009 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007010 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007011
Tony Barboureb254902015-07-15 12:50:33 -06007012 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007013 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
7014 sampler_ci.pNext = NULL;
7015 sampler_ci.magFilter = VK_FILTER_NEAREST;
7016 sampler_ci.minFilter = VK_FILTER_NEAREST;
7017 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
7018 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7019 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7020 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7021 sampler_ci.mipLodBias = 1.0;
7022 sampler_ci.anisotropyEnable = VK_FALSE;
7023 sampler_ci.maxAnisotropy = 1;
7024 sampler_ci.compareEnable = VK_FALSE;
7025 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
7026 sampler_ci.minLod = 1.0;
7027 sampler_ci.maxLod = 1.0;
7028 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
7029 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06007030 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007031 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007032 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08007033
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06007034 VkDescriptorImageInfo info = {};
7035 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08007036
7037 VkWriteDescriptorSet descriptor_write;
7038 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07007039 descriptor_write.sType =
7040 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007041 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007042 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06007043 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08007044 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06007045 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08007046
7047 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7048
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007049 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007050
Chia-I Wuf7458c52015-10-26 21:10:41 +08007051 vkDestroySampler(m_device->device(), sampler, NULL);
7052 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7053 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007054}
7055
Karl Schultz6addd812016-02-02 17:17:23 -07007056TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007057 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07007058 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007059
Karl Schultz6addd812016-02-02 17:17:23 -07007060 m_errorMonitor->SetDesiredFailureMsg(
7061 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007062 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007063
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007064 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07007065 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
7066 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007067 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007068 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
7069 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007070
7071 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007072 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7073 ds_pool_ci.pNext = NULL;
7074 ds_pool_ci.maxSets = 1;
7075 ds_pool_ci.poolSizeCount = 1;
7076 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007077
7078 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007079 err =
7080 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007081 ASSERT_VK_SUCCESS(err);
7082
7083 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007084 dsl_binding.binding = 0;
7085 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
7086 dsl_binding.descriptorCount = 1;
7087 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7088 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007089
7090 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007091 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7092 ds_layout_ci.pNext = NULL;
7093 ds_layout_ci.bindingCount = 1;
7094 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007095 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007096 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7097 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007098 ASSERT_VK_SUCCESS(err);
7099
7100 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007101 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007102 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007103 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007104 alloc_info.descriptorPool = ds_pool;
7105 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007106 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7107 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007108 ASSERT_VK_SUCCESS(err);
7109
Karl Schultz6addd812016-02-02 17:17:23 -07007110 VkSampler sampler =
7111 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007112
7113 VkDescriptorImageInfo descriptor_info;
7114 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
7115 descriptor_info.sampler = sampler;
7116
7117 VkWriteDescriptorSet descriptor_write;
7118 memset(&descriptor_write, 0, sizeof(descriptor_write));
7119 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007120 descriptor_write.dstSet = descriptorSet;
7121 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007122 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007123 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
7124 descriptor_write.pImageInfo = &descriptor_info;
7125
7126 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7127
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007128 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007129
Chia-I Wuf7458c52015-10-26 21:10:41 +08007130 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7131 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007132}
7133
Karl Schultz6addd812016-02-02 17:17:23 -07007134TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
7135 // Create a single combined Image/Sampler descriptor and send it an invalid
7136 // imageView
7137 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007138
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007139 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7140 "Attempted write update to combined "
7141 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -06007142 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007143
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007144 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007145 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007146 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
7147 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007148
7149 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007150 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7151 ds_pool_ci.pNext = NULL;
7152 ds_pool_ci.maxSets = 1;
7153 ds_pool_ci.poolSizeCount = 1;
7154 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007155
7156 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007157 err =
7158 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007159 ASSERT_VK_SUCCESS(err);
7160
7161 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007162 dsl_binding.binding = 0;
7163 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
7164 dsl_binding.descriptorCount = 1;
7165 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7166 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007167
7168 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007169 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7170 ds_layout_ci.pNext = NULL;
7171 ds_layout_ci.bindingCount = 1;
7172 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007173 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007174 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7175 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007176 ASSERT_VK_SUCCESS(err);
7177
7178 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007179 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007180 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007181 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007182 alloc_info.descriptorPool = ds_pool;
7183 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007184 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7185 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007186 ASSERT_VK_SUCCESS(err);
7187
7188 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007189 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
7190 sampler_ci.pNext = NULL;
7191 sampler_ci.magFilter = VK_FILTER_NEAREST;
7192 sampler_ci.minFilter = VK_FILTER_NEAREST;
7193 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
7194 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7195 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7196 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7197 sampler_ci.mipLodBias = 1.0;
7198 sampler_ci.anisotropyEnable = VK_FALSE;
7199 sampler_ci.maxAnisotropy = 1;
7200 sampler_ci.compareEnable = VK_FALSE;
7201 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
7202 sampler_ci.minLod = 1.0;
7203 sampler_ci.maxLod = 1.0;
7204 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
7205 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007206
7207 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007208 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007209 ASSERT_VK_SUCCESS(err);
7210
Karl Schultz6addd812016-02-02 17:17:23 -07007211 VkImageView view =
7212 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007213
7214 VkDescriptorImageInfo descriptor_info;
7215 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
7216 descriptor_info.sampler = sampler;
7217 descriptor_info.imageView = view;
7218
7219 VkWriteDescriptorSet descriptor_write;
7220 memset(&descriptor_write, 0, sizeof(descriptor_write));
7221 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007222 descriptor_write.dstSet = descriptorSet;
7223 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007224 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007225 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
7226 descriptor_write.pImageInfo = &descriptor_info;
7227
7228 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7229
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007230 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007231
Chia-I Wuf7458c52015-10-26 21:10:41 +08007232 vkDestroySampler(m_device->device(), sampler, NULL);
7233 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7234 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007235}
7236
Karl Schultz6addd812016-02-02 17:17:23 -07007237TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
7238 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
7239 // into the other
7240 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007241
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7243 " binding #1 with type "
7244 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
7245 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007246
Tobin Ehlis04356f92015-10-27 16:35:27 -06007247 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07007248 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007249 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007250 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7251 ds_type_count[0].descriptorCount = 1;
7252 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7253 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007254
7255 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007256 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7257 ds_pool_ci.pNext = NULL;
7258 ds_pool_ci.maxSets = 1;
7259 ds_pool_ci.poolSizeCount = 2;
7260 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007261
7262 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007263 err =
7264 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06007265 ASSERT_VK_SUCCESS(err);
7266 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007267 dsl_binding[0].binding = 0;
7268 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7269 dsl_binding[0].descriptorCount = 1;
7270 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7271 dsl_binding[0].pImmutableSamplers = NULL;
7272 dsl_binding[1].binding = 1;
7273 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
7274 dsl_binding[1].descriptorCount = 1;
7275 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7276 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007277
7278 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007279 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7280 ds_layout_ci.pNext = NULL;
7281 ds_layout_ci.bindingCount = 2;
7282 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007283
7284 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007285 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7286 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06007287 ASSERT_VK_SUCCESS(err);
7288
7289 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007290 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007291 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007292 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007293 alloc_info.descriptorPool = ds_pool;
7294 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007295 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7296 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06007297 ASSERT_VK_SUCCESS(err);
7298
7299 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007300 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
7301 sampler_ci.pNext = NULL;
7302 sampler_ci.magFilter = VK_FILTER_NEAREST;
7303 sampler_ci.minFilter = VK_FILTER_NEAREST;
7304 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
7305 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7306 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7307 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7308 sampler_ci.mipLodBias = 1.0;
7309 sampler_ci.anisotropyEnable = VK_FALSE;
7310 sampler_ci.maxAnisotropy = 1;
7311 sampler_ci.compareEnable = VK_FALSE;
7312 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
7313 sampler_ci.minLod = 1.0;
7314 sampler_ci.maxLod = 1.0;
7315 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
7316 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007317
7318 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007319 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06007320 ASSERT_VK_SUCCESS(err);
7321
7322 VkDescriptorImageInfo info = {};
7323 info.sampler = sampler;
7324
7325 VkWriteDescriptorSet descriptor_write;
7326 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
7327 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007328 descriptor_write.dstSet = descriptorSet;
7329 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08007330 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007331 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
7332 descriptor_write.pImageInfo = &info;
7333 // This write update should succeed
7334 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7335 // Now perform a copy update that fails due to type mismatch
7336 VkCopyDescriptorSet copy_ds_update;
7337 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
7338 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
7339 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06007340 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007341 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007342 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08007343 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06007344 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
7345
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007346 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06007347 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07007348 m_errorMonitor->SetDesiredFailureMsg(
7349 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007350 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -06007351 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
7352 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
7353 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007354 copy_ds_update.srcBinding =
7355 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007356 copy_ds_update.dstSet = descriptorSet;
7357 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06007358 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06007359 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
7360
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007361 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007362
Tobin Ehlis04356f92015-10-27 16:35:27 -06007363 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07007364 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007365 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
7366 "update array offset of 0 and update of "
7367 "5 descriptors oversteps total number "
7368 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007369
Tobin Ehlis04356f92015-10-27 16:35:27 -06007370 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
7371 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
7372 copy_ds_update.srcSet = descriptorSet;
7373 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007374 copy_ds_update.dstSet = descriptorSet;
7375 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07007376 copy_ds_update.descriptorCount =
7377 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06007378 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
7379
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007380 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06007381
Chia-I Wuf7458c52015-10-26 21:10:41 +08007382 vkDestroySampler(m_device->device(), sampler, NULL);
7383 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7384 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06007385}
7386
Karl Schultz6addd812016-02-02 17:17:23 -07007387TEST_F(VkLayerTest, NumSamplesMismatch) {
7388 // Create CommandBuffer where MSAA samples doesn't match RenderPass
7389 // sampleCount
7390 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06007391
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007392 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007393 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007394
Tobin Ehlis3b780662015-05-28 12:11:26 -06007395 ASSERT_NO_FATAL_FAILURE(InitState());
7396 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007397 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06007398 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007399 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007400
7401 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007402 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7403 ds_pool_ci.pNext = NULL;
7404 ds_pool_ci.maxSets = 1;
7405 ds_pool_ci.poolSizeCount = 1;
7406 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06007407
Tobin Ehlis3b780662015-05-28 12:11:26 -06007408 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007409 err =
7410 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007411 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007412
Tony Barboureb254902015-07-15 12:50:33 -06007413 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007414 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06007415 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007416 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007417 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7418 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06007419
Tony Barboureb254902015-07-15 12:50:33 -06007420 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7421 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7422 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007423 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007424 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007425
Tobin Ehlis3b780662015-05-28 12:11:26 -06007426 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007427 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7428 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007429 ASSERT_VK_SUCCESS(err);
7430
7431 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007432 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007433 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007434 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007435 alloc_info.descriptorPool = ds_pool;
7436 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007437 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7438 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007439 ASSERT_VK_SUCCESS(err);
7440
Tony Barboureb254902015-07-15 12:50:33 -06007441 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007442 pipe_ms_state_ci.sType =
7443 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7444 pipe_ms_state_ci.pNext = NULL;
7445 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7446 pipe_ms_state_ci.sampleShadingEnable = 0;
7447 pipe_ms_state_ci.minSampleShading = 1.0;
7448 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06007449
Tony Barboureb254902015-07-15 12:50:33 -06007450 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007451 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7452 pipeline_layout_ci.pNext = NULL;
7453 pipeline_layout_ci.setLayoutCount = 1;
7454 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06007455
7456 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007457 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7458 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007459 ASSERT_VK_SUCCESS(err);
7460
Karl Schultz6addd812016-02-02 17:17:23 -07007461 VkShaderObj vs(m_device, bindStateVertShaderText,
7462 VK_SHADER_STAGE_VERTEX_BIT, this);
7463 VkShaderObj fs(m_device, bindStateFragShaderText,
7464 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06007465 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07007466 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007467 VkPipelineObj pipe(m_device);
7468 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007469 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06007470 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007471 pipe.SetMSAA(&pipe_ms_state_ci);
7472 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06007473
Tony Barbourfe3351b2015-07-28 10:17:20 -06007474 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007475 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7476 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06007477
Mark Young29927482016-05-04 14:38:51 -06007478 // Render triangle (the error should trigger on the attempt to draw).
7479 Draw(3, 1, 0, 0);
7480
7481 // Finalize recording of the command buffer
7482 EndCommandBuffer();
7483
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007484 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007485
Chia-I Wuf7458c52015-10-26 21:10:41 +08007486 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7487 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7488 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007489}
Mark Young29927482016-05-04 14:38:51 -06007490
Mark Youngc89c6312016-03-31 16:03:20 -06007491TEST_F(VkLayerTest, NumBlendAttachMismatch) {
7492 // Create Pipeline where the number of blend attachments doesn't match the
7493 // number of color attachments. In this case, we don't add any color
7494 // blend attachments even though we have a color attachment.
7495 VkResult err;
7496
7497 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -06007498 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -06007499
7500 ASSERT_NO_FATAL_FAILURE(InitState());
7501 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7502 VkDescriptorPoolSize ds_type_count = {};
7503 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7504 ds_type_count.descriptorCount = 1;
7505
7506 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7507 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7508 ds_pool_ci.pNext = NULL;
7509 ds_pool_ci.maxSets = 1;
7510 ds_pool_ci.poolSizeCount = 1;
7511 ds_pool_ci.pPoolSizes = &ds_type_count;
7512
7513 VkDescriptorPool ds_pool;
7514 err =
7515 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
7516 ASSERT_VK_SUCCESS(err);
7517
7518 VkDescriptorSetLayoutBinding dsl_binding = {};
7519 dsl_binding.binding = 0;
7520 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7521 dsl_binding.descriptorCount = 1;
7522 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7523 dsl_binding.pImmutableSamplers = NULL;
7524
7525 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7526 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7527 ds_layout_ci.pNext = NULL;
7528 ds_layout_ci.bindingCount = 1;
7529 ds_layout_ci.pBindings = &dsl_binding;
7530
7531 VkDescriptorSetLayout ds_layout;
7532 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7533 &ds_layout);
7534 ASSERT_VK_SUCCESS(err);
7535
7536 VkDescriptorSet descriptorSet;
7537 VkDescriptorSetAllocateInfo alloc_info = {};
7538 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7539 alloc_info.descriptorSetCount = 1;
7540 alloc_info.descriptorPool = ds_pool;
7541 alloc_info.pSetLayouts = &ds_layout;
7542 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7543 &descriptorSet);
7544 ASSERT_VK_SUCCESS(err);
7545
7546 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7547 pipe_ms_state_ci.sType =
7548 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7549 pipe_ms_state_ci.pNext = NULL;
7550 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7551 pipe_ms_state_ci.sampleShadingEnable = 0;
7552 pipe_ms_state_ci.minSampleShading = 1.0;
7553 pipe_ms_state_ci.pSampleMask = NULL;
7554
7555 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7556 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7557 pipeline_layout_ci.pNext = NULL;
7558 pipeline_layout_ci.setLayoutCount = 1;
7559 pipeline_layout_ci.pSetLayouts = &ds_layout;
7560
7561 VkPipelineLayout pipeline_layout;
7562 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7563 &pipeline_layout);
7564 ASSERT_VK_SUCCESS(err);
7565
7566 VkShaderObj vs(m_device, bindStateVertShaderText,
7567 VK_SHADER_STAGE_VERTEX_BIT, this);
7568 VkShaderObj fs(m_device, bindStateFragShaderText,
7569 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06007570 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06007571 // but add it to be able to run on more devices
7572 VkPipelineObj pipe(m_device);
7573 pipe.AddShader(&vs);
7574 pipe.AddShader(&fs);
7575 pipe.SetMSAA(&pipe_ms_state_ci);
7576 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7577
7578 BeginCommandBuffer();
7579 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7580 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7581
Mark Young29927482016-05-04 14:38:51 -06007582 // Render triangle (the error should trigger on the attempt to draw).
7583 Draw(3, 1, 0, 0);
7584
7585 // Finalize recording of the command buffer
7586 EndCommandBuffer();
7587
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007588 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06007589
7590 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7591 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7592 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7593}
Mark Young29927482016-05-04 14:38:51 -06007594
Karl Schultz6addd812016-02-02 17:17:23 -07007595TEST_F(VkLayerTest, ClearCmdNoDraw) {
7596 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
7597 // to issuing a Draw
7598 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007599
Karl Schultz6addd812016-02-02 17:17:23 -07007600 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07007601 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007602 "vkCmdClearAttachments() issued on CB object ");
7603
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007604 ASSERT_NO_FATAL_FAILURE(InitState());
7605 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06007606
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007607 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007608 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7609 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007610
7611 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007612 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7613 ds_pool_ci.pNext = NULL;
7614 ds_pool_ci.maxSets = 1;
7615 ds_pool_ci.poolSizeCount = 1;
7616 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06007617
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007618 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007619 err =
7620 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007621 ASSERT_VK_SUCCESS(err);
7622
Tony Barboureb254902015-07-15 12:50:33 -06007623 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007624 dsl_binding.binding = 0;
7625 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7626 dsl_binding.descriptorCount = 1;
7627 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7628 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007629
Tony Barboureb254902015-07-15 12:50:33 -06007630 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007631 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7632 ds_layout_ci.pNext = NULL;
7633 ds_layout_ci.bindingCount = 1;
7634 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007635
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007636 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007637 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7638 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007639 ASSERT_VK_SUCCESS(err);
7640
7641 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007642 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007643 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007644 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007645 alloc_info.descriptorPool = ds_pool;
7646 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007647 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7648 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007649 ASSERT_VK_SUCCESS(err);
7650
Tony Barboureb254902015-07-15 12:50:33 -06007651 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007652 pipe_ms_state_ci.sType =
7653 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7654 pipe_ms_state_ci.pNext = NULL;
7655 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7656 pipe_ms_state_ci.sampleShadingEnable = 0;
7657 pipe_ms_state_ci.minSampleShading = 1.0;
7658 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007659
Tony Barboureb254902015-07-15 12:50:33 -06007660 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007661 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7662 pipeline_layout_ci.pNext = NULL;
7663 pipeline_layout_ci.setLayoutCount = 1;
7664 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007665
7666 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007667 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7668 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007669 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007670
Karl Schultz6addd812016-02-02 17:17:23 -07007671 VkShaderObj vs(m_device, bindStateVertShaderText,
7672 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06007673 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07007674 // on more devices
7675 VkShaderObj fs(m_device, bindStateFragShaderText,
7676 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007677
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007678 VkPipelineObj pipe(m_device);
7679 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007680 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007681 pipe.SetMSAA(&pipe_ms_state_ci);
7682 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007683
7684 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007685
Karl Schultz6addd812016-02-02 17:17:23 -07007686 // Main thing we care about for this test is that the VkImage obj we're
7687 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007688 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06007689 VkClearAttachment color_attachment;
7690 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7691 color_attachment.clearValue.color.float32[0] = 1.0;
7692 color_attachment.clearValue.color.float32[1] = 1.0;
7693 color_attachment.clearValue.color.float32[2] = 1.0;
7694 color_attachment.clearValue.color.float32[3] = 1.0;
7695 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07007696 VkClearRect clear_rect = {
7697 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007698
Karl Schultz6addd812016-02-02 17:17:23 -07007699 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
7700 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007701
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007702 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007703
Chia-I Wuf7458c52015-10-26 21:10:41 +08007704 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7705 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7706 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007707}
7708
Karl Schultz6addd812016-02-02 17:17:23 -07007709TEST_F(VkLayerTest, VtxBufferBadIndex) {
7710 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007711
Karl Schultz6addd812016-02-02 17:17:23 -07007712 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007713 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07007714 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007715
Tobin Ehlis502480b2015-06-24 15:53:07 -06007716 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06007717 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06007718 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06007719
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007720 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007721 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7722 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007723
7724 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007725 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7726 ds_pool_ci.pNext = NULL;
7727 ds_pool_ci.maxSets = 1;
7728 ds_pool_ci.poolSizeCount = 1;
7729 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06007730
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06007731 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007732 err =
7733 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007734 ASSERT_VK_SUCCESS(err);
7735
Tony Barboureb254902015-07-15 12:50:33 -06007736 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007737 dsl_binding.binding = 0;
7738 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7739 dsl_binding.descriptorCount = 1;
7740 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7741 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007742
Tony Barboureb254902015-07-15 12:50:33 -06007743 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007744 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7745 ds_layout_ci.pNext = NULL;
7746 ds_layout_ci.bindingCount = 1;
7747 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007748
Tobin Ehlis502480b2015-06-24 15:53:07 -06007749 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007750 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7751 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007752 ASSERT_VK_SUCCESS(err);
7753
7754 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007755 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007756 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007757 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007758 alloc_info.descriptorPool = ds_pool;
7759 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007760 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7761 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007762 ASSERT_VK_SUCCESS(err);
7763
Tony Barboureb254902015-07-15 12:50:33 -06007764 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007765 pipe_ms_state_ci.sType =
7766 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7767 pipe_ms_state_ci.pNext = NULL;
7768 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7769 pipe_ms_state_ci.sampleShadingEnable = 0;
7770 pipe_ms_state_ci.minSampleShading = 1.0;
7771 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007772
Tony Barboureb254902015-07-15 12:50:33 -06007773 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007774 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7775 pipeline_layout_ci.pNext = NULL;
7776 pipeline_layout_ci.setLayoutCount = 1;
7777 pipeline_layout_ci.pSetLayouts = &ds_layout;
7778 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007779
Karl Schultz6addd812016-02-02 17:17:23 -07007780 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7781 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007782 ASSERT_VK_SUCCESS(err);
7783
Karl Schultz6addd812016-02-02 17:17:23 -07007784 VkShaderObj vs(m_device, bindStateVertShaderText,
7785 VK_SHADER_STAGE_VERTEX_BIT, this);
7786 VkShaderObj fs(m_device, bindStateFragShaderText,
7787 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06007788 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07007789 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007790 VkPipelineObj pipe(m_device);
7791 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007792 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06007793 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007794 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007795 pipe.SetViewport(m_viewports);
7796 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007797 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007798
7799 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007800 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7801 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06007802 // Don't care about actual data, just need to get to draw to flag error
7803 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07007804 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
7805 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06007806 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06007807 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007808
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007809 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007810
Chia-I Wuf7458c52015-10-26 21:10:41 +08007811 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7812 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7813 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007814}
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06007815// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
7816TEST_F(VkLayerTest, InvalidImageLayout) {
7817 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
7818 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
7819 "images in the wrong layout when they're copied or transitioned.");
7820 // 3 in ValidateCmdBufImageLayouts
7821 // * -1 Attempt to submit cmd buf w/ deleted image
7822 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
7823 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
7824 m_errorMonitor->SetDesiredFailureMsg(
7825 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7826 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
7827
7828 ASSERT_NO_FATAL_FAILURE(InitState());
7829 // Create src & dst images to use for copy operations
7830 VkImage src_image;
7831 VkImage dst_image;
7832
7833 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7834 const int32_t tex_width = 32;
7835 const int32_t tex_height = 32;
7836
7837 VkImageCreateInfo image_create_info = {};
7838 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7839 image_create_info.pNext = NULL;
7840 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7841 image_create_info.format = tex_format;
7842 image_create_info.extent.width = tex_width;
7843 image_create_info.extent.height = tex_height;
7844 image_create_info.extent.depth = 1;
7845 image_create_info.mipLevels = 1;
7846 image_create_info.arrayLayers = 4;
7847 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7848 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7849 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7850 image_create_info.flags = 0;
7851
7852 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
7853 ASSERT_VK_SUCCESS(err);
7854 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
7855 ASSERT_VK_SUCCESS(err);
7856
7857 BeginCommandBuffer();
7858 VkImageCopy copyRegion;
7859 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7860 copyRegion.srcSubresource.mipLevel = 0;
7861 copyRegion.srcSubresource.baseArrayLayer = 0;
7862 copyRegion.srcSubresource.layerCount = 1;
7863 copyRegion.srcOffset.x = 0;
7864 copyRegion.srcOffset.y = 0;
7865 copyRegion.srcOffset.z = 0;
7866 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7867 copyRegion.dstSubresource.mipLevel = 0;
7868 copyRegion.dstSubresource.baseArrayLayer = 0;
7869 copyRegion.dstSubresource.layerCount = 1;
7870 copyRegion.dstOffset.x = 0;
7871 copyRegion.dstOffset.y = 0;
7872 copyRegion.dstOffset.z = 0;
7873 copyRegion.extent.width = 1;
7874 copyRegion.extent.height = 1;
7875 copyRegion.extent.depth = 1;
7876 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7877 m_errorMonitor->VerifyFound();
7878 // Now cause error due to src image layout changing
7879 m_errorMonitor->SetDesiredFailureMsg(
7880 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7881 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
7882 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7883 m_errorMonitor->VerifyFound();
7884 // Final src error is due to bad layout type
7885 m_errorMonitor->SetDesiredFailureMsg(
7886 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7887 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
7888 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7889 m_errorMonitor->VerifyFound();
7890 // Now verify same checks for dst
7891 m_errorMonitor->SetDesiredFailureMsg(
7892 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7893 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
7894 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7895 m_errorMonitor->VerifyFound();
7896 // Now cause error due to src image layout changing
7897 m_errorMonitor->SetDesiredFailureMsg(
7898 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7899 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
7900 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
7901 m_errorMonitor->VerifyFound();
7902 m_errorMonitor->SetDesiredFailureMsg(
7903 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7904 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
7905 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
7906 m_errorMonitor->VerifyFound();
7907 // Now cause error due to bad image layout transition in PipelineBarrier
7908 VkImageMemoryBarrier image_barrier[1] = {};
7909 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7910 image_barrier[0].image = src_image;
7911 image_barrier[0].subresourceRange.layerCount = 2;
7912 image_barrier[0].subresourceRange.levelCount = 2;
7913 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7914 m_errorMonitor->SetDesiredFailureMsg(
7915 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7916 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
7917 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
7918 m_errorMonitor->VerifyFound();
7919
7920 // Finally some layout errors at RenderPass create time
7921 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
7922 VkAttachmentReference attach = {};
7923 // perf warning for GENERAL layout w/ non-DS input attachment
7924 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7925 VkSubpassDescription subpass = {};
7926 subpass.inputAttachmentCount = 1;
7927 subpass.pInputAttachments = &attach;
7928 VkRenderPassCreateInfo rpci = {};
7929 rpci.subpassCount = 1;
7930 rpci.pSubpasses = &subpass;
7931 rpci.attachmentCount = 1;
7932 VkAttachmentDescription attach_desc = {};
7933 attach_desc.format = VK_FORMAT_UNDEFINED;
7934 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -06007935 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06007936 VkRenderPass rp;
7937 m_errorMonitor->SetDesiredFailureMsg(
7938 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7939 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
7940 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7941 m_errorMonitor->VerifyFound();
7942 // error w/ non-general layout
7943 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7944
7945 m_errorMonitor->SetDesiredFailureMsg(
7946 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7947 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
7948 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7949 m_errorMonitor->VerifyFound();
7950 subpass.inputAttachmentCount = 0;
7951 subpass.colorAttachmentCount = 1;
7952 subpass.pColorAttachments = &attach;
7953 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7954 // perf warning for GENERAL layout on color attachment
7955 m_errorMonitor->SetDesiredFailureMsg(
7956 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7957 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
7958 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7959 m_errorMonitor->VerifyFound();
7960 // error w/ non-color opt or GENERAL layout for color attachment
7961 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7962 m_errorMonitor->SetDesiredFailureMsg(
7963 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7964 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
7965 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7966 m_errorMonitor->VerifyFound();
7967 subpass.colorAttachmentCount = 0;
7968 subpass.pDepthStencilAttachment = &attach;
7969 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7970 // perf warning for GENERAL layout on DS attachment
7971 m_errorMonitor->SetDesiredFailureMsg(
7972 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7973 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
7974 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7975 m_errorMonitor->VerifyFound();
7976 // error w/ non-ds opt or GENERAL layout for color attachment
7977 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7978 m_errorMonitor->SetDesiredFailureMsg(
7979 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7980 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
7981 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7982 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -06007983 // For this error we need a valid renderpass so create default one
7984 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7985 attach.attachment = 0;
7986 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
7987 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
7988 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
7989 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
7990 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
7991 // Can't do a CLEAR load on READ_ONLY initialLayout
7992 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
7993 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7994 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
7995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7996 " with invalid first layout "
7997 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
7998 "ONLY_OPTIMAL");
7999 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8000 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06008001
8002 vkDestroyImage(m_device->device(), src_image, NULL);
8003 vkDestroyImage(m_device->device(), dst_image, NULL);
8004}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008005#endif // DRAW_STATE_TESTS
8006
Tobin Ehlis0788f522015-05-26 16:11:58 -06008007#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06008008#if GTEST_IS_THREADSAFE
8009struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008010 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06008011 VkEvent event;
8012 bool bailout;
8013};
8014
Karl Schultz6addd812016-02-02 17:17:23 -07008015extern "C" void *AddToCommandBuffer(void *arg) {
8016 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06008017
Karl Schultz6addd812016-02-02 17:17:23 -07008018 for (int i = 0; i < 10000; i++) {
8019 vkCmdSetEvent(data->commandBuffer, data->event,
8020 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06008021 if (data->bailout) {
8022 break;
8023 }
8024 }
8025 return NULL;
8026}
8027
Karl Schultz6addd812016-02-02 17:17:23 -07008028TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06008029 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06008030
Karl Schultz6addd812016-02-02 17:17:23 -07008031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8032 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008033
Mike Stroyanaccf7692015-05-12 16:00:45 -06008034 ASSERT_NO_FATAL_FAILURE(InitState());
8035 ASSERT_NO_FATAL_FAILURE(InitViewport());
8036 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8037
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008038 // Calls AllocateCommandBuffers
8039 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06008040
8041 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008042 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06008043
8044 VkEventCreateInfo event_info;
8045 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06008046 VkResult err;
8047
8048 memset(&event_info, 0, sizeof(event_info));
8049 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
8050
Chia-I Wuf7458c52015-10-26 21:10:41 +08008051 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06008052 ASSERT_VK_SUCCESS(err);
8053
Mike Stroyanaccf7692015-05-12 16:00:45 -06008054 err = vkResetEvent(device(), event);
8055 ASSERT_VK_SUCCESS(err);
8056
8057 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008058 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06008059 data.event = event;
8060 data.bailout = false;
8061 m_errorMonitor->SetBailout(&data.bailout);
8062 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06008063 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06008064 // Add many entries to command buffer from this thread at the same time.
8065 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06008066
Mike Stroyan4268d1f2015-07-13 14:45:35 -06008067 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008068 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06008069
Mike Stroyan10b8cb72016-01-22 15:22:03 -07008070 m_errorMonitor->SetBailout(NULL);
8071
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008072 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06008073
Chia-I Wuf7458c52015-10-26 21:10:41 +08008074 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06008075}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008076#endif // GTEST_IS_THREADSAFE
8077#endif // THREADING_TESTS
8078
Chris Forbes9f7ff632015-05-25 11:13:08 +12008079#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07008080TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12008082 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008083
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008084 ASSERT_NO_FATAL_FAILURE(InitState());
8085 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8086
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008087 VkShaderModule module;
8088 VkShaderModuleCreateInfo moduleCreateInfo;
8089 struct icd_spv_header spv;
8090
8091 spv.magic = ICD_SPV_MAGIC;
8092 spv.version = ICD_SPV_VERSION;
8093 spv.gen_magic = 0;
8094
8095 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
8096 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008097 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008098 moduleCreateInfo.codeSize = 4;
8099 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008100 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008101
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008102 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008103}
8104
Karl Schultz6addd812016-02-02 17:17:23 -07008105TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008106 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12008107 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008108
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008109 ASSERT_NO_FATAL_FAILURE(InitState());
8110 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8111
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008112 VkShaderModule module;
8113 VkShaderModuleCreateInfo moduleCreateInfo;
8114 struct icd_spv_header spv;
8115
8116 spv.magic = ~ICD_SPV_MAGIC;
8117 spv.version = ICD_SPV_VERSION;
8118 spv.gen_magic = 0;
8119
8120 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
8121 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008122 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008123 moduleCreateInfo.codeSize = sizeof(spv) + 10;
8124 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008125 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008126
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008127 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008128}
8129
Chris Forbesb4afd0f2016-04-04 10:48:35 +12008130#if 0
8131// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07008132TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008133 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12008134 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008135
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008136 ASSERT_NO_FATAL_FAILURE(InitState());
8137 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8138
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008139 VkShaderModule module;
8140 VkShaderModuleCreateInfo moduleCreateInfo;
8141 struct icd_spv_header spv;
8142
8143 spv.magic = ICD_SPV_MAGIC;
8144 spv.version = ~ICD_SPV_VERSION;
8145 spv.gen_magic = 0;
8146
8147 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
8148 moduleCreateInfo.pNext = NULL;
8149
Karl Schultz6addd812016-02-02 17:17:23 -07008150 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008151 moduleCreateInfo.codeSize = sizeof(spv) + 10;
8152 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008153 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008154
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008155 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008156}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12008157#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008158
Karl Schultz6addd812016-02-02 17:17:23 -07008159TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008161 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008162
Chris Forbes9f7ff632015-05-25 11:13:08 +12008163 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008164 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12008165
8166 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008167 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12008168 "\n"
8169 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07008170 "out gl_PerVertex {\n"
8171 " vec4 gl_Position;\n"
8172 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12008173 "void main(){\n"
8174 " gl_Position = vec4(1);\n"
8175 " x = 0;\n"
8176 "}\n";
8177 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008178 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12008179 "\n"
8180 "layout(location=0) out vec4 color;\n"
8181 "void main(){\n"
8182 " color = vec4(1);\n"
8183 "}\n";
8184
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008185 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8186 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12008187
8188 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008189 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12008190 pipe.AddShader(&vs);
8191 pipe.AddShader(&fs);
8192
Chris Forbes9f7ff632015-05-25 11:13:08 +12008193 VkDescriptorSetObj descriptorSet(m_device);
8194 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008195 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12008196
Tony Barbour5781e8f2015-08-04 16:23:11 -06008197 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12008198
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008199 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12008200}
Chris Forbes9f7ff632015-05-25 11:13:08 +12008201
Karl Schultz6addd812016-02-02 17:17:23 -07008202TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008204 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008205
Chris Forbes59cb88d2015-05-25 11:13:13 +12008206 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008207 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12008208
8209 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008210 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12008211 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008212 "out gl_PerVertex {\n"
8213 " vec4 gl_Position;\n"
8214 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12008215 "void main(){\n"
8216 " gl_Position = vec4(1);\n"
8217 "}\n";
8218 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008219 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12008220 "\n"
8221 "layout(location=0) in float x;\n"
8222 "layout(location=0) out vec4 color;\n"
8223 "void main(){\n"
8224 " color = vec4(x);\n"
8225 "}\n";
8226
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008227 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8228 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12008229
8230 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008231 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12008232 pipe.AddShader(&vs);
8233 pipe.AddShader(&fs);
8234
Chris Forbes59cb88d2015-05-25 11:13:13 +12008235 VkDescriptorSetObj descriptorSet(m_device);
8236 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008237 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12008238
Tony Barbour5781e8f2015-08-04 16:23:11 -06008239 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12008240
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008241 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12008242}
8243
Karl Schultz6addd812016-02-02 17:17:23 -07008244TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13008245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008246 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13008247
8248 ASSERT_NO_FATAL_FAILURE(InitState());
8249 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8250
8251 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008252 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13008253 "\n"
8254 "out gl_PerVertex {\n"
8255 " vec4 gl_Position;\n"
8256 "};\n"
8257 "void main(){\n"
8258 " gl_Position = vec4(1);\n"
8259 "}\n";
8260 char const *fsSource =
8261 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13008262 "\n"
8263 "in block { layout(location=0) float x; } ins;\n"
8264 "layout(location=0) out vec4 color;\n"
8265 "void main(){\n"
8266 " color = vec4(ins.x);\n"
8267 "}\n";
8268
8269 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8270 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8271
8272 VkPipelineObj pipe(m_device);
8273 pipe.AddColorAttachment();
8274 pipe.AddShader(&vs);
8275 pipe.AddShader(&fs);
8276
8277 VkDescriptorSetObj descriptorSet(m_device);
8278 descriptorSet.AppendDummy();
8279 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8280
8281 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8282
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008283 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13008284}
8285
Karl Schultz6addd812016-02-02 17:17:23 -07008286TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13008287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13008288 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07008289 "output arr[2] of float32' vs 'ptr to "
8290 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13008291
8292 ASSERT_NO_FATAL_FAILURE(InitState());
8293 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8294
8295 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008296 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13008297 "\n"
8298 "layout(location=0) out float x[2];\n"
8299 "out gl_PerVertex {\n"
8300 " vec4 gl_Position;\n"
8301 "};\n"
8302 "void main(){\n"
8303 " x[0] = 0; x[1] = 0;\n"
8304 " gl_Position = vec4(1);\n"
8305 "}\n";
8306 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008307 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13008308 "\n"
8309 "layout(location=0) in float x[3];\n"
8310 "layout(location=0) out vec4 color;\n"
8311 "void main(){\n"
8312 " color = vec4(x[0] + x[1] + x[2]);\n"
8313 "}\n";
8314
8315 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8316 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8317
8318 VkPipelineObj pipe(m_device);
8319 pipe.AddColorAttachment();
8320 pipe.AddShader(&vs);
8321 pipe.AddShader(&fs);
8322
8323 VkDescriptorSetObj descriptorSet(m_device);
8324 descriptorSet.AppendDummy();
8325 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8326
8327 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8328
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008329 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13008330}
8331
Karl Schultz6addd812016-02-02 17:17:23 -07008332TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008334 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008335
Chris Forbesb56af562015-05-25 11:13:17 +12008336 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008337 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12008338
8339 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008340 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12008341 "\n"
8342 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07008343 "out gl_PerVertex {\n"
8344 " vec4 gl_Position;\n"
8345 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12008346 "void main(){\n"
8347 " x = 0;\n"
8348 " gl_Position = vec4(1);\n"
8349 "}\n";
8350 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008351 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12008352 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008353 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12008354 "layout(location=0) out vec4 color;\n"
8355 "void main(){\n"
8356 " color = vec4(x);\n"
8357 "}\n";
8358
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008359 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8360 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12008361
8362 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008363 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12008364 pipe.AddShader(&vs);
8365 pipe.AddShader(&fs);
8366
Chris Forbesb56af562015-05-25 11:13:17 +12008367 VkDescriptorSetObj descriptorSet(m_device);
8368 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008369 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12008370
Tony Barbour5781e8f2015-08-04 16:23:11 -06008371 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12008372
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008373 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12008374}
8375
Karl Schultz6addd812016-02-02 17:17:23 -07008376TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13008377 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008378 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13008379
8380 ASSERT_NO_FATAL_FAILURE(InitState());
8381 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8382
8383 char const *vsSource =
8384 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13008385 "\n"
8386 "out block { layout(location=0) int x; } outs;\n"
8387 "out gl_PerVertex {\n"
8388 " vec4 gl_Position;\n"
8389 "};\n"
8390 "void main(){\n"
8391 " outs.x = 0;\n"
8392 " gl_Position = vec4(1);\n"
8393 "}\n";
8394 char const *fsSource =
8395 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13008396 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008397 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13008398 "layout(location=0) out vec4 color;\n"
8399 "void main(){\n"
8400 " color = vec4(ins.x);\n"
8401 "}\n";
8402
8403 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8404 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8405
8406 VkPipelineObj pipe(m_device);
8407 pipe.AddColorAttachment();
8408 pipe.AddShader(&vs);
8409 pipe.AddShader(&fs);
8410
8411 VkDescriptorSetObj descriptorSet(m_device);
8412 descriptorSet.AppendDummy();
8413 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8414
8415 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8416
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008417 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13008418}
8419
8420TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
8421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8422 "location 0.0 which is not written by vertex shader");
8423
8424 ASSERT_NO_FATAL_FAILURE(InitState());
8425 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8426
8427 char const *vsSource =
8428 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13008429 "\n"
8430 "out block { layout(location=1) float x; } outs;\n"
8431 "out gl_PerVertex {\n"
8432 " vec4 gl_Position;\n"
8433 "};\n"
8434 "void main(){\n"
8435 " outs.x = 0;\n"
8436 " gl_Position = vec4(1);\n"
8437 "}\n";
8438 char const *fsSource =
8439 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13008440 "\n"
8441 "in block { layout(location=0) float x; } ins;\n"
8442 "layout(location=0) out vec4 color;\n"
8443 "void main(){\n"
8444 " color = vec4(ins.x);\n"
8445 "}\n";
8446
8447 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8448 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8449
8450 VkPipelineObj pipe(m_device);
8451 pipe.AddColorAttachment();
8452 pipe.AddShader(&vs);
8453 pipe.AddShader(&fs);
8454
8455 VkDescriptorSetObj descriptorSet(m_device);
8456 descriptorSet.AppendDummy();
8457 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8458
8459 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8460
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008461 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13008462}
8463
8464TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
8465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8466 "location 0.1 which is not written by vertex shader");
8467
8468 ASSERT_NO_FATAL_FAILURE(InitState());
8469 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8470
8471 char const *vsSource =
8472 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13008473 "\n"
8474 "out block { layout(location=0, component=0) float x; } outs;\n"
8475 "out gl_PerVertex {\n"
8476 " vec4 gl_Position;\n"
8477 "};\n"
8478 "void main(){\n"
8479 " outs.x = 0;\n"
8480 " gl_Position = vec4(1);\n"
8481 "}\n";
8482 char const *fsSource =
8483 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13008484 "\n"
8485 "in block { layout(location=0, component=1) float x; } ins;\n"
8486 "layout(location=0) out vec4 color;\n"
8487 "void main(){\n"
8488 " color = vec4(ins.x);\n"
8489 "}\n";
8490
8491 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8492 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8493
8494 VkPipelineObj pipe(m_device);
8495 pipe.AddColorAttachment();
8496 pipe.AddShader(&vs);
8497 pipe.AddShader(&fs);
8498
8499 VkDescriptorSetObj descriptorSet(m_device);
8500 descriptorSet.AppendDummy();
8501 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8502
8503 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8504
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008505 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13008506}
8507
Karl Schultz6addd812016-02-02 17:17:23 -07008508TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008510 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008511
Chris Forbesde136e02015-05-25 11:13:28 +12008512 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008513 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12008514
8515 VkVertexInputBindingDescription input_binding;
8516 memset(&input_binding, 0, sizeof(input_binding));
8517
8518 VkVertexInputAttributeDescription input_attrib;
8519 memset(&input_attrib, 0, sizeof(input_attrib));
8520 input_attrib.format = VK_FORMAT_R32_SFLOAT;
8521
8522 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008523 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12008524 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008525 "out gl_PerVertex {\n"
8526 " vec4 gl_Position;\n"
8527 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12008528 "void main(){\n"
8529 " gl_Position = vec4(1);\n"
8530 "}\n";
8531 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008532 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12008533 "\n"
8534 "layout(location=0) out vec4 color;\n"
8535 "void main(){\n"
8536 " color = vec4(1);\n"
8537 "}\n";
8538
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008539 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8540 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12008541
8542 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008543 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12008544 pipe.AddShader(&vs);
8545 pipe.AddShader(&fs);
8546
8547 pipe.AddVertexInputBindings(&input_binding, 1);
8548 pipe.AddVertexInputAttribs(&input_attrib, 1);
8549
Chris Forbesde136e02015-05-25 11:13:28 +12008550 VkDescriptorSetObj descriptorSet(m_device);
8551 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008552 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12008553
Tony Barbour5781e8f2015-08-04 16:23:11 -06008554 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12008555
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008556 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12008557}
8558
Karl Schultz6addd812016-02-02 17:17:23 -07008559TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008560 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008561 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13008562
8563 ASSERT_NO_FATAL_FAILURE(InitState());
8564 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8565
8566 VkVertexInputBindingDescription input_binding;
8567 memset(&input_binding, 0, sizeof(input_binding));
8568
8569 VkVertexInputAttributeDescription input_attrib;
8570 memset(&input_attrib, 0, sizeof(input_attrib));
8571 input_attrib.format = VK_FORMAT_R32_SFLOAT;
8572
8573 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008574 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13008575 "\n"
8576 "layout(location=1) in float x;\n"
8577 "out gl_PerVertex {\n"
8578 " vec4 gl_Position;\n"
8579 "};\n"
8580 "void main(){\n"
8581 " gl_Position = vec4(x);\n"
8582 "}\n";
8583 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008584 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13008585 "\n"
8586 "layout(location=0) out vec4 color;\n"
8587 "void main(){\n"
8588 " color = vec4(1);\n"
8589 "}\n";
8590
8591 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8592 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8593
8594 VkPipelineObj pipe(m_device);
8595 pipe.AddColorAttachment();
8596 pipe.AddShader(&vs);
8597 pipe.AddShader(&fs);
8598
8599 pipe.AddVertexInputBindings(&input_binding, 1);
8600 pipe.AddVertexInputAttribs(&input_attrib, 1);
8601
8602 VkDescriptorSetObj descriptorSet(m_device);
8603 descriptorSet.AppendDummy();
8604 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8605
8606 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8607
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008608 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13008609}
8610
Karl Schultz6addd812016-02-02 17:17:23 -07008611TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
8612 m_errorMonitor->SetDesiredFailureMsg(
8613 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008614 "VS consumes input at location 0 but not provided");
8615
Chris Forbes62e8e502015-05-25 11:13:29 +12008616 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008617 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12008618
8619 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008620 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12008621 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008622 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07008623 "out gl_PerVertex {\n"
8624 " vec4 gl_Position;\n"
8625 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12008626 "void main(){\n"
8627 " gl_Position = x;\n"
8628 "}\n";
8629 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008630 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12008631 "\n"
8632 "layout(location=0) out vec4 color;\n"
8633 "void main(){\n"
8634 " color = vec4(1);\n"
8635 "}\n";
8636
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008637 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8638 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12008639
8640 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008641 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12008642 pipe.AddShader(&vs);
8643 pipe.AddShader(&fs);
8644
Chris Forbes62e8e502015-05-25 11:13:29 +12008645 VkDescriptorSetObj descriptorSet(m_device);
8646 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008647 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12008648
Tony Barbour5781e8f2015-08-04 16:23:11 -06008649 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12008650
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008651 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12008652}
8653
Karl Schultz6addd812016-02-02 17:17:23 -07008654TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
8655 m_errorMonitor->SetDesiredFailureMsg(
8656 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008657 "location 0 does not match VS input type");
8658
Chris Forbesc97d98e2015-05-25 11:13:31 +12008659 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008660 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12008661
8662 VkVertexInputBindingDescription input_binding;
8663 memset(&input_binding, 0, sizeof(input_binding));
8664
8665 VkVertexInputAttributeDescription input_attrib;
8666 memset(&input_attrib, 0, sizeof(input_attrib));
8667 input_attrib.format = VK_FORMAT_R32_SFLOAT;
8668
8669 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008670 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12008671 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008672 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07008673 "out gl_PerVertex {\n"
8674 " vec4 gl_Position;\n"
8675 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12008676 "void main(){\n"
8677 " gl_Position = vec4(x);\n"
8678 "}\n";
8679 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008680 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12008681 "\n"
8682 "layout(location=0) out vec4 color;\n"
8683 "void main(){\n"
8684 " color = vec4(1);\n"
8685 "}\n";
8686
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008687 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8688 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12008689
8690 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008691 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12008692 pipe.AddShader(&vs);
8693 pipe.AddShader(&fs);
8694
8695 pipe.AddVertexInputBindings(&input_binding, 1);
8696 pipe.AddVertexInputAttribs(&input_attrib, 1);
8697
Chris Forbesc97d98e2015-05-25 11:13:31 +12008698 VkDescriptorSetObj descriptorSet(m_device);
8699 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008700 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12008701
Tony Barbour5781e8f2015-08-04 16:23:11 -06008702 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12008703
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008704 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12008705}
8706
Chris Forbesc68b43c2016-04-06 11:18:47 +12008707TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
8708 m_errorMonitor->SetDesiredFailureMsg(
8709 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8710 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
8711
8712 ASSERT_NO_FATAL_FAILURE(InitState());
8713 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8714
8715 char const *vsSource =
8716 "#version 450\n"
8717 "\n"
8718 "out gl_PerVertex {\n"
8719 " vec4 gl_Position;\n"
8720 "};\n"
8721 "void main(){\n"
8722 " gl_Position = vec4(1);\n"
8723 "}\n";
8724 char const *fsSource =
8725 "#version 450\n"
8726 "\n"
8727 "layout(location=0) out vec4 color;\n"
8728 "void main(){\n"
8729 " color = vec4(1);\n"
8730 "}\n";
8731
8732 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8733 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8734
8735 VkPipelineObj pipe(m_device);
8736 pipe.AddColorAttachment();
8737 pipe.AddShader(&vs);
8738 pipe.AddShader(&vs);
8739 pipe.AddShader(&fs);
8740
8741 VkDescriptorSetObj descriptorSet(m_device);
8742 descriptorSet.AppendDummy();
8743 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8744
8745 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8746
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008747 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12008748}
8749
Karl Schultz6addd812016-02-02 17:17:23 -07008750TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008751 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13008752
8753 ASSERT_NO_FATAL_FAILURE(InitState());
8754 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8755
8756 VkVertexInputBindingDescription input_binding;
8757 memset(&input_binding, 0, sizeof(input_binding));
8758
8759 VkVertexInputAttributeDescription input_attribs[2];
8760 memset(input_attribs, 0, sizeof(input_attribs));
8761
8762 for (int i = 0; i < 2; i++) {
8763 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
8764 input_attribs[i].location = i;
8765 }
8766
8767 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008768 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008769 "\n"
8770 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07008771 "out gl_PerVertex {\n"
8772 " vec4 gl_Position;\n"
8773 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008774 "void main(){\n"
8775 " gl_Position = x[0] + x[1];\n"
8776 "}\n";
8777 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008778 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008779 "\n"
8780 "layout(location=0) out vec4 color;\n"
8781 "void main(){\n"
8782 " color = vec4(1);\n"
8783 "}\n";
8784
8785 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8786 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8787
8788 VkPipelineObj pipe(m_device);
8789 pipe.AddColorAttachment();
8790 pipe.AddShader(&vs);
8791 pipe.AddShader(&fs);
8792
8793 pipe.AddVertexInputBindings(&input_binding, 1);
8794 pipe.AddVertexInputAttribs(input_attribs, 2);
8795
8796 VkDescriptorSetObj descriptorSet(m_device);
8797 descriptorSet.AppendDummy();
8798 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8799
8800 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8801
8802 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008803 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13008804}
8805
Chris Forbes2682b242015-11-24 11:13:14 +13008806TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
8807{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008808 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13008809
8810 ASSERT_NO_FATAL_FAILURE(InitState());
8811 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8812
8813 VkVertexInputBindingDescription input_binding;
8814 memset(&input_binding, 0, sizeof(input_binding));
8815
8816 VkVertexInputAttributeDescription input_attribs[2];
8817 memset(input_attribs, 0, sizeof(input_attribs));
8818
8819 for (int i = 0; i < 2; i++) {
8820 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
8821 input_attribs[i].location = i;
8822 }
8823
8824 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008825 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008826 "\n"
8827 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07008828 "out gl_PerVertex {\n"
8829 " vec4 gl_Position;\n"
8830 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008831 "void main(){\n"
8832 " gl_Position = x[0] + x[1];\n"
8833 "}\n";
8834 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008835 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008836 "\n"
8837 "layout(location=0) out vec4 color;\n"
8838 "void main(){\n"
8839 " color = vec4(1);\n"
8840 "}\n";
8841
8842 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8843 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8844
8845 VkPipelineObj pipe(m_device);
8846 pipe.AddColorAttachment();
8847 pipe.AddShader(&vs);
8848 pipe.AddShader(&fs);
8849
8850 pipe.AddVertexInputBindings(&input_binding, 1);
8851 pipe.AddVertexInputAttribs(input_attribs, 2);
8852
8853 VkDescriptorSetObj descriptorSet(m_device);
8854 descriptorSet.AppendDummy();
8855 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8856
8857 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8858
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008859 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13008860}
Chris Forbes2682b242015-11-24 11:13:14 +13008861
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008862TEST_F(VkLayerTest, CreatePipelineSimplePositive)
8863{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008864 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008865
8866 ASSERT_NO_FATAL_FAILURE(InitState());
8867 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8868
8869 char const *vsSource =
8870 "#version 450\n"
8871 "out gl_PerVertex {\n"
8872 " vec4 gl_Position;\n"
8873 "};\n"
8874 "void main(){\n"
8875 " gl_Position = vec4(0);\n"
8876 "}\n";
8877 char const *fsSource =
8878 "#version 450\n"
8879 "\n"
8880 "layout(location=0) out vec4 color;\n"
8881 "void main(){\n"
8882 " color = vec4(1);\n"
8883 "}\n";
8884
8885 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8886 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8887
8888 VkPipelineObj pipe(m_device);
8889 pipe.AddColorAttachment();
8890 pipe.AddShader(&vs);
8891 pipe.AddShader(&fs);
8892
8893 VkDescriptorSetObj descriptorSet(m_device);
8894 descriptorSet.AppendDummy();
8895 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8896
8897 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8898
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008899 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008900}
8901
Chris Forbes912c9192016-04-05 17:50:35 +12008902TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
8903{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008904 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12008905
8906 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
8907
8908 ASSERT_NO_FATAL_FAILURE(InitState());
8909 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8910
8911 char const *vsSource =
8912 "#version 450\n"
8913 "out gl_PerVertex {\n"
8914 " vec4 gl_Position;\n"
8915 "};\n"
8916 "layout(location=0) out vec3 x;\n"
8917 "layout(location=1) out ivec3 y;\n"
8918 "layout(location=2) out vec3 z;\n"
8919 "void main(){\n"
8920 " gl_Position = vec4(0);\n"
8921 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
8922 "}\n";
8923 char const *fsSource =
8924 "#version 450\n"
8925 "\n"
8926 "layout(location=0) out vec4 color;\n"
8927 "layout(location=0) in float x;\n"
8928 "layout(location=1) flat in int y;\n"
8929 "layout(location=2) in vec2 z;\n"
8930 "void main(){\n"
8931 " color = vec4(1 + x + y + z.x);\n"
8932 "}\n";
8933
8934 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8935 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8936
8937 VkPipelineObj pipe(m_device);
8938 pipe.AddColorAttachment();
8939 pipe.AddShader(&vs);
8940 pipe.AddShader(&fs);
8941
8942 VkDescriptorSetObj descriptorSet(m_device);
8943 descriptorSet.AppendDummy();
8944 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8945
8946 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8947
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008948 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12008949}
8950
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008951TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
8952{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008953 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008954
8955 ASSERT_NO_FATAL_FAILURE(InitState());
8956 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8957
Chris Forbesc1e852d2016-04-04 19:26:42 +12008958 if (!m_device->phy().features().tessellationShader) {
8959 printf("Device does not support tessellation shaders; skipped.\n");
8960 return;
8961 }
8962
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008963 char const *vsSource =
8964 "#version 450\n"
8965 "void main(){}\n";
8966 char const *tcsSource =
8967 "#version 450\n"
8968 "layout(location=0) out int x[];\n"
8969 "layout(vertices=3) out;\n"
8970 "void main(){\n"
8971 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
8972 " gl_TessLevelInner[0] = 1;\n"
8973 " x[gl_InvocationID] = gl_InvocationID;\n"
8974 "}\n";
8975 char const *tesSource =
8976 "#version 450\n"
8977 "layout(triangles, equal_spacing, cw) in;\n"
8978 "layout(location=0) in int x[];\n"
8979 "out gl_PerVertex { vec4 gl_Position; };\n"
8980 "void main(){\n"
8981 " gl_Position.xyz = gl_TessCoord;\n"
8982 " gl_Position.w = x[0] + x[1] + x[2];\n"
8983 "}\n";
8984 char const *fsSource =
8985 "#version 450\n"
8986 "layout(location=0) out vec4 color;\n"
8987 "void main(){\n"
8988 " color = vec4(1);\n"
8989 "}\n";
8990
8991 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8992 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
8993 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
8994 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8995
8996 VkPipelineInputAssemblyStateCreateInfo iasci{
8997 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
8998 nullptr,
8999 0,
9000 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
9001 VK_FALSE};
9002
Chris Forbesb4cacb62016-04-04 19:15:00 +12009003 VkPipelineTessellationStateCreateInfo tsci{
9004 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
9005 nullptr,
9006 0,
9007 3};
9008
Chris Forbes4ea14fc2016-04-04 18:52:54 +12009009 VkPipelineObj pipe(m_device);
9010 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12009011 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12009012 pipe.AddColorAttachment();
9013 pipe.AddShader(&vs);
9014 pipe.AddShader(&tcs);
9015 pipe.AddShader(&tes);
9016 pipe.AddShader(&fs);
9017
9018 VkDescriptorSetObj descriptorSet(m_device);
9019 descriptorSet.AppendDummy();
9020 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
9021
9022 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
9023
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009024 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12009025}
9026
Chris Forbesa0ab8152016-04-20 13:34:27 +12009027TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
9028{
9029 m_errorMonitor->ExpectSuccess();
9030
9031 ASSERT_NO_FATAL_FAILURE(InitState());
9032 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9033
9034 if (!m_device->phy().features().geometryShader) {
9035 printf("Device does not support geometry shaders; skipped.\n");
9036 return;
9037 }
9038
9039 char const *vsSource =
9040 "#version 450\n"
9041 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
9042 "void main(){\n"
9043 " vs_out.x = vec4(1);\n"
9044 "}\n";
9045 char const *gsSource =
9046 "#version 450\n"
9047 "layout(triangles) in;\n"
9048 "layout(triangle_strip, max_vertices=3) out;\n"
9049 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
9050 "out gl_PerVertex { vec4 gl_Position; };\n"
9051 "void main() {\n"
9052 " gl_Position = gs_in[0].x;\n"
9053 " EmitVertex();\n"
9054 "}\n";
9055 char const *fsSource =
9056 "#version 450\n"
9057 "layout(location=0) out vec4 color;\n"
9058 "void main(){\n"
9059 " color = vec4(1);\n"
9060 "}\n";
9061
9062 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9063 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
9064 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9065
9066 VkPipelineObj pipe(m_device);
9067 pipe.AddColorAttachment();
9068 pipe.AddShader(&vs);
9069 pipe.AddShader(&gs);
9070 pipe.AddShader(&fs);
9071
9072 VkDescriptorSetObj descriptorSet(m_device);
9073 descriptorSet.AppendDummy();
9074 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
9075
9076 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
9077
9078 m_errorMonitor->VerifyNotFound();
9079}
9080
Chris Forbesa0193bc2016-04-04 19:19:47 +12009081TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
9082{
9083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9084 "is per-vertex in tessellation control shader stage "
9085 "but per-patch in tessellation evaluation shader stage");
9086
9087 ASSERT_NO_FATAL_FAILURE(InitState());
9088 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9089
Chris Forbesc1e852d2016-04-04 19:26:42 +12009090 if (!m_device->phy().features().tessellationShader) {
9091 printf("Device does not support tessellation shaders; skipped.\n");
9092 return;
9093 }
9094
Chris Forbesa0193bc2016-04-04 19:19:47 +12009095 char const *vsSource =
9096 "#version 450\n"
9097 "void main(){}\n";
9098 char const *tcsSource =
9099 "#version 450\n"
9100 "layout(location=0) out int x[];\n"
9101 "layout(vertices=3) out;\n"
9102 "void main(){\n"
9103 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
9104 " gl_TessLevelInner[0] = 1;\n"
9105 " x[gl_InvocationID] = gl_InvocationID;\n"
9106 "}\n";
9107 char const *tesSource =
9108 "#version 450\n"
9109 "layout(triangles, equal_spacing, cw) in;\n"
9110 "layout(location=0) patch in int x;\n"
9111 "out gl_PerVertex { vec4 gl_Position; };\n"
9112 "void main(){\n"
9113 " gl_Position.xyz = gl_TessCoord;\n"
9114 " gl_Position.w = x;\n"
9115 "}\n";
9116 char const *fsSource =
9117 "#version 450\n"
9118 "layout(location=0) out vec4 color;\n"
9119 "void main(){\n"
9120 " color = vec4(1);\n"
9121 "}\n";
9122
9123 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9124 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
9125 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
9126 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9127
9128 VkPipelineInputAssemblyStateCreateInfo iasci{
9129 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
9130 nullptr,
9131 0,
9132 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
9133 VK_FALSE};
9134
9135 VkPipelineTessellationStateCreateInfo tsci{
9136 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
9137 nullptr,
9138 0,
9139 3};
9140
9141 VkPipelineObj pipe(m_device);
9142 pipe.SetInputAssembly(&iasci);
9143 pipe.SetTessellation(&tsci);
9144 pipe.AddColorAttachment();
9145 pipe.AddShader(&vs);
9146 pipe.AddShader(&tcs);
9147 pipe.AddShader(&tes);
9148 pipe.AddShader(&fs);
9149
9150 VkDescriptorSetObj descriptorSet(m_device);
9151 descriptorSet.AppendDummy();
9152 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
9153
9154 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
9155
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009156 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12009157}
9158
Karl Schultz6addd812016-02-02 17:17:23 -07009159TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
9160 m_errorMonitor->SetDesiredFailureMsg(
9161 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009162 "Duplicate vertex input binding descriptions for binding 0");
9163
Chris Forbes280ba2c2015-06-12 11:16:41 +12009164 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06009165 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12009166
9167 /* Two binding descriptions for binding 0 */
9168 VkVertexInputBindingDescription input_bindings[2];
9169 memset(input_bindings, 0, sizeof(input_bindings));
9170
9171 VkVertexInputAttributeDescription input_attrib;
9172 memset(&input_attrib, 0, sizeof(input_attrib));
9173 input_attrib.format = VK_FORMAT_R32_SFLOAT;
9174
9175 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009176 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12009177 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07009178 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07009179 "out gl_PerVertex {\n"
9180 " vec4 gl_Position;\n"
9181 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12009182 "void main(){\n"
9183 " gl_Position = vec4(x);\n"
9184 "}\n";
9185 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009186 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12009187 "\n"
9188 "layout(location=0) out vec4 color;\n"
9189 "void main(){\n"
9190 " color = vec4(1);\n"
9191 "}\n";
9192
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009193 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9194 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12009195
9196 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08009197 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12009198 pipe.AddShader(&vs);
9199 pipe.AddShader(&fs);
9200
9201 pipe.AddVertexInputBindings(input_bindings, 2);
9202 pipe.AddVertexInputAttribs(&input_attrib, 1);
9203
Chris Forbes280ba2c2015-06-12 11:16:41 +12009204 VkDescriptorSetObj descriptorSet(m_device);
9205 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009206 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12009207
Tony Barbour5781e8f2015-08-04 16:23:11 -06009208 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12009209
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009210 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12009211}
Chris Forbes8f68b562015-05-25 11:13:32 +12009212
Chris Forbes35efec72016-04-21 14:32:08 +12009213TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
9214 m_errorMonitor->ExpectSuccess();
9215
9216 ASSERT_NO_FATAL_FAILURE(InitState());
9217 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9218
9219 if (!m_device->phy().features().tessellationShader) {
9220 printf("Device does not support 64bit vertex attributes; skipped.\n");
9221 return;
9222 }
9223
9224 VkVertexInputBindingDescription input_bindings[1];
9225 memset(input_bindings, 0, sizeof(input_bindings));
9226
9227 VkVertexInputAttributeDescription input_attribs[4];
9228 memset(input_attribs, 0, sizeof(input_attribs));
9229 input_attribs[0].location = 0;
9230 input_attribs[0].offset = 0;
9231 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
9232 input_attribs[1].location = 2;
9233 input_attribs[1].offset = 32;
9234 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
9235 input_attribs[2].location = 4;
9236 input_attribs[2].offset = 64;
9237 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
9238 input_attribs[3].location = 6;
9239 input_attribs[3].offset = 96;
9240 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
9241
9242 char const *vsSource =
9243 "#version 450\n"
9244 "\n"
9245 "layout(location=0) in dmat4 x;\n"
9246 "out gl_PerVertex {\n"
9247 " vec4 gl_Position;\n"
9248 "};\n"
9249 "void main(){\n"
9250 " gl_Position = vec4(x[0][0]);\n"
9251 "}\n";
9252 char const *fsSource =
9253 "#version 450\n"
9254 "\n"
9255 "layout(location=0) out vec4 color;\n"
9256 "void main(){\n"
9257 " color = vec4(1);\n"
9258 "}\n";
9259
9260 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9261 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9262
9263 VkPipelineObj pipe(m_device);
9264 pipe.AddColorAttachment();
9265 pipe.AddShader(&vs);
9266 pipe.AddShader(&fs);
9267
9268 pipe.AddVertexInputBindings(input_bindings, 1);
9269 pipe.AddVertexInputAttribs(input_attribs, 4);
9270
9271 VkDescriptorSetObj descriptorSet(m_device);
9272 descriptorSet.AppendDummy();
9273 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
9274
9275 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
9276
9277 m_errorMonitor->VerifyNotFound();
9278}
9279
Karl Schultz6addd812016-02-02 17:17:23 -07009280TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009281 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009282 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009283
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009284 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009285
9286 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009287 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009288 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07009289 "out gl_PerVertex {\n"
9290 " vec4 gl_Position;\n"
9291 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009292 "void main(){\n"
9293 " gl_Position = vec4(1);\n"
9294 "}\n";
9295 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009296 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009297 "\n"
9298 "void main(){\n"
9299 "}\n";
9300
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009301 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9302 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009303
9304 VkPipelineObj pipe(m_device);
9305 pipe.AddShader(&vs);
9306 pipe.AddShader(&fs);
9307
Chia-I Wu08accc62015-07-07 11:50:03 +08009308 /* set up CB 0, not written */
9309 pipe.AddColorAttachment();
9310 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009311
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009312 VkDescriptorSetObj descriptorSet(m_device);
9313 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009314 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009315
Tony Barbour5781e8f2015-08-04 16:23:11 -06009316 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009317
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009318 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009319}
9320
Karl Schultz6addd812016-02-02 17:17:23 -07009321TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07009322 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07009323 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009324 "FS writes to output location 1 with no matching attachment");
9325
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009326 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009327
9328 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009329 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009330 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07009331 "out gl_PerVertex {\n"
9332 " vec4 gl_Position;\n"
9333 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009334 "void main(){\n"
9335 " gl_Position = vec4(1);\n"
9336 "}\n";
9337 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009338 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009339 "\n"
9340 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07009341 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009342 "void main(){\n"
9343 " x = vec4(1);\n"
9344 " y = vec4(1);\n"
9345 "}\n";
9346
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009347 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9348 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009349
9350 VkPipelineObj pipe(m_device);
9351 pipe.AddShader(&vs);
9352 pipe.AddShader(&fs);
9353
Chia-I Wu08accc62015-07-07 11:50:03 +08009354 /* set up CB 0, not written */
9355 pipe.AddColorAttachment();
9356 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009357 /* FS writes CB 1, but we don't configure it */
9358
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009359 VkDescriptorSetObj descriptorSet(m_device);
9360 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009361 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009362
Tony Barbour5781e8f2015-08-04 16:23:11 -06009363 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009364
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009365 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009366}
9367
Karl Schultz6addd812016-02-02 17:17:23 -07009368TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009369 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009370 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009371
Chris Forbesa36d69e2015-05-25 11:13:44 +12009372 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12009373
9374 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009375 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12009376 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07009377 "out gl_PerVertex {\n"
9378 " vec4 gl_Position;\n"
9379 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12009380 "void main(){\n"
9381 " gl_Position = vec4(1);\n"
9382 "}\n";
9383 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009384 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12009385 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07009386 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12009387 "void main(){\n"
9388 " x = ivec4(1);\n"
9389 "}\n";
9390
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009391 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9392 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12009393
9394 VkPipelineObj pipe(m_device);
9395 pipe.AddShader(&vs);
9396 pipe.AddShader(&fs);
9397
Chia-I Wu08accc62015-07-07 11:50:03 +08009398 /* set up CB 0; type is UNORM by default */
9399 pipe.AddColorAttachment();
9400 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12009401
Chris Forbesa36d69e2015-05-25 11:13:44 +12009402 VkDescriptorSetObj descriptorSet(m_device);
9403 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009404 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12009405
Tony Barbour5781e8f2015-08-04 16:23:11 -06009406 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12009407
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009408 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12009409}
Chris Forbes7b1b8932015-06-05 14:43:36 +12009410
Karl Schultz6addd812016-02-02 17:17:23 -07009411TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009413 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009414
Chris Forbes556c76c2015-08-14 12:04:59 +12009415 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12009416
9417 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009418 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12009419 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07009420 "out gl_PerVertex {\n"
9421 " vec4 gl_Position;\n"
9422 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12009423 "void main(){\n"
9424 " gl_Position = vec4(1);\n"
9425 "}\n";
9426 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009427 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12009428 "\n"
9429 "layout(location=0) out vec4 x;\n"
9430 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
9431 "void main(){\n"
9432 " x = vec4(bar.y);\n"
9433 "}\n";
9434
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009435 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9436 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12009437
Chris Forbes556c76c2015-08-14 12:04:59 +12009438 VkPipelineObj pipe(m_device);
9439 pipe.AddShader(&vs);
9440 pipe.AddShader(&fs);
9441
9442 /* set up CB 0; type is UNORM by default */
9443 pipe.AddColorAttachment();
9444 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9445
9446 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009447 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12009448
9449 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
9450
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009451 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12009452}
9453
Chris Forbes5c59e902016-02-26 16:56:09 +13009454TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
9455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9456 "not declared in layout");
9457
9458 ASSERT_NO_FATAL_FAILURE(InitState());
9459
9460 char const *vsSource =
9461 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13009462 "\n"
9463 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
9464 "out gl_PerVertex {\n"
9465 " vec4 gl_Position;\n"
9466 "};\n"
9467 "void main(){\n"
9468 " gl_Position = vec4(consts.x);\n"
9469 "}\n";
9470 char const *fsSource =
9471 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13009472 "\n"
9473 "layout(location=0) out vec4 x;\n"
9474 "void main(){\n"
9475 " x = vec4(1);\n"
9476 "}\n";
9477
9478 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9479 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9480
9481 VkPipelineObj pipe(m_device);
9482 pipe.AddShader(&vs);
9483 pipe.AddShader(&fs);
9484
9485 /* set up CB 0; type is UNORM by default */
9486 pipe.AddColorAttachment();
9487 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9488
9489 VkDescriptorSetObj descriptorSet(m_device);
9490 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
9491
9492 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
9493
9494 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009495 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13009496}
9497
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009498#endif // SHADER_CHECKER_TESTS
9499
9500#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06009501TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07009502 m_errorMonitor->SetDesiredFailureMsg(
9503 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009504 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009505
9506 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009507
9508 // Create an image
9509 VkImage image;
9510
Karl Schultz6addd812016-02-02 17:17:23 -07009511 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9512 const int32_t tex_width = 32;
9513 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009514
9515 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009516 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9517 image_create_info.pNext = NULL;
9518 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9519 image_create_info.format = tex_format;
9520 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009521 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07009522 image_create_info.extent.depth = 1;
9523 image_create_info.mipLevels = 1;
9524 image_create_info.arrayLayers = 1;
9525 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9526 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9527 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9528 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009529
9530 // Introduce error by sending down a bogus width extent
9531 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009532 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009533
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009534 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009535}
9536
Mark Youngc48c4c12016-04-11 14:26:49 -06009537TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
9538 m_errorMonitor->SetDesiredFailureMsg(
9539 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9540 "CreateImage extents is 0 for at least one required dimension");
9541
9542 ASSERT_NO_FATAL_FAILURE(InitState());
9543
9544 // Create an image
9545 VkImage image;
9546
9547 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9548 const int32_t tex_width = 32;
9549 const int32_t tex_height = 32;
9550
9551 VkImageCreateInfo image_create_info = {};
9552 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9553 image_create_info.pNext = NULL;
9554 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9555 image_create_info.format = tex_format;
9556 image_create_info.extent.width = tex_width;
9557 image_create_info.extent.height = tex_height;
9558 image_create_info.extent.depth = 1;
9559 image_create_info.mipLevels = 1;
9560 image_create_info.arrayLayers = 1;
9561 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9562 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9563 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9564 image_create_info.flags = 0;
9565
9566 // Introduce error by sending down a bogus width extent
9567 image_create_info.extent.width = 0;
9568 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
9569
9570 m_errorMonitor->VerifyFound();
9571}
9572
Karl Schultz6addd812016-02-02 17:17:23 -07009573TEST_F(VkLayerTest, UpdateBufferAlignment) {
9574 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06009575
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009576 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009577 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009578
Mike Stroyana3082432015-09-25 13:39:21 -06009579 ASSERT_NO_FATAL_FAILURE(InitState());
9580
9581 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9582 vk_testing::Buffer buffer;
9583 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
9584
9585 BeginCommandBuffer();
9586 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009587 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009588 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009589
Mike Stroyana3082432015-09-25 13:39:21 -06009590 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009592 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009593
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009594 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009595 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009596 EndCommandBuffer();
9597}
9598
Karl Schultz6addd812016-02-02 17:17:23 -07009599TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009601 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06009602
9603 ASSERT_NO_FATAL_FAILURE(InitState());
9604
9605 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9606 vk_testing::Buffer buffer;
9607 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
9608
9609 BeginCommandBuffer();
9610 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009611 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009612 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009613
Mike Stroyana3082432015-09-25 13:39:21 -06009614 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009616 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009617
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009618 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009619
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009620 m_errorMonitor->VerifyFound();
9621
Mike Stroyana3082432015-09-25 13:39:21 -06009622 EndCommandBuffer();
9623}
9624
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009625#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12009626
Tobin Ehliscde08892015-09-22 10:11:37 -06009627#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07009628TEST_F(VkLayerTest, InvalidImageView) {
9629 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06009630
Karl Schultz6addd812016-02-02 17:17:23 -07009631 m_errorMonitor->SetDesiredFailureMsg(
9632 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009633 "vkCreateImageView called with baseMipLevel 10 ");
9634
Tobin Ehliscde08892015-09-22 10:11:37 -06009635 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06009636
Mike Stroyana3082432015-09-25 13:39:21 -06009637 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07009638 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06009639
Karl Schultz6addd812016-02-02 17:17:23 -07009640 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9641 const int32_t tex_width = 32;
9642 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06009643
9644 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009645 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9646 image_create_info.pNext = NULL;
9647 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9648 image_create_info.format = tex_format;
9649 image_create_info.extent.width = tex_width;
9650 image_create_info.extent.height = tex_height;
9651 image_create_info.extent.depth = 1;
9652 image_create_info.mipLevels = 1;
9653 image_create_info.arrayLayers = 1;
9654 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9655 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9656 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9657 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06009658
Chia-I Wuf7458c52015-10-26 21:10:41 +08009659 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06009660 ASSERT_VK_SUCCESS(err);
9661
9662 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009663 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9664 image_view_create_info.image = image;
9665 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
9666 image_view_create_info.format = tex_format;
9667 image_view_create_info.subresourceRange.layerCount = 1;
9668 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
9669 image_view_create_info.subresourceRange.levelCount = 1;
9670 image_view_create_info.subresourceRange.aspectMask =
9671 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06009672
9673 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07009674 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
9675 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06009676
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009677 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06009678}
Mike Stroyana3082432015-09-25 13:39:21 -06009679
Karl Schultz6addd812016-02-02 17:17:23 -07009680TEST_F(VkLayerTest, InvalidImageViewAspect) {
9681 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009682
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009684 "vkCreateImageView: Color image "
9685 "formats must have ONLY the "
9686 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009687
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009688 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009689
9690 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07009691 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009692
Karl Schultz6addd812016-02-02 17:17:23 -07009693 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9694 const int32_t tex_width = 32;
9695 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009696
9697 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009698 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9699 image_create_info.pNext = NULL;
9700 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9701 image_create_info.format = tex_format;
9702 image_create_info.extent.width = tex_width;
9703 image_create_info.extent.height = tex_height;
9704 image_create_info.extent.depth = 1;
9705 image_create_info.mipLevels = 1;
9706 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9707 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9708 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9709 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009710
Chia-I Wuf7458c52015-10-26 21:10:41 +08009711 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009712 ASSERT_VK_SUCCESS(err);
9713
9714 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009715 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9716 image_view_create_info.image = image;
9717 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
9718 image_view_create_info.format = tex_format;
9719 image_view_create_info.subresourceRange.baseMipLevel = 0;
9720 image_view_create_info.subresourceRange.levelCount = 1;
9721 // Cause an error by setting an invalid image aspect
9722 image_view_create_info.subresourceRange.aspectMask =
9723 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009724
9725 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07009726 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
9727 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009728
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009729 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009730}
9731
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009732TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07009733 VkResult err;
9734 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009735
Karl Schultz6addd812016-02-02 17:17:23 -07009736 m_errorMonitor->SetDesiredFailureMsg(
9737 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009738 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009739
Mike Stroyana3082432015-09-25 13:39:21 -06009740 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009741
9742 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009743 VkImage srcImage;
9744 VkImage dstImage;
9745 VkDeviceMemory srcMem;
9746 VkDeviceMemory destMem;
9747 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009748
9749 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009750 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9751 image_create_info.pNext = NULL;
9752 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9753 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9754 image_create_info.extent.width = 32;
9755 image_create_info.extent.height = 32;
9756 image_create_info.extent.depth = 1;
9757 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009758 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07009759 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9760 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9761 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9762 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009763
Karl Schultz6addd812016-02-02 17:17:23 -07009764 err =
9765 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009766 ASSERT_VK_SUCCESS(err);
9767
Karl Schultz6addd812016-02-02 17:17:23 -07009768 err =
9769 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009770 ASSERT_VK_SUCCESS(err);
9771
9772 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009773 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009774 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9775 memAlloc.pNext = NULL;
9776 memAlloc.allocationSize = 0;
9777 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009778
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009779 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009780 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009781 pass =
9782 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009783 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009784 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009785 ASSERT_VK_SUCCESS(err);
9786
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009787 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009788 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009789 pass =
9790 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009791 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009792 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009793 ASSERT_VK_SUCCESS(err);
9794
9795 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9796 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009797 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009798 ASSERT_VK_SUCCESS(err);
9799
9800 BeginCommandBuffer();
9801 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009802 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009803 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009804 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009805 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06009806 copyRegion.srcOffset.x = 0;
9807 copyRegion.srcOffset.y = 0;
9808 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009809 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009810 copyRegion.dstSubresource.mipLevel = 0;
9811 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009812 // Introduce failure by forcing the dst layerCount to differ from src
9813 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009814 copyRegion.dstOffset.x = 0;
9815 copyRegion.dstOffset.y = 0;
9816 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009817 copyRegion.extent.width = 1;
9818 copyRegion.extent.height = 1;
9819 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009820 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9821 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009822 EndCommandBuffer();
9823
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009824 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009825
Chia-I Wuf7458c52015-10-26 21:10:41 +08009826 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009827 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009828 vkFreeMemory(m_device->device(), srcMem, NULL);
9829 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009830}
9831
Tony Barbourd6673642016-05-05 14:46:39 -06009832TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
9833
9834 TEST_DESCRIPTION("Creating images with unsuported formats ");
9835
9836 ASSERT_NO_FATAL_FAILURE(InitState());
9837 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9838 VkImageObj image(m_device);
9839 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9840 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
9841 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
9842 VK_IMAGE_TILING_OPTIMAL, 0);
9843 ASSERT_TRUE(image.initialized());
9844
9845 VkFormat unsupported = VK_FORMAT_UNDEFINED;
9846 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9847 VkFormat format = static_cast<VkFormat>(f);
9848 VkFormatProperties fProps = m_device->format_properties(format);
9849 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
9850 fProps.optimalTilingFeatures == 0) {
9851 unsupported = format;
9852 break;
9853 }
9854 }
9855 if (unsupported != VK_FORMAT_UNDEFINED) {
9856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9857 "vkCreateImage parameter, "
9858 "VkFormat pCreateInfo->format, "
9859 "contains unsupported format");
9860 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
9861 VkImageCreateInfo image_create_info;
9862 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9863 image_create_info.pNext = NULL;
9864 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9865 image_create_info.format = unsupported;
9866 image_create_info.extent.width = 32;
9867 image_create_info.extent.height = 32;
9868 image_create_info.extent.depth = 1;
9869 image_create_info.mipLevels = 1;
9870 image_create_info.arrayLayers = 1;
9871 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9872 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9873 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9874 image_create_info.flags = 0;
9875
9876 VkImage localImage;
9877 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
9878 m_errorMonitor->VerifyFound();
9879
9880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9881 "vkCreateRenderPass parameter, "
9882 "VkFormat in "
9883 "pCreateInfo->pAttachments");
9884 // Create renderpass with unsupported format - Expect FORMAT_UNSUPPORTED
9885 VkAttachmentDescription att;
9886 att.format = unsupported;
9887 att.samples = VK_SAMPLE_COUNT_1_BIT;
9888 att.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
9889 att.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
9890 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
9891 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
9892 att.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9893 att.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9894
9895 VkRenderPassCreateInfo rp_info = {};
9896 VkRenderPass rp;
9897 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9898 rp_info.attachmentCount = 1;
9899 rp_info.pAttachments = &att;
9900 rp_info.subpassCount = 0;
9901 rp_info.pSubpasses = NULL;
9902 vkCreateRenderPass(m_device->handle(), &rp_info, NULL, &rp);
9903 m_errorMonitor->VerifyFound();
9904 }
9905}
9906
9907TEST_F(VkLayerTest, ImageLayerViewTests) {
9908 VkResult ret;
9909 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
9910
9911 ASSERT_NO_FATAL_FAILURE(InitState());
9912
9913 VkImageObj image(m_device);
9914 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9915 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
9916 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
9917 VK_IMAGE_TILING_OPTIMAL, 0);
9918 ASSERT_TRUE(image.initialized());
9919
9920 VkImageView imgView;
9921 VkImageViewCreateInfo imgViewInfo = {};
9922 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9923 imgViewInfo.image = image.handle();
9924 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
9925 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9926 imgViewInfo.subresourceRange.layerCount = 1;
9927 imgViewInfo.subresourceRange.baseMipLevel = 0;
9928 imgViewInfo.subresourceRange.levelCount = 1;
9929 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9930
9931 m_errorMonitor->SetDesiredFailureMsg(
9932 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9933 "vkCreateImageView called with baseMipLevel");
9934 // View can't have baseMipLevel >= image's mipLevels - Expect
9935 // VIEW_CREATE_ERROR
9936 imgViewInfo.subresourceRange.baseMipLevel = 1;
9937 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9938 m_errorMonitor->VerifyFound();
9939 imgViewInfo.subresourceRange.baseMipLevel = 0;
9940
9941 m_errorMonitor->SetDesiredFailureMsg(
9942 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9943 "vkCreateImageView called with baseArrayLayer");
9944 // View can't have baseArrayLayer >= image's arraySize - Expect
9945 // VIEW_CREATE_ERROR
9946 imgViewInfo.subresourceRange.baseArrayLayer = 1;
9947 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9948 m_errorMonitor->VerifyFound();
9949 imgViewInfo.subresourceRange.baseArrayLayer = 0;
9950
9951 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9952 "vkCreateImageView called with 0 in "
9953 "pCreateInfo->subresourceRange."
9954 "levelCount");
9955 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
9956 imgViewInfo.subresourceRange.levelCount = 0;
9957 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9958 m_errorMonitor->VerifyFound();
9959 imgViewInfo.subresourceRange.levelCount = 1;
9960
9961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9962 "vkCreateImageView called with 0 in "
9963 "pCreateInfo->subresourceRange."
9964 "layerCount");
9965 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
9966 imgViewInfo.subresourceRange.layerCount = 0;
9967 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9968 m_errorMonitor->VerifyFound();
9969 imgViewInfo.subresourceRange.layerCount = 1;
9970
9971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9972 "but both must be color formats");
9973 // Can't use depth format for view into color image - Expect INVALID_FORMAT
9974 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
9975 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9976 m_errorMonitor->VerifyFound();
9977 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9978
9979 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9980 "Formats MUST be IDENTICAL unless "
9981 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
9982 "was set on image creation.");
9983 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
9984 // VIEW_CREATE_ERROR
9985 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
9986 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9987 m_errorMonitor->VerifyFound();
9988 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9989
9990 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9991 "can support ImageViews with "
9992 "differing formats but they must be "
9993 "in the same compatibility class.");
9994 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
9995 // VIEW_CREATE_ERROR
9996 VkImageCreateInfo mutImgInfo = image.create_info();
9997 VkImage mutImage;
9998 mutImgInfo.format = VK_FORMAT_R8_UINT;
9999 assert(
10000 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
10001 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
10002 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
10003 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10004 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
10005 ASSERT_VK_SUCCESS(ret);
10006 imgViewInfo.image = mutImage;
10007 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
10008 m_errorMonitor->VerifyFound();
10009 imgViewInfo.image = image.handle();
10010 vkDestroyImage(m_device->handle(), mutImage, NULL);
10011}
10012
10013TEST_F(VkLayerTest, MiscImageLayerTests) {
10014
10015 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
10016
10017 ASSERT_NO_FATAL_FAILURE(InitState());
10018
10019 VkImageObj image(m_device);
10020 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
10021 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
10022 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
10023 VK_IMAGE_TILING_OPTIMAL, 0);
10024 ASSERT_TRUE(image.initialized());
10025
10026 m_errorMonitor->SetDesiredFailureMsg(
10027 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10028 "number of layers in image subresource is zero");
10029 vk_testing::Buffer buffer;
10030 VkMemoryPropertyFlags reqs = 0;
10031 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
10032 VkBufferImageCopy region = {};
10033 region.bufferRowLength = 128;
10034 region.bufferImageHeight = 128;
10035 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10036 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
10037 region.imageSubresource.layerCount = 0;
10038 region.imageExtent.height = 4;
10039 region.imageExtent.width = 4;
10040 region.imageExtent.depth = 1;
10041 m_commandBuffer->BeginCommandBuffer();
10042 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
10043 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
10044 1, &region);
10045 m_errorMonitor->VerifyFound();
10046 region.imageSubresource.layerCount = 1;
10047
10048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10049 "aspectMasks for each region must "
10050 "specify only COLOR or DEPTH or "
10051 "STENCIL");
10052 // Expect MISMATCHED_IMAGE_ASPECT
10053 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
10054 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
10055 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
10056 1, &region);
10057 m_errorMonitor->VerifyFound();
10058 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10059
10060 m_errorMonitor->SetDesiredFailureMsg(
10061 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10062 "If the format of srcImage is a depth, stencil, depth stencil or "
10063 "integer-based format then filter must be VK_FILTER_NEAREST");
10064 // Expect INVALID_FILTER
10065 VkImageObj intImage1(m_device);
10066 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
10067 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10068 0);
10069 VkImageObj intImage2(m_device);
10070 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
10071 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10072 0);
10073 VkImageBlit blitRegion = {};
10074 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10075 blitRegion.srcSubresource.baseArrayLayer = 0;
10076 blitRegion.srcSubresource.layerCount = 1;
10077 blitRegion.srcSubresource.mipLevel = 0;
10078 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10079 blitRegion.dstSubresource.baseArrayLayer = 0;
10080 blitRegion.dstSubresource.layerCount = 1;
10081 blitRegion.dstSubresource.mipLevel = 0;
10082
10083 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
10084 intImage1.layout(), intImage2.handle(), intImage2.layout(),
10085 16, &blitRegion, VK_FILTER_LINEAR);
10086 m_errorMonitor->VerifyFound();
10087
10088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10089 "called with 0 in ppMemoryBarriers");
10090 VkImageMemoryBarrier img_barrier;
10091 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10092 img_barrier.pNext = NULL;
10093 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10094 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10095 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10096 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10097 img_barrier.image = image.handle();
10098 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10099 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10100 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10101 img_barrier.subresourceRange.baseArrayLayer = 0;
10102 img_barrier.subresourceRange.baseMipLevel = 0;
10103 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
10104 img_barrier.subresourceRange.layerCount = 0;
10105 img_barrier.subresourceRange.levelCount = 1;
10106 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10107 VK_PIPELINE_STAGE_HOST_BIT,
10108 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10109 nullptr, 1, &img_barrier);
10110 m_errorMonitor->VerifyFound();
10111 img_barrier.subresourceRange.layerCount = 1;
10112}
10113
10114TEST_F(VkLayerTest, ImageFormatLimits) {
10115
10116 TEST_DESCRIPTION("Exceed the limits of image format ");
10117
10118 m_errorMonitor->SetDesiredFailureMsg(
10119 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10120 "CreateImage extents exceed allowable limits for format");
10121 VkImageCreateInfo image_create_info = {};
10122 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10123 image_create_info.pNext = NULL;
10124 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10125 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10126 image_create_info.extent.width = 32;
10127 image_create_info.extent.height = 32;
10128 image_create_info.extent.depth = 1;
10129 image_create_info.mipLevels = 1;
10130 image_create_info.arrayLayers = 1;
10131 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10132 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
10133 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10134 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
10135 image_create_info.flags = 0;
10136
10137 VkImage nullImg;
10138 VkImageFormatProperties imgFmtProps;
10139 vkGetPhysicalDeviceImageFormatProperties(
10140 gpu(), image_create_info.format, image_create_info.imageType,
10141 image_create_info.tiling, image_create_info.usage,
10142 image_create_info.flags, &imgFmtProps);
10143 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
10144 // Expect INVALID_FORMAT_LIMITS_VIOLATION
10145 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
10146 m_errorMonitor->VerifyFound();
10147 image_create_info.extent.depth = 1;
10148
10149 m_errorMonitor->SetDesiredFailureMsg(
10150 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10151 "exceeds allowable maximum supported by format of");
10152 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
10153 // Expect INVALID_FORMAT_LIMITS_VIOLATION
10154 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
10155 m_errorMonitor->VerifyFound();
10156 image_create_info.mipLevels = 1;
10157
10158 m_errorMonitor->SetDesiredFailureMsg(
10159 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10160 "exceeds allowable maximum supported by format of");
10161 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
10162 // Expect INVALID_FORMAT_LIMITS_VIOLATION
10163 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
10164 m_errorMonitor->VerifyFound();
10165 image_create_info.arrayLayers = 1;
10166
10167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10168 "is not supported by format");
10169 int samples = imgFmtProps.sampleCounts >> 1;
10170 image_create_info.samples = (VkSampleCountFlagBits)samples;
10171 // Expect INVALID_FORMAT_LIMITS_VIOLATION
10172 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
10173 m_errorMonitor->VerifyFound();
10174 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10175
10176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10177 "pCreateInfo->initialLayout, must be "
10178 "VK_IMAGE_LAYOUT_UNDEFINED or "
10179 "VK_IMAGE_LAYOUT_PREINITIALIZED");
10180 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10181 // Expect INVALID_LAYOUT
10182 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
10183 m_errorMonitor->VerifyFound();
10184 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
10185}
10186
Karl Schultz6addd812016-02-02 17:17:23 -070010187TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060010188 VkResult err;
10189 bool pass;
10190
10191 // Create color images with different format sizes and try to copy between them
10192 m_errorMonitor->SetDesiredFailureMsg(
10193 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10194 "vkCmdCopyImage called with unmatched source and dest image format sizes");
10195
10196 ASSERT_NO_FATAL_FAILURE(InitState());
10197
10198 // Create two images of different types and try to copy between them
10199 VkImage srcImage;
10200 VkImage dstImage;
10201 VkDeviceMemory srcMem;
10202 VkDeviceMemory destMem;
10203 VkMemoryRequirements memReqs;
10204
10205 VkImageCreateInfo image_create_info = {};
10206 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10207 image_create_info.pNext = NULL;
10208 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10209 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10210 image_create_info.extent.width = 32;
10211 image_create_info.extent.height = 32;
10212 image_create_info.extent.depth = 1;
10213 image_create_info.mipLevels = 1;
10214 image_create_info.arrayLayers = 1;
10215 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10216 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
10217 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10218 image_create_info.flags = 0;
10219
10220 err =
10221 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
10222 ASSERT_VK_SUCCESS(err);
10223
10224 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
10225 // Introduce failure by creating second image with a different-sized format.
10226 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
10227
10228 err =
10229 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
10230 ASSERT_VK_SUCCESS(err);
10231
10232 // Allocate memory
10233 VkMemoryAllocateInfo memAlloc = {};
10234 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10235 memAlloc.pNext = NULL;
10236 memAlloc.allocationSize = 0;
10237 memAlloc.memoryTypeIndex = 0;
10238
10239 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
10240 memAlloc.allocationSize = memReqs.size;
10241 pass =
10242 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
10243 ASSERT_TRUE(pass);
10244 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
10245 ASSERT_VK_SUCCESS(err);
10246
10247 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
10248 memAlloc.allocationSize = memReqs.size;
10249 pass =
10250 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
10251 ASSERT_TRUE(pass);
10252 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
10253 ASSERT_VK_SUCCESS(err);
10254
10255 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10256 ASSERT_VK_SUCCESS(err);
10257 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
10258 ASSERT_VK_SUCCESS(err);
10259
10260 BeginCommandBuffer();
10261 VkImageCopy copyRegion;
10262 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10263 copyRegion.srcSubresource.mipLevel = 0;
10264 copyRegion.srcSubresource.baseArrayLayer = 0;
10265 copyRegion.srcSubresource.layerCount = 0;
10266 copyRegion.srcOffset.x = 0;
10267 copyRegion.srcOffset.y = 0;
10268 copyRegion.srcOffset.z = 0;
10269 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10270 copyRegion.dstSubresource.mipLevel = 0;
10271 copyRegion.dstSubresource.baseArrayLayer = 0;
10272 copyRegion.dstSubresource.layerCount = 0;
10273 copyRegion.dstOffset.x = 0;
10274 copyRegion.dstOffset.y = 0;
10275 copyRegion.dstOffset.z = 0;
10276 copyRegion.extent.width = 1;
10277 copyRegion.extent.height = 1;
10278 copyRegion.extent.depth = 1;
10279 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10280 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
10281 EndCommandBuffer();
10282
10283 m_errorMonitor->VerifyFound();
10284
10285 vkDestroyImage(m_device->device(), srcImage, NULL);
10286 vkDestroyImage(m_device->device(), dstImage, NULL);
10287 vkFreeMemory(m_device->device(), srcMem, NULL);
10288 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010289}
10290
Karl Schultz6addd812016-02-02 17:17:23 -070010291TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
10292 VkResult err;
10293 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060010294
Mark Lobodzinskidb117632016-03-31 10:45:56 -060010295 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070010296 m_errorMonitor->SetDesiredFailureMsg(
10297 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060010298 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010299
Mike Stroyana3082432015-09-25 13:39:21 -060010300 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060010301
10302 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070010303 VkImage srcImage;
10304 VkImage dstImage;
10305 VkDeviceMemory srcMem;
10306 VkDeviceMemory destMem;
10307 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060010308
10309 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010310 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10311 image_create_info.pNext = NULL;
10312 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10313 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10314 image_create_info.extent.width = 32;
10315 image_create_info.extent.height = 32;
10316 image_create_info.extent.depth = 1;
10317 image_create_info.mipLevels = 1;
10318 image_create_info.arrayLayers = 1;
10319 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10320 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
10321 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10322 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010323
Karl Schultz6addd812016-02-02 17:17:23 -070010324 err =
10325 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010326 ASSERT_VK_SUCCESS(err);
10327
Karl Schultzbdb75952016-04-19 11:36:49 -060010328 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
10329
Mark Lobodzinskidb117632016-03-31 10:45:56 -060010330 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070010331 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060010332 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
10333 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010334
Karl Schultz6addd812016-02-02 17:17:23 -070010335 err =
10336 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010337 ASSERT_VK_SUCCESS(err);
10338
10339 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010340 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010341 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10342 memAlloc.pNext = NULL;
10343 memAlloc.allocationSize = 0;
10344 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010345
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060010346 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010347 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010348 pass =
10349 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010350 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010351 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010352 ASSERT_VK_SUCCESS(err);
10353
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010354 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010355 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010356 pass =
10357 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010358 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010359 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010360 ASSERT_VK_SUCCESS(err);
10361
10362 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10363 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010364 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060010365 ASSERT_VK_SUCCESS(err);
10366
10367 BeginCommandBuffer();
10368 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010369 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010370 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060010371 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010372 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010373 copyRegion.srcOffset.x = 0;
10374 copyRegion.srcOffset.y = 0;
10375 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010376 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010377 copyRegion.dstSubresource.mipLevel = 0;
10378 copyRegion.dstSubresource.baseArrayLayer = 0;
10379 copyRegion.dstSubresource.layerCount = 0;
10380 copyRegion.dstOffset.x = 0;
10381 copyRegion.dstOffset.y = 0;
10382 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010383 copyRegion.extent.width = 1;
10384 copyRegion.extent.height = 1;
10385 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070010386 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10387 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060010388 EndCommandBuffer();
10389
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010390 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060010391
Chia-I Wuf7458c52015-10-26 21:10:41 +080010392 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010393 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010394 vkFreeMemory(m_device->device(), srcMem, NULL);
10395 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010396}
10397
Karl Schultz6addd812016-02-02 17:17:23 -070010398TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
10399 VkResult err;
10400 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060010401
Karl Schultz6addd812016-02-02 17:17:23 -070010402 m_errorMonitor->SetDesiredFailureMsg(
10403 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010404 "vkCmdResolveImage called with source sample count less than 2.");
10405
Mike Stroyana3082432015-09-25 13:39:21 -060010406 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060010407
10408 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070010409 VkImage srcImage;
10410 VkImage dstImage;
10411 VkDeviceMemory srcMem;
10412 VkDeviceMemory destMem;
10413 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060010414
10415 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010416 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10417 image_create_info.pNext = NULL;
10418 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10419 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10420 image_create_info.extent.width = 32;
10421 image_create_info.extent.height = 1;
10422 image_create_info.extent.depth = 1;
10423 image_create_info.mipLevels = 1;
10424 image_create_info.arrayLayers = 1;
10425 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10426 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10427 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10428 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010429
Karl Schultz6addd812016-02-02 17:17:23 -070010430 err =
10431 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010432 ASSERT_VK_SUCCESS(err);
10433
Karl Schultz6addd812016-02-02 17:17:23 -070010434 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010435
Karl Schultz6addd812016-02-02 17:17:23 -070010436 err =
10437 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010438 ASSERT_VK_SUCCESS(err);
10439
10440 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010441 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010442 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10443 memAlloc.pNext = NULL;
10444 memAlloc.allocationSize = 0;
10445 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010446
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060010447 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010448 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010449 pass =
10450 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010451 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010452 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010453 ASSERT_VK_SUCCESS(err);
10454
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010455 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010456 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010457 pass =
10458 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010459 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010460 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010461 ASSERT_VK_SUCCESS(err);
10462
10463 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10464 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010465 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060010466 ASSERT_VK_SUCCESS(err);
10467
10468 BeginCommandBuffer();
10469 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070010470 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
10471 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060010472 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010473 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010474 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060010475 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010476 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010477 resolveRegion.srcOffset.x = 0;
10478 resolveRegion.srcOffset.y = 0;
10479 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010480 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010481 resolveRegion.dstSubresource.mipLevel = 0;
10482 resolveRegion.dstSubresource.baseArrayLayer = 0;
10483 resolveRegion.dstSubresource.layerCount = 0;
10484 resolveRegion.dstOffset.x = 0;
10485 resolveRegion.dstOffset.y = 0;
10486 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010487 resolveRegion.extent.width = 1;
10488 resolveRegion.extent.height = 1;
10489 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070010490 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10491 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060010492 EndCommandBuffer();
10493
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010494 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060010495
Chia-I Wuf7458c52015-10-26 21:10:41 +080010496 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010497 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010498 vkFreeMemory(m_device->device(), srcMem, NULL);
10499 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010500}
10501
Karl Schultz6addd812016-02-02 17:17:23 -070010502TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
10503 VkResult err;
10504 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060010505
Karl Schultz6addd812016-02-02 17:17:23 -070010506 m_errorMonitor->SetDesiredFailureMsg(
10507 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010508 "vkCmdResolveImage called with dest sample count greater than 1.");
10509
Mike Stroyana3082432015-09-25 13:39:21 -060010510 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060010511
Chris Forbesa7530692016-05-08 12:35:39 +120010512 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070010513 VkImage srcImage;
10514 VkImage dstImage;
10515 VkDeviceMemory srcMem;
10516 VkDeviceMemory destMem;
10517 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060010518
10519 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010520 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10521 image_create_info.pNext = NULL;
10522 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10523 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10524 image_create_info.extent.width = 32;
10525 image_create_info.extent.height = 1;
10526 image_create_info.extent.depth = 1;
10527 image_create_info.mipLevels = 1;
10528 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120010529 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070010530 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10531 // Note: Some implementations expect color attachment usage for any
10532 // multisample surface
10533 image_create_info.usage =
10534 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10535 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010536
Karl Schultz6addd812016-02-02 17:17:23 -070010537 err =
10538 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010539 ASSERT_VK_SUCCESS(err);
10540
Karl Schultz6addd812016-02-02 17:17:23 -070010541 // Note: Some implementations expect color attachment usage for any
10542 // multisample surface
10543 image_create_info.usage =
10544 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010545
Karl Schultz6addd812016-02-02 17:17:23 -070010546 err =
10547 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010548 ASSERT_VK_SUCCESS(err);
10549
10550 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010551 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010552 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10553 memAlloc.pNext = NULL;
10554 memAlloc.allocationSize = 0;
10555 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010556
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060010557 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010558 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010559 pass =
10560 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010561 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010562 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010563 ASSERT_VK_SUCCESS(err);
10564
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010565 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010566 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010567 pass =
10568 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010569 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010570 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010571 ASSERT_VK_SUCCESS(err);
10572
10573 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10574 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010575 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060010576 ASSERT_VK_SUCCESS(err);
10577
10578 BeginCommandBuffer();
10579 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070010580 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
10581 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060010582 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010583 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010584 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060010585 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010586 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010587 resolveRegion.srcOffset.x = 0;
10588 resolveRegion.srcOffset.y = 0;
10589 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010590 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010591 resolveRegion.dstSubresource.mipLevel = 0;
10592 resolveRegion.dstSubresource.baseArrayLayer = 0;
10593 resolveRegion.dstSubresource.layerCount = 0;
10594 resolveRegion.dstOffset.x = 0;
10595 resolveRegion.dstOffset.y = 0;
10596 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010597 resolveRegion.extent.width = 1;
10598 resolveRegion.extent.height = 1;
10599 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070010600 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10601 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060010602 EndCommandBuffer();
10603
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010604 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060010605
Chia-I Wuf7458c52015-10-26 21:10:41 +080010606 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010607 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010608 vkFreeMemory(m_device->device(), srcMem, NULL);
10609 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010610}
10611
Karl Schultz6addd812016-02-02 17:17:23 -070010612TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
10613 VkResult err;
10614 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060010615
Karl Schultz6addd812016-02-02 17:17:23 -070010616 m_errorMonitor->SetDesiredFailureMsg(
10617 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010618 "vkCmdResolveImage called with unmatched source and dest formats.");
10619
Mike Stroyana3082432015-09-25 13:39:21 -060010620 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060010621
10622 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070010623 VkImage srcImage;
10624 VkImage dstImage;
10625 VkDeviceMemory srcMem;
10626 VkDeviceMemory destMem;
10627 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060010628
10629 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010630 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10631 image_create_info.pNext = NULL;
10632 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10633 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10634 image_create_info.extent.width = 32;
10635 image_create_info.extent.height = 1;
10636 image_create_info.extent.depth = 1;
10637 image_create_info.mipLevels = 1;
10638 image_create_info.arrayLayers = 1;
10639 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
10640 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10641 // Note: Some implementations expect color attachment usage for any
10642 // multisample surface
10643 image_create_info.usage =
10644 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10645 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010646
Karl Schultz6addd812016-02-02 17:17:23 -070010647 err =
10648 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010649 ASSERT_VK_SUCCESS(err);
10650
Karl Schultz6addd812016-02-02 17:17:23 -070010651 // Set format to something other than source image
10652 image_create_info.format = VK_FORMAT_R32_SFLOAT;
10653 // Note: Some implementations expect color attachment usage for any
10654 // multisample surface
10655 image_create_info.usage =
10656 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10657 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010658
Karl Schultz6addd812016-02-02 17:17:23 -070010659 err =
10660 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010661 ASSERT_VK_SUCCESS(err);
10662
10663 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010664 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010665 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10666 memAlloc.pNext = NULL;
10667 memAlloc.allocationSize = 0;
10668 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010669
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060010670 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010671 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010672 pass =
10673 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010674 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010675 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010676 ASSERT_VK_SUCCESS(err);
10677
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010678 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010679 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010680 pass =
10681 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010682 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010683 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010684 ASSERT_VK_SUCCESS(err);
10685
10686 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10687 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010688 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060010689 ASSERT_VK_SUCCESS(err);
10690
10691 BeginCommandBuffer();
10692 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070010693 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
10694 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060010695 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010696 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010697 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060010698 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010699 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010700 resolveRegion.srcOffset.x = 0;
10701 resolveRegion.srcOffset.y = 0;
10702 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010703 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010704 resolveRegion.dstSubresource.mipLevel = 0;
10705 resolveRegion.dstSubresource.baseArrayLayer = 0;
10706 resolveRegion.dstSubresource.layerCount = 0;
10707 resolveRegion.dstOffset.x = 0;
10708 resolveRegion.dstOffset.y = 0;
10709 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010710 resolveRegion.extent.width = 1;
10711 resolveRegion.extent.height = 1;
10712 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070010713 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10714 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060010715 EndCommandBuffer();
10716
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010717 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060010718
Chia-I Wuf7458c52015-10-26 21:10:41 +080010719 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010720 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010721 vkFreeMemory(m_device->device(), srcMem, NULL);
10722 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010723}
10724
Karl Schultz6addd812016-02-02 17:17:23 -070010725TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
10726 VkResult err;
10727 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060010728
Karl Schultz6addd812016-02-02 17:17:23 -070010729 m_errorMonitor->SetDesiredFailureMsg(
10730 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010731 "vkCmdResolveImage called with unmatched source and dest image types.");
10732
Mike Stroyana3082432015-09-25 13:39:21 -060010733 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060010734
10735 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070010736 VkImage srcImage;
10737 VkImage dstImage;
10738 VkDeviceMemory srcMem;
10739 VkDeviceMemory destMem;
10740 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060010741
10742 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010743 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10744 image_create_info.pNext = NULL;
10745 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10746 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10747 image_create_info.extent.width = 32;
10748 image_create_info.extent.height = 1;
10749 image_create_info.extent.depth = 1;
10750 image_create_info.mipLevels = 1;
10751 image_create_info.arrayLayers = 1;
10752 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
10753 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10754 // Note: Some implementations expect color attachment usage for any
10755 // multisample surface
10756 image_create_info.usage =
10757 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10758 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010759
Karl Schultz6addd812016-02-02 17:17:23 -070010760 err =
10761 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010762 ASSERT_VK_SUCCESS(err);
10763
Karl Schultz6addd812016-02-02 17:17:23 -070010764 image_create_info.imageType = VK_IMAGE_TYPE_1D;
10765 // Note: Some implementations expect color attachment usage for any
10766 // multisample surface
10767 image_create_info.usage =
10768 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10769 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010770
Karl Schultz6addd812016-02-02 17:17:23 -070010771 err =
10772 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010773 ASSERT_VK_SUCCESS(err);
10774
10775 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010776 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010777 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10778 memAlloc.pNext = NULL;
10779 memAlloc.allocationSize = 0;
10780 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010781
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060010782 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010783 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010784 pass =
10785 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010786 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010787 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010788 ASSERT_VK_SUCCESS(err);
10789
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010790 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010791 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010792 pass =
10793 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010794 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010795 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010796 ASSERT_VK_SUCCESS(err);
10797
10798 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10799 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010800 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060010801 ASSERT_VK_SUCCESS(err);
10802
10803 BeginCommandBuffer();
10804 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070010805 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
10806 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060010807 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010808 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010809 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060010810 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010811 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010812 resolveRegion.srcOffset.x = 0;
10813 resolveRegion.srcOffset.y = 0;
10814 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010815 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010816 resolveRegion.dstSubresource.mipLevel = 0;
10817 resolveRegion.dstSubresource.baseArrayLayer = 0;
10818 resolveRegion.dstSubresource.layerCount = 0;
10819 resolveRegion.dstOffset.x = 0;
10820 resolveRegion.dstOffset.y = 0;
10821 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010822 resolveRegion.extent.width = 1;
10823 resolveRegion.extent.height = 1;
10824 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070010825 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10826 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060010827 EndCommandBuffer();
10828
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010829 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060010830
Chia-I Wuf7458c52015-10-26 21:10:41 +080010831 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010832 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010833 vkFreeMemory(m_device->device(), srcMem, NULL);
10834 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010835}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010836
Karl Schultz6addd812016-02-02 17:17:23 -070010837TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010838 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070010839 // to using a DS format, then cause it to hit error due to COLOR_BIT not
10840 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010841 // The image format check comes 2nd in validation so we trigger it first,
10842 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070010843 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010844
Karl Schultz6addd812016-02-02 17:17:23 -070010845 m_errorMonitor->SetDesiredFailureMsg(
10846 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010847 "Combination depth/stencil image formats can have only the ");
10848
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010849 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010850
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010851 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010852 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
10853 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010854
10855 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010856 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10857 ds_pool_ci.pNext = NULL;
10858 ds_pool_ci.maxSets = 1;
10859 ds_pool_ci.poolSizeCount = 1;
10860 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010861
10862 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010863 err =
10864 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010865 ASSERT_VK_SUCCESS(err);
10866
10867 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010868 dsl_binding.binding = 0;
10869 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
10870 dsl_binding.descriptorCount = 1;
10871 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10872 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010873
10874 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010875 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10876 ds_layout_ci.pNext = NULL;
10877 ds_layout_ci.bindingCount = 1;
10878 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010879 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010880 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10881 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010882 ASSERT_VK_SUCCESS(err);
10883
10884 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010885 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010886 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010887 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010888 alloc_info.descriptorPool = ds_pool;
10889 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010890 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10891 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010892 ASSERT_VK_SUCCESS(err);
10893
Karl Schultz6addd812016-02-02 17:17:23 -070010894 VkImage image_bad;
10895 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010896 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -070010897 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010898 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070010899 const int32_t tex_width = 32;
10900 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010901
10902 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010903 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10904 image_create_info.pNext = NULL;
10905 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10906 image_create_info.format = tex_format_bad;
10907 image_create_info.extent.width = tex_width;
10908 image_create_info.extent.height = tex_height;
10909 image_create_info.extent.depth = 1;
10910 image_create_info.mipLevels = 1;
10911 image_create_info.arrayLayers = 1;
10912 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10913 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10914 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
10915 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
10916 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010917
Karl Schultz6addd812016-02-02 17:17:23 -070010918 err =
10919 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010920 ASSERT_VK_SUCCESS(err);
10921 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070010922 image_create_info.usage =
10923 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10924 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
10925 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010926 ASSERT_VK_SUCCESS(err);
10927
10928 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010929 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10930 image_view_create_info.image = image_bad;
10931 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
10932 image_view_create_info.format = tex_format_bad;
10933 image_view_create_info.subresourceRange.baseArrayLayer = 0;
10934 image_view_create_info.subresourceRange.baseMipLevel = 0;
10935 image_view_create_info.subresourceRange.layerCount = 1;
10936 image_view_create_info.subresourceRange.levelCount = 1;
10937 image_view_create_info.subresourceRange.aspectMask =
10938 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010939
10940 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070010941 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
10942 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010943
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010944 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010945
Chia-I Wuf7458c52015-10-26 21:10:41 +080010946 vkDestroyImage(m_device->device(), image_bad, NULL);
10947 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010948 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10949 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010950}
Tobin Ehliscde08892015-09-22 10:11:37 -060010951#endif // IMAGE_TESTS
10952
Tony Barbour300a6082015-04-07 13:44:53 -060010953int main(int argc, char **argv) {
10954 int result;
10955
Cody Northrop8e54a402016-03-08 22:25:52 -070010956#ifdef ANDROID
10957 int vulkanSupport = InitVulkan();
10958 if (vulkanSupport == 0)
10959 return 1;
10960#endif
10961
Tony Barbour300a6082015-04-07 13:44:53 -060010962 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060010963 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060010964
10965 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
10966
10967 result = RUN_ALL_TESTS();
10968
Tony Barbour6918cd52015-04-09 12:58:51 -060010969 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060010970 return result;
10971}