blob: 295c6ccc11de27c2b8e9afa3dc123e65920ff3a4 [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>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Karl Schultz6addd812016-02-02 17:17:23 -070021 */
Tony Barbour65c48b32015-11-17 10:02:56 -070022
Cody Northrop8e54a402016-03-08 22:25:52 -070023#ifdef ANDROID
24#include "vulkan_wrapper.h"
25#else
David Pinedo9316d3b2015-11-06 12:54:48 -070026#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070027#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060028
29#if defined(ANDROID) && defined(VALIDATION_APK)
30#include <android/log.h>
31#include <android_native_app_glue.h>
32#endif
33
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060034#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060035#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060036#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070037#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060038
Mark Lobodzinski3780e142015-05-14 15:08:13 -050039#define GLM_FORCE_RADIANS
40#include "glm/glm.hpp"
41#include <glm/gtc/matrix_transform.hpp>
42
Dustin Gravesffa90fa2016-05-06 11:20:38 -060043#define PARAMETER_VALIDATION_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060044#define MEM_TRACKER_TESTS 1
45#define OBJ_TRACKER_TESTS 1
46#define DRAW_STATE_TESTS 1
47#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120048#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060049#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060050#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060051
Mark Lobodzinski3780e142015-05-14 15:08:13 -050052//--------------------------------------------------------------------------------------
53// Mesh and VertexFormat Data
54//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070055struct Vertex {
56 float posX, posY, posZ, posW; // Position data
57 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050058};
59
Karl Schultz6addd812016-02-02 17:17:23 -070060#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050061
62typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070063 BsoFailNone = 0x00000000,
64 BsoFailLineWidth = 0x00000001,
65 BsoFailDepthBias = 0x00000002,
66 BsoFailViewport = 0x00000004,
67 BsoFailScissor = 0x00000008,
68 BsoFailBlend = 0x00000010,
69 BsoFailDepthBounds = 0x00000020,
70 BsoFailStencilReadMask = 0x00000040,
71 BsoFailStencilWriteMask = 0x00000080,
72 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060073 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060074 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050075} BsoFailSelect;
76
77struct vktriangle_vs_uniform {
78 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070079 float mvp[4][4];
80 float position[3][4];
81 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050082};
83
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050084static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120085 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070086 "vec2 vertices[3];\n"
87 "out gl_PerVertex {\n"
88 " vec4 gl_Position;\n"
89 "};\n"
90 "void main() {\n"
91 " vertices[0] = vec2(-1.0, -1.0);\n"
92 " vertices[1] = vec2( 1.0, -1.0);\n"
93 " vertices[2] = vec2( 0.0, 1.0);\n"
94 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
95 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050096
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050097static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120098 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070099 "\n"
100 "layout(location = 0) out vec4 uFragColor;\n"
101 "void main(){\n"
102 " uFragColor = vec4(0,1,0,1);\n"
103 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500104
Karl Schultz6addd812016-02-02 17:17:23 -0700105static VKAPI_ATTR VkBool32 VKAPI_CALL
106myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
107 uint64_t srcObject, size_t location, int32_t msgCode,
108 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -0600109
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600110
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600111// ********************************************************
112// ErrorMonitor Usage:
113//
114// Call SetDesiredFailureMsg with a string to be compared against all
115// encountered log messages. Passing NULL will match all log messages.
116// logMsg will return true for skipCall only if msg is matched or NULL.
117//
118// Call DesiredMsgFound to determine if the desired failure message
119// was encountered.
120
Tony Barbour300a6082015-04-07 13:44:53 -0600121class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700122 public:
123 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600124 test_platform_thread_create_mutex(&m_mutex);
125 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700126 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700127 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600128 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600129 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600130
Dustin Graves48458142016-04-29 16:11:55 -0600131 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
132
Karl Schultz6addd812016-02-02 17:17:23 -0700133 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200134 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600135 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600136 m_failureMsg.clear();
137 m_otherMsgs.clear();
138 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700139 m_msgFound = VK_FALSE;
140 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600141 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600142 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600143
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600144 VkBool32 CheckForDesiredMsg(const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600145 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600146 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600147 if (m_bailout != NULL) {
148 *m_bailout = true;
149 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600150 string errorString(msgString);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600151 if (errorString.find(m_desiredMsg) != string::npos) {
152 if (m_msgFound) { // If multiple matches, don't lose all but the last!
153 m_otherMsgs.push_back(m_failureMsg);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600154 }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600155 m_failureMsg = errorString;
156 m_msgFound = VK_TRUE;
157 result = VK_TRUE;
158 } else {
159 m_otherMsgs.push_back(errorString);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600160 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600161 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600162 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600163 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600164
Karl Schultz6addd812016-02-02 17:17:23 -0700165 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600166
Karl Schultz6addd812016-02-02 17:17:23 -0700167 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600168
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600169 VkDebugReportFlagsEXT GetMessageFlags(void) { return m_msgFlags; }
170
Karl Schultz6addd812016-02-02 17:17:23 -0700171 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600172
Karl Schultz6addd812016-02-02 17:17:23 -0700173 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600174
Karl Schultz6addd812016-02-02 17:17:23 -0700175 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600176 vector<string> otherMsgs = GetOtherFailureMsgs();
177 cout << "Other error messages logged for this test were:" << endl;
178 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
179 cout << " " << *iter << endl;
180 }
181 }
182
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600183 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200184
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600185 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
186 void ExpectSuccess(VkDebugReportFlagsEXT message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
187 m_msgFlags = message_flag_mask;
188 // Match ANY message matching specified type
189 SetDesiredFailureMsg(message_flag_mask, "");
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200190 }
191
192 void VerifyFound() {
193 // Not seeing the desired message is a failure. /Before/ throwing, dump
194 // any other messages.
195 if (!DesiredMsgFound()) {
196 DumpFailureMsgs();
197 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
198 }
199 }
200
201 void VerifyNotFound() {
202 // ExpectSuccess() configured us to match anything. Any error is a
203 // failure.
204 if (DesiredMsgFound()) {
205 DumpFailureMsgs();
206 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
207 }
208 }
209
Karl Schultz6addd812016-02-02 17:17:23 -0700210 private:
211 VkFlags m_msgFlags;
212 string m_desiredMsg;
213 string m_failureMsg;
214 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600215 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700216 bool *m_bailout;
217 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600218};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500219
Karl Schultz6addd812016-02-02 17:17:23 -0700220static VKAPI_ATTR VkBool32 VKAPI_CALL
221myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
222 uint64_t srcObject, size_t location, int32_t msgCode,
223 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600224 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
225 if (msgFlags & errMonitor->GetMessageFlags()) {
226 return errMonitor->CheckForDesiredMsg(pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600227 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600228 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600229}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500230
Karl Schultz6addd812016-02-02 17:17:23 -0700231class VkLayerTest : public VkRenderFramework {
232 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800233 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
234 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700235 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
236 BsoFailSelect failMask);
237 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
238 VkPipelineObj &pipelineobj,
239 VkDescriptorSetObj &descriptorSet,
240 BsoFailSelect failMask);
241 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
242 VkDescriptorSetObj &descriptorSet,
243 BsoFailSelect failMask) {
244 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
245 failMask);
246 }
Tony Barbour300a6082015-04-07 13:44:53 -0600247
Tony Barbourfe3351b2015-07-28 10:17:20 -0600248 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700249 VkResult BeginCommandBuffer() {
250 return BeginCommandBuffer(*m_commandBuffer);
251 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800252 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700253 void Draw(uint32_t vertexCount, uint32_t instanceCount,
254 uint32_t firstVertex, uint32_t firstInstance) {
255 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
256 firstInstance);
257 }
258 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
259 uint32_t firstIndex, int32_t vertexOffset,
260 uint32_t firstInstance) {
261 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
262 vertexOffset, firstInstance);
263 }
Mark Muellerdfe37552016-07-07 14:47:42 -0600264 void QueueCommandBuffer(bool checkSuccess = true) {
265 m_commandBuffer->QueueCommandBuffer(checkSuccess); }
Karl Schultz6addd812016-02-02 17:17:23 -0700266 void QueueCommandBuffer(const VkFence &fence) {
267 m_commandBuffer->QueueCommandBuffer(fence);
268 }
269 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
270 VkDeviceSize offset, uint32_t binding) {
271 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
272 }
273 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
274 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
275 }
276
277 protected:
278 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600279 bool m_enableWSI;
Tony Barbour300a6082015-04-07 13:44:53 -0600280
281 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600282 std::vector<const char *> instance_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600283 std::vector<const char *> instance_extension_names;
284 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600285
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700286 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600287 /*
288 * Since CreateDbgMsgCallback is an instance level extension call
289 * any extension / layer that utilizes that feature also needs
290 * to be enabled at create instance time.
291 */
Karl Schultz6addd812016-02-02 17:17:23 -0700292 // Use Threading layer first to protect others from
293 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700294 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600295 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800296 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700297 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800298 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600299 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700300 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -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;
Tony Barbour4c70d102016-08-08 16:06:56 -0600335 InitFramework(instance_layer_names, instance_extension_names,
336 device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600337 }
338
339 virtual void TearDown() {
340 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600341 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600342 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600343 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600344
345 VkLayerTest() {
346 m_enableWSI = false;
347 }
Tony Barbour300a6082015-04-07 13:44:53 -0600348};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500349
Karl Schultz6addd812016-02-02 17:17:23 -0700350VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600351 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600352
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800353 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600354
355 /*
356 * For render test all drawing happens in a single render pass
357 * on a single command buffer.
358 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200359 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800360 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600361 }
362
363 return result;
364}
365
Karl Schultz6addd812016-02-02 17:17:23 -0700366VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600367 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600368
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200369 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800370 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200371 }
Tony Barbour300a6082015-04-07 13:44:53 -0600372
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800373 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600374
375 return result;
376}
377
Karl Schultz6addd812016-02-02 17:17:23 -0700378void VkLayerTest::VKTriangleTest(const char *vertShaderText,
379 const char *fragShaderText,
380 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500381 // Create identity matrix
382 int i;
383 struct vktriangle_vs_uniform data;
384
385 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700386 glm::mat4 View = glm::mat4(1.0f);
387 glm::mat4 Model = glm::mat4(1.0f);
388 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500389 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700390 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500391
392 memcpy(&data.mvp, &MVP[0][0], matrixSize);
393
Karl Schultz6addd812016-02-02 17:17:23 -0700394 static const Vertex tri_data[] = {
395 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
396 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
397 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500398 };
399
Karl Schultz6addd812016-02-02 17:17:23 -0700400 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500401 data.position[i][0] = tri_data[i].posX;
402 data.position[i][1] = tri_data[i].posY;
403 data.position[i][2] = tri_data[i].posZ;
404 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700405 data.color[i][0] = tri_data[i].r;
406 data.color[i][1] = tri_data[i].g;
407 data.color[i][2] = tri_data[i].b;
408 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500409 }
410
411 ASSERT_NO_FATAL_FAILURE(InitState());
412 ASSERT_NO_FATAL_FAILURE(InitViewport());
413
Karl Schultz6addd812016-02-02 17:17:23 -0700414 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
415 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500416
Karl Schultz6addd812016-02-02 17:17:23 -0700417 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
418 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
419 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500420
421 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800422 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500423 pipelineobj.AddShader(&vs);
424 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600425 if (failMask & BsoFailLineWidth) {
426 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600427 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
428 ia_state.sType =
429 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
430 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
431 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600432 }
433 if (failMask & BsoFailDepthBias) {
434 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600435 VkPipelineRasterizationStateCreateInfo rs_state = {};
436 rs_state.sType =
437 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
438 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600439 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600440 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600441 }
Karl Schultz6addd812016-02-02 17:17:23 -0700442 // Viewport and scissors must stay in synch or other errors will occur than
443 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600444 if (failMask & BsoFailViewport) {
445 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600446 m_viewports.clear();
447 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600448 }
449 if (failMask & BsoFailScissor) {
450 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600451 m_scissors.clear();
452 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600453 }
454 if (failMask & BsoFailBlend) {
455 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600456 VkPipelineColorBlendAttachmentState att_state = {};
457 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
458 att_state.blendEnable = VK_TRUE;
459 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600460 }
461 if (failMask & BsoFailDepthBounds) {
462 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
463 }
464 if (failMask & BsoFailStencilReadMask) {
465 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
466 }
467 if (failMask & BsoFailStencilWriteMask) {
468 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
469 }
470 if (failMask & BsoFailStencilReference) {
471 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
472 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500473
474 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700475 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
476 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500477
478 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600479 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500480
Tony Barbourfe3351b2015-07-28 10:17:20 -0600481 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500482
483 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600484 if (failMask & BsoFailIndexBuffer) {
485 // Use DrawIndexed w/o an index buffer bound
486 DrawIndexed(3, 1, 0, 0, 0);
487 } else {
488 Draw(3, 1, 0, 0);
489 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500490
Mark Muellerd4914412016-06-13 17:52:06 -0600491 if (failMask & BsoFailCmdClearAttachments) {
492 VkClearAttachment color_attachment = {};
493 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
494 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
495 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
496
497 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
498 &color_attachment, 1, &clear_rect);
499 }
500
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500501 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600502 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500503
Tony Barbourfe3351b2015-07-28 10:17:20 -0600504 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500505}
506
Karl Schultz6addd812016-02-02 17:17:23 -0700507void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
508 VkPipelineObj &pipelineobj,
509 VkDescriptorSetObj &descriptorSet,
510 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500511 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700512 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
513 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500514 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700515 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
516 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500517 }
518
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800519 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700520 // Make sure depthWriteEnable is set so that Depth fail test will work
521 // correctly
522 // Make sure stencilTestEnable is set so that Stencil fail test will work
523 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600524 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800525 stencil.failOp = VK_STENCIL_OP_KEEP;
526 stencil.passOp = VK_STENCIL_OP_KEEP;
527 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
528 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600529
530 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
531 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600532 ds_ci.pNext = NULL;
533 ds_ci.depthTestEnable = VK_FALSE;
534 ds_ci.depthWriteEnable = VK_TRUE;
535 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
536 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600537 if (failMask & BsoFailDepthBounds) {
538 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600539 ds_ci.maxDepthBounds = 0.0f;
540 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600541 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600542 ds_ci.stencilTestEnable = VK_TRUE;
543 ds_ci.front = stencil;
544 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600545
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600546 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600547 pipelineobj.SetViewport(m_viewports);
548 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800549 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700550 VkResult err = pipelineobj.CreateVKPipeline(
551 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600552 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800553 commandBuffer->BindPipeline(pipelineobj);
554 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500555}
556
Ian Elliott2c1daf52016-05-12 09:41:46 -0600557class VkWsiEnabledLayerTest : public VkLayerTest {
558 public:
559protected:
560 VkWsiEnabledLayerTest() {
561 m_enableWSI = true;
562 }
563};
564
Mark Muellerdfe37552016-07-07 14:47:42 -0600565class VkBufferTest {
566public:
567 enum eTestEnFlags {
568 eDoubleDelete,
569 eInvalidDeviceOffset,
570 eInvalidMemoryOffset,
571 eBindNullBuffer,
572 eFreeInvalidHandle,
573 };
574
575 enum eTestConditions {
576 eOffsetAlignment = 1
577 };
578
579 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice,
580 eTestEnFlags aTestFlag,
581 VkBufferUsageFlags aBufferUsage = 0) {
582 if (eInvalidDeviceOffset != aTestFlag &&
583 eInvalidMemoryOffset != aTestFlag) {
584 return true;
585 }
586 VkDeviceSize offset_limit = 0;
587 if (eInvalidMemoryOffset == aTestFlag) {
588 VkBuffer vulkanBuffer;
589 VkBufferCreateInfo buffer_create_info = {};
590 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
591 buffer_create_info.size = 32;
592 buffer_create_info.usage = aBufferUsage;
593
594 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr,
595 &vulkanBuffer);
596 VkMemoryRequirements memory_reqs = {0};
597
598 vkGetBufferMemoryRequirements(aVulkanDevice->device(),
599 vulkanBuffer, &memory_reqs);
600 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
601 offset_limit = memory_reqs.alignment;
602 }
603 else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
604 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
605 offset_limit =
606 aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
607 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
608 offset_limit =
609 aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
610 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
611 offset_limit =
612 aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
613 }
614 if (eOffsetAlignment < offset_limit) {
615 return true;
616 }
617 return false;
618 }
619
620 // A constructor which performs validation tests within construction.
621 VkBufferTest(VkDeviceObj *aVulkanDevice,
622 VkBufferUsageFlags aBufferUsage,
623 eTestEnFlags aTestFlag)
624 : AllocateCurrent(false), BoundCurrent(false),
625 CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
626
627 if (eBindNullBuffer == aTestFlag) {
628 VulkanMemory = 0;
629 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
630 } else {
631 VkBufferCreateInfo buffer_create_info = {};
632 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
633 buffer_create_info.size = 32;
634 buffer_create_info.usage = aBufferUsage;
635
636 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr,
637 &VulkanBuffer);
638
639 CreateCurrent = true;
640
641 VkMemoryRequirements memory_requirements;
642 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer,
643 &memory_requirements);
644
645 VkMemoryAllocateInfo memory_allocate_info = {};
646 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
647 memory_allocate_info.allocationSize = memory_requirements.size;
648 bool pass = aVulkanDevice->phy().
649 set_memory_type(memory_requirements.memoryTypeBits,
650 &memory_allocate_info,
651 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
652 if (!pass) {
653 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
654 return;
655 }
656
657 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL,
658 &VulkanMemory);
659 AllocateCurrent = true;
660 // NB: 1 is intentionally an invalid offset value
661 const bool offset_en = eInvalidDeviceOffset == aTestFlag ||
662 eInvalidMemoryOffset == aTestFlag;
663 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory,
664 offset_en ? eOffsetAlignment : 0);
665 BoundCurrent = true;
666
667 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
668 }
669 }
670
671 ~VkBufferTest() {
672 if (CreateCurrent) {
673 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
674 }
675 if (AllocateCurrent) {
676 if (InvalidDeleteEn) {
677 union {
678 VkDeviceMemory device_memory;
679 unsigned long long index_access;
680 } bad_index;
681
682 bad_index.device_memory = VulkanMemory;
683 bad_index.index_access++;
684
685 vkFreeMemory(VulkanDevice,
686 bad_index.device_memory,
687 nullptr);
688 }
689 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
690 }
691 }
692
693 bool GetBufferCurrent() {
694 return AllocateCurrent && BoundCurrent && CreateCurrent;
695 }
696
697 const VkBuffer &GetBuffer() {
698 return VulkanBuffer;
699 }
700
701 void TestDoubleDestroy() {
702 // Destroy the buffer but leave the flag set, which will cause
703 // the buffer to be destroyed again in the destructor.
704 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
705 }
706
707protected:
708 bool AllocateCurrent;
709 bool BoundCurrent;
710 bool CreateCurrent;
711 bool InvalidDeleteEn;
712
713 VkBuffer VulkanBuffer;
714 VkDevice VulkanDevice;
715 VkDeviceMemory VulkanMemory;
716
717};
718
719class VkVerticesObj {
720public:
721 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount,
722 unsigned aBindingCount, unsigned aByteStride,
723 VkDeviceSize aVertexCount, const float *aVerticies)
724 : BoundCurrent(false),
725 AttributeCount(aAttributeCount),
726 BindingCount(aBindingCount),
727 BindId(BindIdGenerator),
728 PipelineVertexInputStateCreateInfo(),
729 VulkanMemoryBuffer(aVulkanDevice, 1,
730 static_cast<int>(aByteStride * aVertexCount),
731 reinterpret_cast<const void *>(aVerticies),
732 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
733 BindIdGenerator++; // NB: This can wrap w/misuse
734
735 VertexInputAttributeDescription =
736 new VkVertexInputAttributeDescription[AttributeCount];
737 VertexInputBindingDescription =
738 new VkVertexInputBindingDescription[BindingCount];
739
740 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions =
741 VertexInputAttributeDescription;
742 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount =
743 AttributeCount;
744 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions =
745 VertexInputBindingDescription;
746 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount =
747 BindingCount;
748 PipelineVertexInputStateCreateInfo.sType =
749 VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
750
751 unsigned i = 0;
752 do {
753 VertexInputAttributeDescription[i].binding = BindId;
754 VertexInputAttributeDescription[i].location = i;
755 VertexInputAttributeDescription[i].format =
756 VK_FORMAT_R32G32B32_SFLOAT;
757 VertexInputAttributeDescription[i].offset =
758 sizeof(float) * aByteStride;
759 i++;
760 } while (AttributeCount < i);
761
762 i = 0;
763 do {
764 VertexInputBindingDescription[i].binding = BindId;
765 VertexInputBindingDescription[i].stride = aByteStride;
766 VertexInputBindingDescription[i].inputRate =
767 VK_VERTEX_INPUT_RATE_VERTEX;
768 i++;
769 } while (BindingCount < i);
770 }
771
772 ~VkVerticesObj() {
773 if (VertexInputAttributeDescription) {
774 delete[] VertexInputAttributeDescription;
775 }
776 if (VertexInputBindingDescription) {
777 delete[] VertexInputBindingDescription;
778 }
779 }
780
781 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
782 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription,
783 AttributeCount);
784 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription,
785 BindingCount);
786 return true;
787 }
788
789 void BindVertexBuffers(VkCommandBuffer aCommandBuffer,
790 unsigned aOffsetCount = 0,
791 VkDeviceSize *aOffsetList = nullptr) {
792 VkDeviceSize *offsetList;
793 unsigned offsetCount;
794
795 if (aOffsetCount) {
796 offsetList = aOffsetList;
797 offsetCount = aOffsetCount;
798 } else {
799 offsetList = new VkDeviceSize[1]();
800 offsetCount = 1;
801 }
802
803 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount,
804 &VulkanMemoryBuffer.handle(), offsetList);
805 BoundCurrent = true;
806
807 if (!aOffsetCount) {
808 delete [] offsetList;
809 }
810 }
811
812protected:
813 static uint32_t BindIdGenerator;
814
815 bool BoundCurrent;
816 unsigned AttributeCount;
817 unsigned BindingCount;
818 uint32_t BindId;
819
820 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
821 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
822 VkVertexInputBindingDescription *VertexInputBindingDescription;
823 VkConstantBufferObj VulkanMemoryBuffer;
824};
825
826uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500827// ********************************************************************************************************************
828// ********************************************************************************************************************
829// ********************************************************************************************************************
830// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600831#if PARAMETER_VALIDATION_TESTS
832TEST_F(VkLayerTest, RequiredParameter) {
833 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
834 "pointer, array, and array count parameters");
835
836 ASSERT_NO_FATAL_FAILURE(InitState());
837
838 m_errorMonitor->SetDesiredFailureMsg(
839 VK_DEBUG_REPORT_ERROR_BIT_EXT,
840 "required parameter pFeatures specified as NULL");
841 // Specify NULL for a pointer to a handle
842 // Expected to trigger an error with
843 // parameter_validation::validate_required_pointer
844 vkGetPhysicalDeviceFeatures(gpu(), NULL);
845 m_errorMonitor->VerifyFound();
846
847 m_errorMonitor->SetDesiredFailureMsg(
848 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600849 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600850 // Specify NULL for pointer to array count
851 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600852 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600853 m_errorMonitor->VerifyFound();
854
855 m_errorMonitor->SetDesiredFailureMsg(
856 VK_DEBUG_REPORT_ERROR_BIT_EXT,
857 "parameter viewportCount must be greater than 0");
858 // Specify 0 for a required array count
859 // Expected to trigger an error with parameter_validation::validate_array
860 VkViewport view_port = {};
861 m_commandBuffer->SetViewport(0, 0, &view_port);
862 m_errorMonitor->VerifyFound();
863
864 m_errorMonitor->SetDesiredFailureMsg(
865 VK_DEBUG_REPORT_ERROR_BIT_EXT,
866 "required parameter pViewports specified as NULL");
867 // Specify NULL for a required array
868 // Expected to trigger an error with parameter_validation::validate_array
869 m_commandBuffer->SetViewport(0, 1, NULL);
870 m_errorMonitor->VerifyFound();
871
872 m_errorMonitor->SetDesiredFailureMsg(
873 VK_DEBUG_REPORT_ERROR_BIT_EXT,
874 "required parameter memory specified as VK_NULL_HANDLE");
875 // Specify VK_NULL_HANDLE for a required handle
876 // Expected to trigger an error with
877 // parameter_validation::validate_required_handle
878 vkUnmapMemory(device(), VK_NULL_HANDLE);
879 m_errorMonitor->VerifyFound();
880
881 m_errorMonitor->SetDesiredFailureMsg(
882 VK_DEBUG_REPORT_ERROR_BIT_EXT,
883 "required parameter pFences[0] specified as VK_NULL_HANDLE");
884 // Specify VK_NULL_HANDLE for a required handle array entry
885 // Expected to trigger an error with
886 // parameter_validation::validate_required_handle_array
887 VkFence fence = VK_NULL_HANDLE;
888 vkResetFences(device(), 1, &fence);
889 m_errorMonitor->VerifyFound();
890
891 m_errorMonitor->SetDesiredFailureMsg(
892 VK_DEBUG_REPORT_ERROR_BIT_EXT,
893 "required parameter pAllocateInfo specified as NULL");
894 // Specify NULL for a required struct pointer
895 // Expected to trigger an error with
896 // parameter_validation::validate_struct_type
897 VkDeviceMemory memory = VK_NULL_HANDLE;
898 vkAllocateMemory(device(), NULL, NULL, &memory);
899 m_errorMonitor->VerifyFound();
900
901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
902 "value of faceMask must not be 0");
903 // Specify 0 for a required VkFlags parameter
904 // Expected to trigger an error with parameter_validation::validate_flags
905 m_commandBuffer->SetStencilReference(0, 0);
906 m_errorMonitor->VerifyFound();
907
908 m_errorMonitor->SetDesiredFailureMsg(
909 VK_DEBUG_REPORT_ERROR_BIT_EXT,
910 "value of pSubmits[i].pWaitDstStageMask[0] must not be 0");
911 // Specify 0 for a required VkFlags array entry
912 // Expected to trigger an error with
913 // parameter_validation::validate_flags_array
914 VkSemaphore semaphore = VK_NULL_HANDLE;
915 VkPipelineStageFlags stageFlags = 0;
916 VkSubmitInfo submitInfo = {};
917 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
918 submitInfo.waitSemaphoreCount = 1;
919 submitInfo.pWaitSemaphores = &semaphore;
920 submitInfo.pWaitDstStageMask = &stageFlags;
921 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
922 m_errorMonitor->VerifyFound();
923}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600924
Dustin Gravesfce74c02016-05-10 11:42:58 -0600925TEST_F(VkLayerTest, ReservedParameter) {
926 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
927
928 ASSERT_NO_FATAL_FAILURE(InitState());
929
930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
931 " must be 0");
932 // Specify 0 for a reserved VkFlags parameter
933 // Expected to trigger an error with
934 // parameter_validation::validate_reserved_flags
935 VkEvent event_handle = VK_NULL_HANDLE;
936 VkEventCreateInfo event_info = {};
937 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
938 event_info.flags = 1;
939 vkCreateEvent(device(), &event_info, NULL, &event_handle);
940 m_errorMonitor->VerifyFound();
941}
942
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600943TEST_F(VkLayerTest, InvalidStructSType) {
944 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
945 "structure's sType field");
946
947 ASSERT_NO_FATAL_FAILURE(InitState());
948
949 m_errorMonitor->SetDesiredFailureMsg(
950 VK_DEBUG_REPORT_ERROR_BIT_EXT,
951 "parameter pAllocateInfo->sType must be");
952 // Zero struct memory, effectively setting sType to
953 // VK_STRUCTURE_TYPE_APPLICATION_INFO
954 // Expected to trigger an error with
955 // parameter_validation::validate_struct_type
956 VkMemoryAllocateInfo alloc_info = {};
957 VkDeviceMemory memory = VK_NULL_HANDLE;
958 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
959 m_errorMonitor->VerifyFound();
960
961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
962 "parameter pSubmits[0].sType must be");
963 // Zero struct memory, effectively setting sType to
964 // VK_STRUCTURE_TYPE_APPLICATION_INFO
965 // Expected to trigger an error with
966 // parameter_validation::validate_struct_type_array
967 VkSubmitInfo submit_info = {};
968 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
969 m_errorMonitor->VerifyFound();
970}
971
972TEST_F(VkLayerTest, InvalidStructPNext) {
973 TEST_DESCRIPTION(
974 "Specify an invalid value for a Vulkan structure's pNext field");
975
976 ASSERT_NO_FATAL_FAILURE(InitState());
977
978 m_errorMonitor->SetDesiredFailureMsg(
Dustin Gravesaf5c0292016-07-19 13:43:53 -0600979 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz38b50992016-07-11 16:09:09 -0600980 "value of pCreateInfo->pNext must be NULL");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600981 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be
Karl Schultz38b50992016-07-11 16:09:09 -0600982 // NULL.
983 // Need to pick a function that has no allowed pNext structure types.
984 // Expected to trigger an error with
985 // parameter_validation::validate_struct_pnext
986 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600987 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600988 // Zero-initialization will provide the correct sType
989 VkApplicationInfo app_info = {};
990 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
991 event_alloc_info.pNext = &app_info;
992 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
993 m_errorMonitor->VerifyFound();
994
995 m_errorMonitor->SetDesiredFailureMsg(
Dustin Gravesaf5c0292016-07-19 13:43:53 -0600996 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz38b50992016-07-11 16:09:09 -0600997 " chain includes a structure with unexpected VkStructureType ");
998 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
999 // a function that has allowed pNext structure types and specify
1000 // a structure type that is not allowed.
Dustin Gravesc99cf5a2016-05-09 14:40:29 -06001001 // Expected to trigger an error with
1002 // parameter_validation::validate_struct_pnext
1003 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -06001004 VkMemoryAllocateInfo memory_alloc_info = {};
1005 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1006 memory_alloc_info.pNext = &app_info;
1007 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -06001008 m_errorMonitor->VerifyFound();
1009
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -06001010 // Positive test to check parameter_validation and unique_objects support
1011 // for NV_dedicated_allocation
1012 uint32_t extension_count = 0;
1013 bool supports_nv_dedicated_allocation = false;
Dustin Gravese34a6172016-07-20 13:41:21 -06001014 VkResult err = vkEnumerateDeviceExtensionProperties(
1015 gpu(), nullptr, &extension_count, nullptr);
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -06001016 ASSERT_VK_SUCCESS(err);
1017
1018 if (extension_count > 0) {
1019 std::vector<VkExtensionProperties> available_extensions(
1020 extension_count);
1021
1022 err = vkEnumerateDeviceExtensionProperties(
1023 gpu(), nullptr, &extension_count, &available_extensions[0]);
1024 ASSERT_VK_SUCCESS(err);
1025
1026 for (const auto &extension_props : available_extensions) {
1027 if (strcmp(extension_props.extensionName,
1028 VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
1029 supports_nv_dedicated_allocation = true;
1030 }
1031 }
1032 }
1033
1034 if (supports_nv_dedicated_allocation) {
1035 m_errorMonitor->ExpectSuccess();
1036
1037 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info =
1038 {};
1039 dedicated_buffer_create_info.sType =
1040 VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
1041 dedicated_buffer_create_info.pNext = nullptr;
1042 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
1043
1044 uint32_t queue_family_index = 0;
1045 VkBufferCreateInfo buffer_create_info = {};
1046 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1047 buffer_create_info.pNext = &dedicated_buffer_create_info;
1048 buffer_create_info.size = 1024;
1049 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1050 buffer_create_info.queueFamilyIndexCount = 1;
1051 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1052
1053 VkBuffer buffer;
1054 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1055 NULL, &buffer);
1056 ASSERT_VK_SUCCESS(err);
1057
1058 VkMemoryRequirements memory_reqs;
1059 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1060
1061 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
1062 dedicated_memory_info.sType =
1063 VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
1064 dedicated_memory_info.pNext = nullptr;
1065 dedicated_memory_info.buffer = buffer;
1066 dedicated_memory_info.image = VK_NULL_HANDLE;
1067
1068 VkMemoryAllocateInfo memory_info = {};
1069 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1070 memory_info.pNext = &dedicated_memory_info;
1071 memory_info.allocationSize = memory_reqs.size;
1072
1073 bool pass;
1074 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1075 &memory_info, 0);
1076 ASSERT_TRUE(pass);
1077
1078 VkDeviceMemory buffer_memory;
1079 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1080 &buffer_memory);
1081 ASSERT_VK_SUCCESS(err);
1082
1083 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1084 ASSERT_VK_SUCCESS(err);
1085
1086 vkDestroyBuffer(m_device->device(), buffer, NULL);
1087 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1088
1089 m_errorMonitor->VerifyNotFound();
1090 }
Dustin Gravesc99cf5a2016-05-09 14:40:29 -06001091}
Dustin Graves5d33d532016-05-09 16:21:12 -06001092
1093TEST_F(VkLayerTest, UnrecognizedValue) {
1094 TEST_DESCRIPTION(
1095 "Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
1096
1097 ASSERT_NO_FATAL_FAILURE(InitState());
1098
1099 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1100 "does not fall within the begin..end "
1101 "range of the core VkFormat "
1102 "enumeration tokens");
1103 // Specify an invalid VkFormat value
1104 // Expected to trigger an error with
1105 // parameter_validation::validate_ranged_enum
1106 VkFormatProperties format_properties;
1107 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000),
1108 &format_properties);
1109 m_errorMonitor->VerifyFound();
1110
1111 m_errorMonitor->SetDesiredFailureMsg(
1112 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1113 "contains flag bits that are not recognized members of");
1114 // Specify an invalid VkFlags bitmask value
1115 // Expected to trigger an error with parameter_validation::validate_flags
1116 VkImageFormatProperties image_format_properties;
1117 vkGetPhysicalDeviceImageFormatProperties(
1118 gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D,
1119 VK_IMAGE_TILING_OPTIMAL, static_cast<VkImageUsageFlags>(1 << 25), 0,
1120 &image_format_properties);
1121 m_errorMonitor->VerifyFound();
1122
1123 m_errorMonitor->SetDesiredFailureMsg(
1124 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1125 "contains flag bits that are not recognized members of");
1126 // Specify an invalid VkFlags array entry
1127 // Expected to trigger an error with
1128 // parameter_validation::validate_flags_array
1129 VkSemaphore semaphore = VK_NULL_HANDLE;
1130 VkPipelineStageFlags stage_flags =
1131 static_cast<VkPipelineStageFlags>(1 << 25);
1132 VkSubmitInfo submit_info = {};
1133 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1134 submit_info.waitSemaphoreCount = 1;
1135 submit_info.pWaitSemaphores = &semaphore;
1136 submit_info.pWaitDstStageMask = &stage_flags;
1137 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1138 m_errorMonitor->VerifyFound();
1139
1140 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1141 "is neither VK_TRUE nor VK_FALSE");
1142 // Specify an invalid VkBool32 value
1143 // Expected to trigger a warning with
1144 // parameter_validation::validate_bool32
1145 VkSampler sampler = VK_NULL_HANDLE;
1146 VkSamplerCreateInfo sampler_info = {};
1147 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1148 sampler_info.pNext = NULL;
1149 sampler_info.magFilter = VK_FILTER_NEAREST;
1150 sampler_info.minFilter = VK_FILTER_NEAREST;
1151 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1152 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1153 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1154 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1155 sampler_info.mipLodBias = 1.0;
1156 sampler_info.maxAnisotropy = 1;
1157 sampler_info.compareEnable = VK_FALSE;
1158 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1159 sampler_info.minLod = 1.0;
1160 sampler_info.maxLod = 1.0;
1161 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1162 sampler_info.unnormalizedCoordinates = VK_FALSE;
1163 // Not VK_TRUE or VK_FALSE
1164 sampler_info.anisotropyEnable = 3;
1165 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1166 m_errorMonitor->VerifyFound();
1167}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001168
1169TEST_F(VkLayerTest, FailedReturnValue) {
1170 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1171
1172 ASSERT_NO_FATAL_FAILURE(InitState());
1173
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001174 // Find an unsupported image format
1175 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1176 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1177 VkFormat format = static_cast<VkFormat>(f);
1178 VkFormatProperties fProps = m_device->format_properties(format);
1179 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
1180 fProps.optimalTilingFeatures == 0) {
1181 unsupported = format;
1182 break;
1183 }
1184 }
1185
1186 if (unsupported != VK_FORMAT_UNDEFINED) {
1187 m_errorMonitor->SetDesiredFailureMsg(
1188 VK_DEBUG_REPORT_WARNING_BIT_EXT,
1189 "the requested format is not supported on this device");
1190 // Specify an unsupported VkFormat value to generate a
1191 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1192 // Expected to trigger a warning from
1193 // parameter_validation::validate_result
1194 VkImageFormatProperties image_format_properties;
1195 VkResult err = vkGetPhysicalDeviceImageFormatProperties(
1196 gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1197 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
1198 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1199 m_errorMonitor->VerifyFound();
1200 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001201}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001202
1203TEST_F(VkLayerTest, UpdateBufferAlignment) {
1204 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
1205 uint32_t updateData[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
1206
1207 ASSERT_NO_FATAL_FAILURE(InitState());
1208
1209 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1210 vk_testing::Buffer buffer;
1211 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1212
1213 BeginCommandBuffer();
1214 // Introduce failure by using dstOffset that is not multiple of 4
1215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1216 " is not a multiple of 4");
1217 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1218 m_errorMonitor->VerifyFound();
1219
1220 // Introduce failure by using dataSize that is not multiple of 4
1221 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1222 " is not a multiple of 4");
1223 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1224 m_errorMonitor->VerifyFound();
1225
1226 // Introduce failure by using dataSize that is < 0
1227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1228 "must be greater than zero and less than or equal to 65536");
1229 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1230 m_errorMonitor->VerifyFound();
1231
1232 // Introduce failure by using dataSize that is > 65536
1233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1234 "must be greater than zero and less than or equal to 65536");
1235 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1236 m_errorMonitor->VerifyFound();
1237
1238 EndCommandBuffer();
1239}
1240
1241TEST_F(VkLayerTest, FillBufferAlignment) {
1242 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1243
1244 ASSERT_NO_FATAL_FAILURE(InitState());
1245
1246 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1247 vk_testing::Buffer buffer;
1248 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1249
1250 BeginCommandBuffer();
1251
1252 // Introduce failure by using dstOffset that is not multiple of 4
1253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1254 " is not a multiple of 4");
1255 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1256 m_errorMonitor->VerifyFound();
1257
1258 // Introduce failure by using size that is not multiple of 4
1259 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1260 " is not a multiple of 4");
1261 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1262 m_errorMonitor->VerifyFound();
1263
1264 // Introduce failure by using size that is zero
1265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1266 "must be greater than zero");
1267 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1268 m_errorMonitor->VerifyFound();
1269
1270 EndCommandBuffer();
1271}
Dustin Graves40f35822016-06-23 11:12:53 -06001272
1273// This is a positive test. No failures are expected.
1274TEST_F(VkLayerTest, IgnoreUnrelatedDescriptor) {
1275 TEST_DESCRIPTION("Ensure that the vkUpdateDescriptorSet validation code "
1276 "is ignoring VkWriteDescriptorSet members that are not "
1277 "related to the descriptor type specified by "
1278 "VkWriteDescriptorSet::descriptorType. Correct "
1279 "validation behavior will result in the test running to "
1280 "completion without validation errors.");
1281
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001282 const uintptr_t invalid_ptr = 0xcdcdcdcd;
1283
Dustin Graves40f35822016-06-23 11:12:53 -06001284 ASSERT_NO_FATAL_FAILURE(InitState());
1285
1286 // Image Case
1287 {
1288 m_errorMonitor->ExpectSuccess();
1289
1290 VkImage image;
1291 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1292 const int32_t tex_width = 32;
1293 const int32_t tex_height = 32;
1294 VkImageCreateInfo image_create_info = {};
1295 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1296 image_create_info.pNext = NULL;
1297 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1298 image_create_info.format = tex_format;
1299 image_create_info.extent.width = tex_width;
1300 image_create_info.extent.height = tex_height;
1301 image_create_info.extent.depth = 1;
1302 image_create_info.mipLevels = 1;
1303 image_create_info.arrayLayers = 1;
1304 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis51cde412016-07-11 16:08:30 -06001305 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Dustin Graves40f35822016-06-23 11:12:53 -06001306 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1307 image_create_info.flags = 0;
1308 VkResult err =
1309 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1310 ASSERT_VK_SUCCESS(err);
1311
1312 VkMemoryRequirements memory_reqs;
1313 VkDeviceMemory image_memory;
1314 bool pass;
1315 VkMemoryAllocateInfo memory_info = {};
1316 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1317 memory_info.pNext = NULL;
1318 memory_info.allocationSize = 0;
1319 memory_info.memoryTypeIndex = 0;
1320 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
1321 memory_info.allocationSize = memory_reqs.size;
1322 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1323 &memory_info, 0);
1324 ASSERT_TRUE(pass);
1325 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1326 &image_memory);
1327 ASSERT_VK_SUCCESS(err);
1328 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
1329 ASSERT_VK_SUCCESS(err);
1330
1331 VkImageViewCreateInfo image_view_create_info = {};
1332 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1333 image_view_create_info.image = image;
1334 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
1335 image_view_create_info.format = tex_format;
1336 image_view_create_info.subresourceRange.layerCount = 1;
1337 image_view_create_info.subresourceRange.baseMipLevel = 0;
1338 image_view_create_info.subresourceRange.levelCount = 1;
1339 image_view_create_info.subresourceRange.aspectMask =
1340 VK_IMAGE_ASPECT_COLOR_BIT;
1341
1342 VkImageView view;
1343 err = vkCreateImageView(m_device->device(), &image_view_create_info,
1344 NULL, &view);
1345 ASSERT_VK_SUCCESS(err);
1346
1347 VkDescriptorPoolSize ds_type_count = {};
1348 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1349 ds_type_count.descriptorCount = 1;
1350
1351 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1352 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1353 ds_pool_ci.pNext = NULL;
1354 ds_pool_ci.maxSets = 1;
1355 ds_pool_ci.poolSizeCount = 1;
1356 ds_pool_ci.pPoolSizes = &ds_type_count;
1357
1358 VkDescriptorPool ds_pool;
1359 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1360 &ds_pool);
1361 ASSERT_VK_SUCCESS(err);
1362
1363 VkDescriptorSetLayoutBinding dsl_binding = {};
1364 dsl_binding.binding = 0;
1365 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1366 dsl_binding.descriptorCount = 1;
1367 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1368 dsl_binding.pImmutableSamplers = NULL;
1369
1370 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1371 ds_layout_ci.sType =
1372 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1373 ds_layout_ci.pNext = NULL;
1374 ds_layout_ci.bindingCount = 1;
1375 ds_layout_ci.pBindings = &dsl_binding;
1376 VkDescriptorSetLayout ds_layout;
1377 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1378 NULL, &ds_layout);
1379 ASSERT_VK_SUCCESS(err);
1380
1381 VkDescriptorSet descriptor_set;
1382 VkDescriptorSetAllocateInfo alloc_info = {};
1383 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1384 alloc_info.descriptorSetCount = 1;
1385 alloc_info.descriptorPool = ds_pool;
1386 alloc_info.pSetLayouts = &ds_layout;
1387 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1388 &descriptor_set);
1389 ASSERT_VK_SUCCESS(err);
1390
1391 VkDescriptorImageInfo image_info = {};
1392 image_info.imageView = view;
1393 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
1394
1395 VkWriteDescriptorSet descriptor_write;
1396 memset(&descriptor_write, 0, sizeof(descriptor_write));
1397 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1398 descriptor_write.dstSet = descriptor_set;
1399 descriptor_write.dstBinding = 0;
1400 descriptor_write.descriptorCount = 1;
1401 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1402 descriptor_write.pImageInfo = &image_info;
1403
1404 // Set pBufferInfo and pTexelBufferView to invalid values, which should
1405 // be
1406 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
1407 // This will most likely produce a crash if the parameter_validation
1408 // layer
1409 // does not correctly ignore pBufferInfo.
1410 descriptor_write.pBufferInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001411 reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001412 descriptor_write.pTexelBufferView =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001413 reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001414
1415 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1416 NULL);
1417
1418 m_errorMonitor->VerifyNotFound();
1419
Dustin Graves40f35822016-06-23 11:12:53 -06001420 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1421 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1422 vkDestroyImageView(m_device->device(), view, NULL);
1423 vkDestroyImage(m_device->device(), image, NULL);
1424 vkFreeMemory(m_device->device(), image_memory, NULL);
1425 }
1426
1427 // Buffer Case
1428 {
1429 m_errorMonitor->ExpectSuccess();
1430
1431 VkBuffer buffer;
1432 uint32_t queue_family_index = 0;
1433 VkBufferCreateInfo buffer_create_info = {};
1434 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1435 buffer_create_info.size = 1024;
1436 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1437 buffer_create_info.queueFamilyIndexCount = 1;
1438 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1439
1440 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1441 NULL, &buffer);
1442 ASSERT_VK_SUCCESS(err);
1443
1444 VkMemoryRequirements memory_reqs;
1445 VkDeviceMemory buffer_memory;
1446 bool pass;
1447 VkMemoryAllocateInfo memory_info = {};
1448 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1449 memory_info.pNext = NULL;
1450 memory_info.allocationSize = 0;
1451 memory_info.memoryTypeIndex = 0;
1452
1453 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1454 memory_info.allocationSize = memory_reqs.size;
1455 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1456 &memory_info, 0);
1457 ASSERT_TRUE(pass);
1458
1459 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1460 &buffer_memory);
1461 ASSERT_VK_SUCCESS(err);
1462 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1463 ASSERT_VK_SUCCESS(err);
1464
1465 VkDescriptorPoolSize ds_type_count = {};
1466 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1467 ds_type_count.descriptorCount = 1;
1468
1469 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1470 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1471 ds_pool_ci.pNext = NULL;
1472 ds_pool_ci.maxSets = 1;
1473 ds_pool_ci.poolSizeCount = 1;
1474 ds_pool_ci.pPoolSizes = &ds_type_count;
1475
1476 VkDescriptorPool ds_pool;
1477 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1478 &ds_pool);
1479 ASSERT_VK_SUCCESS(err);
1480
1481 VkDescriptorSetLayoutBinding dsl_binding = {};
1482 dsl_binding.binding = 0;
1483 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1484 dsl_binding.descriptorCount = 1;
1485 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1486 dsl_binding.pImmutableSamplers = NULL;
1487
1488 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1489 ds_layout_ci.sType =
1490 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1491 ds_layout_ci.pNext = NULL;
1492 ds_layout_ci.bindingCount = 1;
1493 ds_layout_ci.pBindings = &dsl_binding;
1494 VkDescriptorSetLayout ds_layout;
1495 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1496 NULL, &ds_layout);
1497 ASSERT_VK_SUCCESS(err);
1498
1499 VkDescriptorSet descriptor_set;
1500 VkDescriptorSetAllocateInfo alloc_info = {};
1501 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1502 alloc_info.descriptorSetCount = 1;
1503 alloc_info.descriptorPool = ds_pool;
1504 alloc_info.pSetLayouts = &ds_layout;
1505 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1506 &descriptor_set);
1507 ASSERT_VK_SUCCESS(err);
1508
1509 VkDescriptorBufferInfo buffer_info = {};
1510 buffer_info.buffer = buffer;
1511 buffer_info.offset = 0;
1512 buffer_info.range = 1024;
1513
1514 VkWriteDescriptorSet descriptor_write;
1515 memset(&descriptor_write, 0, sizeof(descriptor_write));
1516 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1517 descriptor_write.dstSet = descriptor_set;
1518 descriptor_write.dstBinding = 0;
1519 descriptor_write.descriptorCount = 1;
1520 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1521 descriptor_write.pBufferInfo = &buffer_info;
1522
1523 // Set pImageInfo and pTexelBufferView to invalid values, which should
1524 // be
1525 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
1526 // This will most likely produce a crash if the parameter_validation
1527 // layer
1528 // does not correctly ignore pImageInfo.
1529 descriptor_write.pImageInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001530 reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001531 descriptor_write.pTexelBufferView =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001532 reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001533
1534 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1535 NULL);
1536
1537 m_errorMonitor->VerifyNotFound();
1538
1539 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1540 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1541 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1542 vkDestroyBuffer(m_device->device(), buffer, NULL);
1543 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1544 }
1545
1546 // Texel Buffer Case
1547 {
1548 m_errorMonitor->ExpectSuccess();
1549
1550 VkBuffer buffer;
1551 uint32_t queue_family_index = 0;
1552 VkBufferCreateInfo buffer_create_info = {};
1553 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1554 buffer_create_info.size = 1024;
1555 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
1556 buffer_create_info.queueFamilyIndexCount = 1;
1557 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1558
1559 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1560 NULL, &buffer);
1561 ASSERT_VK_SUCCESS(err);
1562
1563 VkMemoryRequirements memory_reqs;
1564 VkDeviceMemory buffer_memory;
1565 bool pass;
1566 VkMemoryAllocateInfo memory_info = {};
1567 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1568 memory_info.pNext = NULL;
1569 memory_info.allocationSize = 0;
1570 memory_info.memoryTypeIndex = 0;
1571
1572 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1573 memory_info.allocationSize = memory_reqs.size;
1574 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1575 &memory_info, 0);
1576 ASSERT_TRUE(pass);
1577
1578 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1579 &buffer_memory);
1580 ASSERT_VK_SUCCESS(err);
1581 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1582 ASSERT_VK_SUCCESS(err);
1583
1584 VkBufferViewCreateInfo buff_view_ci = {};
1585 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
1586 buff_view_ci.buffer = buffer;
1587 buff_view_ci.format = VK_FORMAT_R8_UNORM;
1588 buff_view_ci.range = VK_WHOLE_SIZE;
1589 VkBufferView buffer_view;
1590 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL,
1591 &buffer_view);
1592
1593 VkDescriptorPoolSize ds_type_count = {};
1594 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1595 ds_type_count.descriptorCount = 1;
1596
1597 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1598 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1599 ds_pool_ci.pNext = NULL;
1600 ds_pool_ci.maxSets = 1;
1601 ds_pool_ci.poolSizeCount = 1;
1602 ds_pool_ci.pPoolSizes = &ds_type_count;
1603
1604 VkDescriptorPool ds_pool;
1605 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1606 &ds_pool);
1607 ASSERT_VK_SUCCESS(err);
1608
1609 VkDescriptorSetLayoutBinding dsl_binding = {};
1610 dsl_binding.binding = 0;
1611 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1612 dsl_binding.descriptorCount = 1;
1613 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1614 dsl_binding.pImmutableSamplers = NULL;
1615
1616 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1617 ds_layout_ci.sType =
1618 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1619 ds_layout_ci.pNext = NULL;
1620 ds_layout_ci.bindingCount = 1;
1621 ds_layout_ci.pBindings = &dsl_binding;
1622 VkDescriptorSetLayout ds_layout;
1623 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1624 NULL, &ds_layout);
1625 ASSERT_VK_SUCCESS(err);
1626
1627 VkDescriptorSet descriptor_set;
1628 VkDescriptorSetAllocateInfo alloc_info = {};
1629 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1630 alloc_info.descriptorSetCount = 1;
1631 alloc_info.descriptorPool = ds_pool;
1632 alloc_info.pSetLayouts = &ds_layout;
1633 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1634 &descriptor_set);
1635 ASSERT_VK_SUCCESS(err);
1636
1637 VkWriteDescriptorSet descriptor_write;
1638 memset(&descriptor_write, 0, sizeof(descriptor_write));
1639 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1640 descriptor_write.dstSet = descriptor_set;
1641 descriptor_write.dstBinding = 0;
1642 descriptor_write.descriptorCount = 1;
1643 descriptor_write.descriptorType =
1644 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1645 descriptor_write.pTexelBufferView = &buffer_view;
1646
1647 // Set pImageInfo and pBufferInfo to invalid values, which should be
1648 // ignored for descriptorType ==
1649 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
1650 // This will most likely produce a crash if the parameter_validation
1651 // layer
1652 // does not correctly ignore pImageInfo and pBufferInfo.
1653 descriptor_write.pImageInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001654 reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001655 descriptor_write.pBufferInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001656 reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001657
1658 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1659 NULL);
1660
1661 m_errorMonitor->VerifyNotFound();
1662
1663 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1664 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1665 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1666 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
1667 vkDestroyBuffer(m_device->device(), buffer, NULL);
1668 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1669 }
1670}
Cortd889ff92016-07-27 09:51:27 -07001671
1672TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1673 VkResult err;
1674
1675 TEST_DESCRIPTION("Attempt to use a non-solid polygon fill mode in a "
1676 "pipeline when this feature is not enabled.");
1677
1678 ASSERT_NO_FATAL_FAILURE(InitState());
1679 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1680
1681 std::vector<const char *> device_extension_names;
1682 auto features = m_device->phy().features();
1683 // Artificially disable support for non-solid fill modes
1684 features.fillModeNonSolid = false;
1685 // The sacrificial device object
1686 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1687
1688 VkRenderpassObj render_pass(&test_device);
1689
1690 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1691 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1692 pipeline_layout_ci.setLayoutCount = 0;
1693 pipeline_layout_ci.pSetLayouts = NULL;
1694
1695 VkPipelineLayout pipeline_layout;
1696 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL,
1697 &pipeline_layout);
1698 ASSERT_VK_SUCCESS(err);
1699
1700 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1701 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1702 rs_ci.pNext = nullptr;
1703 rs_ci.lineWidth = 1.0f;
1704 rs_ci.rasterizerDiscardEnable = true;
1705
1706 VkShaderObj vs(&test_device, bindStateVertShaderText,
1707 VK_SHADER_STAGE_VERTEX_BIT, this);
1708 VkShaderObj fs(&test_device, bindStateFragShaderText,
1709 VK_SHADER_STAGE_FRAGMENT_BIT, this);
1710
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001711 // Set polygonMode to unsupported value POINT, should fail
Cortd889ff92016-07-27 09:51:27 -07001712 m_errorMonitor->SetDesiredFailureMsg(
1713 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1714 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
1715 {
1716 VkPipelineObj pipe(&test_device);
1717 pipe.AddShader(&vs);
1718 pipe.AddShader(&fs);
1719 pipe.AddColorAttachment();
1720 // Introduce failure by setting unsupported polygon mode
1721 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1722 pipe.SetRasterization(&rs_ci);
1723 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1724 }
1725 m_errorMonitor->VerifyFound();
1726
1727 // Try again with polygonMode=LINE, should fail
1728 m_errorMonitor->SetDesiredFailureMsg(
1729 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1730 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
1731 {
1732 VkPipelineObj pipe(&test_device);
1733 pipe.AddShader(&vs);
1734 pipe.AddShader(&fs);
1735 pipe.AddColorAttachment();
1736 // Introduce failure by setting unsupported polygon mode
1737 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1738 pipe.SetRasterization(&rs_ci);
1739 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1740 }
1741 m_errorMonitor->VerifyFound();
1742
1743 // Try again with polygonMode=FILL. No error is expected
1744 m_errorMonitor->ExpectSuccess();
1745 {
1746 VkPipelineObj pipe(&test_device);
1747 pipe.AddShader(&vs);
1748 pipe.AddShader(&fs);
1749 pipe.AddColorAttachment();
1750 // Set polygonMode to a good value
1751 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
1752 pipe.SetRasterization(&rs_ci);
1753 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1754 }
1755 m_errorMonitor->VerifyNotFound();
1756
1757 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1758}
1759
Dustin Gravesffa90fa2016-05-06 11:20:38 -06001760#endif // PARAMETER_VALIDATION_TESTS
1761
Tobin Ehlis0788f522015-05-26 16:11:58 -06001762#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001763#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001764TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001765{
1766 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001767 VkFenceCreateInfo fenceInfo = {};
1768 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1769 fenceInfo.pNext = NULL;
1770 fenceInfo.flags = 0;
1771
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001772 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001773
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001774 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001775
1776 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1777 vk_testing::Buffer buffer;
1778 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001779
Tony Barbourfe3351b2015-07-28 10:17:20 -06001780 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001781 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001782 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001783
1784 testFence.init(*m_device, fenceInfo);
1785
1786 // Bypass framework since it does the waits automatically
1787 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001788 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001789 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1790 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001791 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001792 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001793 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001794 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001795 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001796 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001797 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001798
1799 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001800 ASSERT_VK_SUCCESS( err );
1801
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001802 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001803 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001804
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001805 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001806}
1807
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001808TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001809{
1810 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001811 VkFenceCreateInfo fenceInfo = {};
1812 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1813 fenceInfo.pNext = NULL;
1814 fenceInfo.flags = 0;
1815
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001817
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001818 ASSERT_NO_FATAL_FAILURE(InitState());
1819 ASSERT_NO_FATAL_FAILURE(InitViewport());
1820 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1821
Tony Barbourfe3351b2015-07-28 10:17:20 -06001822 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001823 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001824 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001825
1826 testFence.init(*m_device, fenceInfo);
1827
1828 // Bypass framework since it does the waits automatically
1829 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001830 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001831 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1832 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001833 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001834 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001835 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001836 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001837 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001838 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001839 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001840
1841 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001842 ASSERT_VK_SUCCESS( err );
1843
Jon Ashburnf19916e2016-01-11 13:12:43 -07001844 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001845 VkCommandBufferBeginInfo info = {};
1846 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1847 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001848 info.renderPass = VK_NULL_HANDLE;
1849 info.subpass = 0;
1850 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001851 info.occlusionQueryEnable = VK_FALSE;
1852 info.queryFlags = 0;
1853 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001854
1855 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001856 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001857
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001858 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001859}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001860#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001861
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001862// This is a positive test. No failures are expected.
1863TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
1864 VkResult err;
1865 bool pass;
1866
1867 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
1868 "the buffer, create an image, and bind the same memory to "
1869 "it");
1870
1871 m_errorMonitor->ExpectSuccess();
1872
1873 ASSERT_NO_FATAL_FAILURE(InitState());
1874
1875 VkBuffer buffer;
1876 VkImage image;
1877 VkDeviceMemory mem;
1878 VkMemoryRequirements mem_reqs;
1879
1880 VkBufferCreateInfo buf_info = {};
1881 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1882 buf_info.pNext = NULL;
1883 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1884 buf_info.size = 256;
1885 buf_info.queueFamilyIndexCount = 0;
1886 buf_info.pQueueFamilyIndices = NULL;
1887 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1888 buf_info.flags = 0;
1889 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1890 ASSERT_VK_SUCCESS(err);
1891
1892 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1893
1894 VkMemoryAllocateInfo alloc_info = {};
1895 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1896 alloc_info.pNext = NULL;
1897 alloc_info.memoryTypeIndex = 0;
1898
1899 // Ensure memory is big enough for both bindings
1900 alloc_info.allocationSize = 0x10000;
1901
1902 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1903 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1904 if (!pass) {
1905 vkDestroyBuffer(m_device->device(), buffer, NULL);
1906 return;
1907 }
1908
1909 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1910 ASSERT_VK_SUCCESS(err);
1911
1912 uint8_t *pData;
1913 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1914 (void **)&pData);
1915 ASSERT_VK_SUCCESS(err);
1916
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001917 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001918
1919 vkUnmapMemory(m_device->device(), mem);
1920
1921 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1922 ASSERT_VK_SUCCESS(err);
1923
1924 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1925 // memory. In fact, it was never used by the GPU.
1926 // Just be be sure, wait for idle.
1927 vkDestroyBuffer(m_device->device(), buffer, NULL);
1928 vkDeviceWaitIdle(m_device->device());
1929
1930 VkImageCreateInfo image_create_info = {};
1931 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1932 image_create_info.pNext = NULL;
1933 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1934 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1935 image_create_info.extent.width = 64;
1936 image_create_info.extent.height = 64;
1937 image_create_info.extent.depth = 1;
1938 image_create_info.mipLevels = 1;
1939 image_create_info.arrayLayers = 1;
1940 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1941 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1942 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1943 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1944 image_create_info.queueFamilyIndexCount = 0;
1945 image_create_info.pQueueFamilyIndices = NULL;
1946 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1947 image_create_info.flags = 0;
1948
1949 VkMemoryAllocateInfo mem_alloc = {};
1950 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1951 mem_alloc.pNext = NULL;
1952 mem_alloc.allocationSize = 0;
1953 mem_alloc.memoryTypeIndex = 0;
1954
1955 /* Create a mappable image. It will be the texture if linear images are ok
1956 * to be textures or it will be the staging image if they are not.
1957 */
1958 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1959 ASSERT_VK_SUCCESS(err);
1960
1961 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1962
1963 mem_alloc.allocationSize = mem_reqs.size;
1964
1965 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
1966 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1967 if (!pass) {
1968 vkDestroyImage(m_device->device(), image, NULL);
1969 return;
1970 }
1971
Tobin Ehlis077ded32016-05-12 17:39:13 -06001972 // VALIDATION FAILURE:
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001973 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1974 ASSERT_VK_SUCCESS(err);
1975
1976 m_errorMonitor->VerifyNotFound();
1977
Tony Barbourdf4c0042016-06-01 15:55:43 -06001978 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001979 vkDestroyBuffer(m_device->device(), buffer, NULL);
1980 vkDestroyImage(m_device->device(), image, NULL);
1981}
1982
Tobin Ehlisf11be982016-05-11 13:52:53 -06001983TEST_F(VkLayerTest, InvalidMemoryAliasing) {
1984 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
1985 "buffer and image to memory such that they will alias.");
1986 VkResult err;
1987 bool pass;
1988 ASSERT_NO_FATAL_FAILURE(InitState());
1989
Tobin Ehlis077ded32016-05-12 17:39:13 -06001990 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001991 VkImage image;
1992 VkDeviceMemory mem; // buffer will be bound first
1993 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001994 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001995
1996 VkBufferCreateInfo buf_info = {};
1997 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1998 buf_info.pNext = NULL;
1999 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2000 buf_info.size = 256;
2001 buf_info.queueFamilyIndexCount = 0;
2002 buf_info.pQueueFamilyIndices = NULL;
2003 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2004 buf_info.flags = 0;
2005 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
2006 ASSERT_VK_SUCCESS(err);
2007
Tobin Ehlis077ded32016-05-12 17:39:13 -06002008 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002009
2010 VkImageCreateInfo image_create_info = {};
2011 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2012 image_create_info.pNext = NULL;
2013 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2014 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
2015 image_create_info.extent.width = 64;
2016 image_create_info.extent.height = 64;
2017 image_create_info.extent.depth = 1;
2018 image_create_info.mipLevels = 1;
2019 image_create_info.arrayLayers = 1;
2020 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06002021 // Image tiling must be optimal to trigger error when aliasing linear buffer
2022 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06002023 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
2024 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
2025 image_create_info.queueFamilyIndexCount = 0;
2026 image_create_info.pQueueFamilyIndices = NULL;
2027 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2028 image_create_info.flags = 0;
2029
Tobin Ehlisf11be982016-05-11 13:52:53 -06002030 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2031 ASSERT_VK_SUCCESS(err);
2032
Tobin Ehlis077ded32016-05-12 17:39:13 -06002033 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
2034
2035 VkMemoryAllocateInfo alloc_info = {};
2036 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2037 alloc_info.pNext = NULL;
2038 alloc_info.memoryTypeIndex = 0;
2039 // Ensure memory is big enough for both bindings
2040 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
2041 pass = m_device->phy().set_memory_type(
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06002042 buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
2043 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002044 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06002045 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002046 vkDestroyImage(m_device->device(), image, NULL);
2047 return;
2048 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06002049 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2050 ASSERT_VK_SUCCESS(err);
2051 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
2052 ASSERT_VK_SUCCESS(err);
2053
Tobin Ehlisf11be982016-05-11 13:52:53 -06002054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06002055 " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06002056 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06002057 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2058 m_errorMonitor->VerifyFound();
2059
2060 // Now correctly bind image to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06002061 // aliasing buffer2
2062 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
2063 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002064 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
2065 ASSERT_VK_SUCCESS(err);
2066 err = vkBindImageMemory(m_device->device(), image, mem_img, 0);
2067 ASSERT_VK_SUCCESS(err);
2068 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06002069 "is aliased with non-linear image 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06002070 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002071 m_errorMonitor->VerifyFound();
2072
2073 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06002074 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002075 vkDestroyImage(m_device->device(), image, NULL);
2076 vkFreeMemory(m_device->device(), mem, NULL);
2077 vkFreeMemory(m_device->device(), mem_img, NULL);
2078}
2079
Tobin Ehlis35372522016-05-12 08:32:31 -06002080TEST_F(VkLayerTest, InvalidMemoryMapping) {
2081 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
2082 VkResult err;
2083 bool pass;
2084 ASSERT_NO_FATAL_FAILURE(InitState());
2085
2086 VkBuffer buffer;
2087 VkDeviceMemory mem;
2088 VkMemoryRequirements mem_reqs;
2089
2090 VkBufferCreateInfo buf_info = {};
2091 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2092 buf_info.pNext = NULL;
2093 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2094 buf_info.size = 256;
2095 buf_info.queueFamilyIndexCount = 0;
2096 buf_info.pQueueFamilyIndices = NULL;
2097 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2098 buf_info.flags = 0;
2099 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
2100 ASSERT_VK_SUCCESS(err);
2101
2102 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
2103 VkMemoryAllocateInfo alloc_info = {};
2104 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2105 alloc_info.pNext = NULL;
2106 alloc_info.memoryTypeIndex = 0;
2107
2108 // Ensure memory is big enough for both bindings
2109 static const VkDeviceSize allocation_size = 0x10000;
2110 alloc_info.allocationSize = allocation_size;
2111 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2112 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2113 if (!pass) {
2114 vkDestroyBuffer(m_device->device(), buffer, NULL);
2115 return;
2116 }
2117 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2118 ASSERT_VK_SUCCESS(err);
2119
2120 uint8_t *pData;
2121 // Attempt to map memory size 0 is invalid
2122 m_errorMonitor->SetDesiredFailureMsg(
2123 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2124 "VkMapMemory: Attempting to map memory range of size zero");
2125 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
2126 m_errorMonitor->VerifyFound();
2127 // Map memory twice
2128 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2129 (void **)&pData);
2130 ASSERT_VK_SUCCESS(err);
2131 m_errorMonitor->SetDesiredFailureMsg(
2132 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2133 "VkMapMemory: Attempting to map memory on an already-mapped object ");
2134 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2135 (void **)&pData);
2136 m_errorMonitor->VerifyFound();
2137
2138 // Unmap the memory to avoid re-map error
2139 vkUnmapMemory(m_device->device(), mem);
2140 // overstep allocation with VK_WHOLE_SIZE
2141 m_errorMonitor->SetDesiredFailureMsg(
2142 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2143 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
2144 err = vkMapMemory(m_device->device(), mem, allocation_size + 1,
2145 VK_WHOLE_SIZE, 0, (void **)&pData);
2146 m_errorMonitor->VerifyFound();
2147 // overstep allocation w/o VK_WHOLE_SIZE
2148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2149 " oversteps total array size 0x");
2150 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0,
2151 (void **)&pData);
2152 m_errorMonitor->VerifyFound();
2153 // Now error due to unmapping memory that's not mapped
2154 m_errorMonitor->SetDesiredFailureMsg(
2155 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2156 "Unmapping Memory without memory being mapped: ");
2157 vkUnmapMemory(m_device->device(), mem);
2158 m_errorMonitor->VerifyFound();
2159 // Now map memory and cause errors due to flushing invalid ranges
2160 err = vkMapMemory(m_device->device(), mem, 16, VK_WHOLE_SIZE, 0,
2161 (void **)&pData);
2162 ASSERT_VK_SUCCESS(err);
2163 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12002164 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06002165 mmr.memory = mem;
2166 mmr.offset = 15; // Error b/c offset less than offset of mapped mem
2167 m_errorMonitor->SetDesiredFailureMsg(
2168 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2169 ") is less than Memory Object's offset (");
2170 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2171 m_errorMonitor->VerifyFound();
2172 // Now flush range that oversteps mapped range
2173 vkUnmapMemory(m_device->device(), mem);
2174 err = vkMapMemory(m_device->device(), mem, 0, 256, 0, (void **)&pData);
2175 ASSERT_VK_SUCCESS(err);
2176 mmr.offset = 16;
2177 mmr.size = 256; // flushing bounds (272) exceed mapped bounds (256)
2178 m_errorMonitor->SetDesiredFailureMsg(
2179 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2180 ") exceeds the Memory Object's upper-bound (");
2181 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2182 m_errorMonitor->VerifyFound();
2183
2184 pass =
2185 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2186 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
2187 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
2188 if (!pass) {
2189 vkFreeMemory(m_device->device(), mem, NULL);
2190 vkDestroyBuffer(m_device->device(), buffer, NULL);
2191 return;
2192 }
2193 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
2194 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
2195
2196 vkDestroyBuffer(m_device->device(), buffer, NULL);
2197 vkFreeMemory(m_device->device(), mem, NULL);
2198}
2199
Ian Elliott1c32c772016-04-28 14:47:13 -06002200TEST_F(VkLayerTest, EnableWsiBeforeUse) {
2201 VkResult err;
2202 bool pass;
2203
Ian Elliott489eec02016-05-05 14:12:44 -06002204// FIXME: After we turn on this code for non-Linux platforms, uncomment the
2205// following declaration (which is temporarily being moved below):
2206// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002207 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2208 VkSwapchainCreateInfoKHR swapchain_create_info = {};
2209 uint32_t swapchain_image_count = 0;
2210// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2211 uint32_t image_index = 0;
2212// VkPresentInfoKHR present_info = {};
2213
2214 ASSERT_NO_FATAL_FAILURE(InitState());
2215
Ian Elliott3f06ce52016-04-29 14:46:21 -06002216#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
2217#if defined(VK_USE_PLATFORM_ANDROID_KHR)
2218 // Use the functions from the VK_KHR_android_surface extension without
2219 // enabling that extension:
2220
2221 // Create a surface:
2222 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002223 m_errorMonitor->SetDesiredFailureMsg(
2224 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2225 "extension was not enabled for this");
2226 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
2227 &surface);
2228 pass = (err != VK_SUCCESS);
2229 ASSERT_TRUE(pass);
2230 m_errorMonitor->VerifyFound();
2231#endif // VK_USE_PLATFORM_ANDROID_KHR
2232
2233
2234#if defined(VK_USE_PLATFORM_MIR_KHR)
2235 // Use the functions from the VK_KHR_mir_surface extension without enabling
2236 // that extension:
2237
2238 // Create a surface:
2239 VkMirSurfaceCreateInfoKHR mir_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002240 m_errorMonitor->SetDesiredFailureMsg(
2241 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2242 "extension was not enabled for this");
2243 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
2244 pass = (err != VK_SUCCESS);
2245 ASSERT_TRUE(pass);
2246 m_errorMonitor->VerifyFound();
2247
2248 // Tell whether an mir_connection supports presentation:
2249 MirConnection *mir_connection = NULL;
2250 m_errorMonitor->SetDesiredFailureMsg(
2251 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2252 "extension was not enabled for this");
2253 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
2254 visual_id);
2255 m_errorMonitor->VerifyFound();
2256#endif // VK_USE_PLATFORM_MIR_KHR
2257
2258
2259#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
2260 // Use the functions from the VK_KHR_wayland_surface extension without
2261 // enabling that extension:
2262
2263 // Create a surface:
2264 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002265 m_errorMonitor->SetDesiredFailureMsg(
2266 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2267 "extension was not enabled for this");
2268 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
2269 &surface);
2270 pass = (err != VK_SUCCESS);
2271 ASSERT_TRUE(pass);
2272 m_errorMonitor->VerifyFound();
2273
2274 // Tell whether an wayland_display supports presentation:
2275 struct wl_display wayland_display = {};
2276 m_errorMonitor->SetDesiredFailureMsg(
2277 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2278 "extension was not enabled for this");
2279 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
2280 &wayland_display);
2281 m_errorMonitor->VerifyFound();
2282#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06002283#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06002284
2285
2286#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002287// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2288// TO NON-LINUX PLATFORMS:
2289VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06002290 // Use the functions from the VK_KHR_win32_surface extension without
2291 // enabling that extension:
2292
2293 // Create a surface:
2294 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002295 m_errorMonitor->SetDesiredFailureMsg(
2296 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2297 "extension was not enabled for this");
2298 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
2299 &surface);
2300 pass = (err != VK_SUCCESS);
2301 ASSERT_TRUE(pass);
2302 m_errorMonitor->VerifyFound();
2303
2304 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002305 m_errorMonitor->SetDesiredFailureMsg(
2306 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2307 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06002308 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002309 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002310// Set this (for now, until all platforms are supported and tested):
2311#define NEED_TO_TEST_THIS_ON_PLATFORM
2312#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06002313
2314
Ian Elliott1c32c772016-04-28 14:47:13 -06002315#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002316// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2317// TO NON-LINUX PLATFORMS:
2318VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002319 // Use the functions from the VK_KHR_xcb_surface extension without enabling
2320 // that extension:
2321
2322 // Create a surface:
2323 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06002324 m_errorMonitor->SetDesiredFailureMsg(
2325 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2326 "extension was not enabled for this");
2327 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2328 pass = (err != VK_SUCCESS);
2329 ASSERT_TRUE(pass);
2330 m_errorMonitor->VerifyFound();
2331
2332 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002333 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002334 xcb_visualid_t visual_id = 0;
2335 m_errorMonitor->SetDesiredFailureMsg(
2336 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2337 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06002338 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06002339 visual_id);
2340 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002341// Set this (for now, until all platforms are supported and tested):
2342#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002343#endif // VK_USE_PLATFORM_XCB_KHR
2344
2345
Ian Elliott12630812016-04-29 14:35:43 -06002346#if defined(VK_USE_PLATFORM_XLIB_KHR)
2347 // Use the functions from the VK_KHR_xlib_surface extension without enabling
2348 // that extension:
2349
2350 // Create a surface:
2351 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
Ian Elliott12630812016-04-29 14:35:43 -06002352 m_errorMonitor->SetDesiredFailureMsg(
2353 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2354 "extension was not enabled for this");
2355 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
2356 pass = (err != VK_SUCCESS);
2357 ASSERT_TRUE(pass);
2358 m_errorMonitor->VerifyFound();
2359
2360 // Tell whether an Xlib VisualID supports presentation:
2361 Display *dpy = NULL;
2362 VisualID visual = 0;
2363 m_errorMonitor->SetDesiredFailureMsg(
2364 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2365 "extension was not enabled for this");
2366 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
2367 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002368// Set this (for now, until all platforms are supported and tested):
2369#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06002370#endif // VK_USE_PLATFORM_XLIB_KHR
2371
2372
Ian Elliott1c32c772016-04-28 14:47:13 -06002373 // Use the functions from the VK_KHR_surface extension without enabling
2374 // that extension:
2375
Ian Elliott489eec02016-05-05 14:12:44 -06002376#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002377 // Destroy a surface:
2378 m_errorMonitor->SetDesiredFailureMsg(
2379 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2380 "extension was not enabled for this");
2381 vkDestroySurfaceKHR(instance(), surface, NULL);
2382 m_errorMonitor->VerifyFound();
2383
2384 // Check if surface supports presentation:
2385 VkBool32 supported = false;
2386 m_errorMonitor->SetDesiredFailureMsg(
2387 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2388 "extension was not enabled for this");
2389 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2390 pass = (err != VK_SUCCESS);
2391 ASSERT_TRUE(pass);
2392 m_errorMonitor->VerifyFound();
2393
2394 // Check surface capabilities:
2395 VkSurfaceCapabilitiesKHR capabilities = {};
2396 m_errorMonitor->SetDesiredFailureMsg(
2397 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2398 "extension was not enabled for this");
2399 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2400 &capabilities);
2401 pass = (err != VK_SUCCESS);
2402 ASSERT_TRUE(pass);
2403 m_errorMonitor->VerifyFound();
2404
2405 // Check surface formats:
2406 uint32_t format_count = 0;
2407 VkSurfaceFormatKHR *formats = NULL;
2408 m_errorMonitor->SetDesiredFailureMsg(
2409 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2410 "extension was not enabled for this");
2411 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2412 &format_count, formats);
2413 pass = (err != VK_SUCCESS);
2414 ASSERT_TRUE(pass);
2415 m_errorMonitor->VerifyFound();
2416
2417 // Check surface present modes:
2418 uint32_t present_mode_count = 0;
2419 VkSurfaceFormatKHR *present_modes = NULL;
2420 m_errorMonitor->SetDesiredFailureMsg(
2421 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2422 "extension was not enabled for this");
2423 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2424 &present_mode_count, present_modes);
2425 pass = (err != VK_SUCCESS);
2426 ASSERT_TRUE(pass);
2427 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002428#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002429
2430
2431 // Use the functions from the VK_KHR_swapchain extension without enabling
2432 // that extension:
2433
2434 // Create a swapchain:
2435 m_errorMonitor->SetDesiredFailureMsg(
2436 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2437 "extension was not enabled for this");
2438 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2439 swapchain_create_info.pNext = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002440 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
2441 NULL, &swapchain);
2442 pass = (err != VK_SUCCESS);
2443 ASSERT_TRUE(pass);
2444 m_errorMonitor->VerifyFound();
2445
2446 // Get the images from the swapchain:
2447 m_errorMonitor->SetDesiredFailureMsg(
2448 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2449 "extension was not enabled for this");
2450 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
2451 &swapchain_image_count, NULL);
2452 pass = (err != VK_SUCCESS);
2453 ASSERT_TRUE(pass);
2454 m_errorMonitor->VerifyFound();
2455
2456 // Try to acquire an image:
2457 m_errorMonitor->SetDesiredFailureMsg(
2458 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2459 "extension was not enabled for this");
2460 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
2461 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
2462 pass = (err != VK_SUCCESS);
2463 ASSERT_TRUE(pass);
2464 m_errorMonitor->VerifyFound();
2465
2466 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002467 //
2468 // NOTE: Currently can't test this because a real swapchain is needed (as
2469 // opposed to the fake one we created) in order for the layer to lookup the
2470 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06002471
2472 // Destroy the swapchain:
2473 m_errorMonitor->SetDesiredFailureMsg(
2474 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2475 "extension was not enabled for this");
2476 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
2477 m_errorMonitor->VerifyFound();
2478}
2479
Ian Elliott2c1daf52016-05-12 09:41:46 -06002480TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
Ian Elliott2c1daf52016-05-12 09:41:46 -06002481
Dustin Graves6c6d8982016-05-17 10:09:21 -06002482#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott2c1daf52016-05-12 09:41:46 -06002483 VkSurfaceKHR surface = VK_NULL_HANDLE;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002484
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002485 VkResult err;
2486 bool pass;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002487 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2488 VkSwapchainCreateInfoKHR swapchain_create_info = {};
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002489 // uint32_t swapchain_image_count = 0;
2490 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2491 // uint32_t image_index = 0;
2492 // VkPresentInfoKHR present_info = {};
Ian Elliott2c1daf52016-05-12 09:41:46 -06002493
2494 ASSERT_NO_FATAL_FAILURE(InitState());
2495
2496 // Use the create function from one of the VK_KHR_*_surface extension in
2497 // order to create a surface, testing all known errors in the process,
2498 // before successfully creating a surface:
2499 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002501 "required parameter pCreateInfo specified as NULL");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002502 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
2503 pass = (err != VK_SUCCESS);
2504 ASSERT_TRUE(pass);
2505 m_errorMonitor->VerifyFound();
2506
2507 // Next, try to create a surface with the wrong
2508 // VkXcbSurfaceCreateInfoKHR::sType:
2509 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
2510 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002511 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002512 "parameter pCreateInfo->sType must be");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002513 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2514 pass = (err != VK_SUCCESS);
2515 ASSERT_TRUE(pass);
2516 m_errorMonitor->VerifyFound();
2517
Ian Elliott2c1daf52016-05-12 09:41:46 -06002518 // Create a native window, and then correctly create a surface:
2519 xcb_connection_t *connection;
2520 xcb_screen_t *screen;
2521 xcb_window_t xcb_window;
2522 xcb_intern_atom_reply_t *atom_wm_delete_window;
2523
2524 const xcb_setup_t *setup;
2525 xcb_screen_iterator_t iter;
2526 int scr;
2527 uint32_t value_mask, value_list[32];
2528 int width = 1;
2529 int height = 1;
2530
2531 connection = xcb_connect(NULL, &scr);
2532 ASSERT_TRUE(connection != NULL);
2533 setup = xcb_get_setup(connection);
2534 iter = xcb_setup_roots_iterator(setup);
2535 while (scr-- > 0)
2536 xcb_screen_next(&iter);
2537 screen = iter.data;
2538
2539 xcb_window = xcb_generate_id(connection);
2540
2541 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
2542 value_list[0] = screen->black_pixel;
2543 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE |
2544 XCB_EVENT_MASK_STRUCTURE_NOTIFY;
2545
2546 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window,
2547 screen->root, 0, 0, width, height, 0,
2548 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual,
2549 value_mask, value_list);
2550
2551 /* Magic code that will send notification when window is destroyed */
2552 xcb_intern_atom_cookie_t cookie =
2553 xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
2554 xcb_intern_atom_reply_t *reply =
2555 xcb_intern_atom_reply(connection, cookie, 0);
2556
2557 xcb_intern_atom_cookie_t cookie2 =
2558 xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002559 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002560 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window,
2561 (*reply).atom, 4, 32, 1,
2562 &(*atom_wm_delete_window).atom);
2563 free(reply);
2564
2565 xcb_map_window(connection, xcb_window);
2566
2567 // Force the x/y coordinates to 100,100 results are identical in consecutive
2568 // runs
2569 const uint32_t coords[] = {100, 100};
2570 xcb_configure_window(connection, xcb_window,
2571 XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
2572
Ian Elliott2c1daf52016-05-12 09:41:46 -06002573 // Finally, try to correctly create a surface:
2574 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
2575 xcb_create_info.pNext = NULL;
2576 xcb_create_info.flags = 0;
2577 xcb_create_info.connection = connection;
2578 xcb_create_info.window = xcb_window;
2579 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2580 pass = (err == VK_SUCCESS);
2581 ASSERT_TRUE(pass);
2582
Ian Elliott2c1daf52016-05-12 09:41:46 -06002583 // Check if surface supports presentation:
2584
2585 // 1st, do so without having queried the queue families:
2586 VkBool32 supported = false;
2587 // TODO: Get the following error to come out:
2588 m_errorMonitor->SetDesiredFailureMsg(
2589 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2590 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
2591 "function");
2592 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2593 pass = (err != VK_SUCCESS);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002594 // ASSERT_TRUE(pass);
2595 // m_errorMonitor->VerifyFound();
Ian Elliott2c1daf52016-05-12 09:41:46 -06002596
2597 // Next, query a queue family index that's too large:
2598 m_errorMonitor->SetDesiredFailureMsg(
2599 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2600 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002601 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface,
2602 &supported);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002603 pass = (err != VK_SUCCESS);
2604 ASSERT_TRUE(pass);
2605 m_errorMonitor->VerifyFound();
2606
2607 // Finally, do so correctly:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002608 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2609 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002610 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2611 pass = (err == VK_SUCCESS);
2612 ASSERT_TRUE(pass);
2613
Ian Elliott2c1daf52016-05-12 09:41:46 -06002614 // Before proceeding, try to create a swapchain without having called
2615 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
2616 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2617 swapchain_create_info.pNext = NULL;
2618 swapchain_create_info.flags = 0;
2619 m_errorMonitor->SetDesiredFailureMsg(
2620 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2621 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002622 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2623 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002624 pass = (err != VK_SUCCESS);
2625 ASSERT_TRUE(pass);
2626 m_errorMonitor->VerifyFound();
2627
Ian Elliott2c1daf52016-05-12 09:41:46 -06002628 // Get the surface capabilities:
2629 VkSurfaceCapabilitiesKHR surface_capabilities;
2630
2631 // Do so correctly (only error logged by this entrypoint is if the
2632 // extension isn't enabled):
2633 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2634 &surface_capabilities);
2635 pass = (err == VK_SUCCESS);
2636 ASSERT_TRUE(pass);
2637
Ian Elliott2c1daf52016-05-12 09:41:46 -06002638 // Get the surface formats:
2639 uint32_t surface_format_count;
2640
2641 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002643 "required parameter pSurfaceFormatCount "
2644 "specified as NULL");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002645 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
2646 pass = (err == VK_SUCCESS);
2647 ASSERT_TRUE(pass);
2648 m_errorMonitor->VerifyFound();
2649
2650 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
2651 // correctly done a 1st try (to get the count):
2652 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski6a7e9332016-08-16 09:06:15 -06002653 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002654 "but no prior positive value has been seen for");
2655 surface_format_count = 0;
2656 vkGetPhysicalDeviceSurfaceFormatsKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002657 gpu(), surface, &surface_format_count,
2658 (VkSurfaceFormatKHR *)&surface_format_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002659 pass = (err == VK_SUCCESS);
2660 ASSERT_TRUE(pass);
2661 m_errorMonitor->VerifyFound();
2662
2663 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002664 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2665 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002666 pass = (err == VK_SUCCESS);
2667 ASSERT_TRUE(pass);
2668
2669 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002670 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(
2671 surface_format_count * sizeof(VkSurfaceFormatKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002672
2673 // Next, do a 2nd try with surface_format_count being set too high:
2674 surface_format_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2676 "that is greater than the value");
2677 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002678 surface_formats);
2679 pass = (err == VK_SUCCESS);
2680 ASSERT_TRUE(pass);
2681 m_errorMonitor->VerifyFound();
2682
2683 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002684 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2685 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002686 pass = (err == VK_SUCCESS);
2687 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002688 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002689 surface_formats);
2690 pass = (err == VK_SUCCESS);
2691 ASSERT_TRUE(pass);
2692
Ian Elliott2c1daf52016-05-12 09:41:46 -06002693 // Get the surface present modes:
2694 uint32_t surface_present_mode_count;
2695
2696 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002698 "required parameter pPresentModeCount "
2699 "specified as NULL");
2700
Ian Elliott2c1daf52016-05-12 09:41:46 -06002701 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
2702 pass = (err == VK_SUCCESS);
2703 ASSERT_TRUE(pass);
2704 m_errorMonitor->VerifyFound();
2705
2706 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
2707 // correctly done a 1st try (to get the count):
2708 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski6a7e9332016-08-16 09:06:15 -06002709 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002710 "but no prior positive value has been seen for");
2711 surface_present_mode_count = 0;
2712 vkGetPhysicalDeviceSurfacePresentModesKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002713 gpu(), surface, &surface_present_mode_count,
2714 (VkPresentModeKHR *)&surface_present_mode_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002715 pass = (err == VK_SUCCESS);
2716 ASSERT_TRUE(pass);
2717 m_errorMonitor->VerifyFound();
2718
2719 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002720 vkGetPhysicalDeviceSurfacePresentModesKHR(
2721 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002722 pass = (err == VK_SUCCESS);
2723 ASSERT_TRUE(pass);
2724
2725 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002726 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(
2727 surface_present_mode_count * sizeof(VkPresentModeKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002728
2729 // Next, do a 2nd try with surface_format_count being set too high:
2730 surface_present_mode_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2732 "that is greater than the value");
2733 vkGetPhysicalDeviceSurfacePresentModesKHR(
2734 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002735 pass = (err == VK_SUCCESS);
2736 ASSERT_TRUE(pass);
2737 m_errorMonitor->VerifyFound();
2738
2739 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002740 vkGetPhysicalDeviceSurfacePresentModesKHR(
2741 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002742 pass = (err == VK_SUCCESS);
2743 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002744 vkGetPhysicalDeviceSurfacePresentModesKHR(
2745 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002746 pass = (err == VK_SUCCESS);
2747 ASSERT_TRUE(pass);
2748
Ian Elliott2c1daf52016-05-12 09:41:46 -06002749 // Create a swapchain:
2750
2751 // First, try without a pointer to swapchain_create_info:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002753 "required parameter pCreateInfo "
2754 "specified as NULL");
2755
Ian Elliott2c1daf52016-05-12 09:41:46 -06002756 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
2757 pass = (err != VK_SUCCESS);
2758 ASSERT_TRUE(pass);
2759 m_errorMonitor->VerifyFound();
2760
2761 // Next, call with a non-NULL swapchain_create_info, that has the wrong
2762 // sType:
2763 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002765 "parameter pCreateInfo->sType must be");
2766
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002767 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2768 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002769 pass = (err != VK_SUCCESS);
2770 ASSERT_TRUE(pass);
2771 m_errorMonitor->VerifyFound();
2772
2773 // Next, call with a NULL swapchain pointer:
2774 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2775 swapchain_create_info.pNext = NULL;
2776 swapchain_create_info.flags = 0;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002778 "required parameter pSwapchain "
2779 "specified as NULL");
2780
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002781 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2782 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002783 pass = (err != VK_SUCCESS);
2784 ASSERT_TRUE(pass);
2785 m_errorMonitor->VerifyFound();
2786
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002787 // TODO: Enhance swapchain layer so that
2788 // swapchain_create_info.queueFamilyIndexCount is checked against something?
Ian Elliott2c1daf52016-05-12 09:41:46 -06002789
2790 // Next, call with a queue family index that's too large:
2791 uint32_t queueFamilyIndex[2] = {100000, 0};
2792 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2793 swapchain_create_info.queueFamilyIndexCount = 2;
2794 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
2795 m_errorMonitor->SetDesiredFailureMsg(
2796 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2797 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002798 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2799 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002800 pass = (err != VK_SUCCESS);
2801 ASSERT_TRUE(pass);
2802 m_errorMonitor->VerifyFound();
2803
2804 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
2805 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2806 swapchain_create_info.queueFamilyIndexCount = 1;
2807 m_errorMonitor->SetDesiredFailureMsg(
2808 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2809 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
2810 "pCreateInfo->pQueueFamilyIndices).");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002811 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2812 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002813 pass = (err != VK_SUCCESS);
2814 ASSERT_TRUE(pass);
2815 m_errorMonitor->VerifyFound();
2816
2817 // Next, call with an invalid imageSharingMode:
2818 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
2819 swapchain_create_info.queueFamilyIndexCount = 1;
2820 m_errorMonitor->SetDesiredFailureMsg(
2821 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2822 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002823 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2824 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002825 pass = (err != VK_SUCCESS);
2826 ASSERT_TRUE(pass);
2827 m_errorMonitor->VerifyFound();
2828 // Fix for the future:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002829 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2830 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002831 swapchain_create_info.queueFamilyIndexCount = 0;
2832 queueFamilyIndex[0] = 0;
2833 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
2834
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002835 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
Ian Elliott2c1daf52016-05-12 09:41:46 -06002836 // Get the images from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002837 // Acquire an image from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002838 // Present an image to a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002839 // Destroy the swapchain:
2840
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002841 // TODOs:
2842 //
2843 // - Try destroying the device without first destroying the swapchain
2844 //
2845 // - Try destroying the device without first destroying the surface
2846 //
2847 // - Try destroying the surface without first destroying the swapchain
Ian Elliott2c1daf52016-05-12 09:41:46 -06002848
2849 // Destroy the surface:
2850 vkDestroySurfaceKHR(instance(), surface, NULL);
2851
Ian Elliott2c1daf52016-05-12 09:41:46 -06002852 // Tear down the window:
2853 xcb_destroy_window(connection, xcb_window);
2854 xcb_disconnect(connection);
2855
2856#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002857 return;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002858#endif // VK_USE_PLATFORM_XCB_KHR
2859}
2860
Karl Schultz6addd812016-02-02 17:17:23 -07002861TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2862 VkResult err;
2863 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002864
Karl Schultz6addd812016-02-02 17:17:23 -07002865 m_errorMonitor->SetDesiredFailureMsg(
2866 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002867 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
2868
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002869 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002870
2871 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002872 VkImage image;
2873 VkDeviceMemory mem;
2874 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002875
Karl Schultz6addd812016-02-02 17:17:23 -07002876 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2877 const int32_t tex_width = 32;
2878 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002879
Tony Barboureb254902015-07-15 12:50:33 -06002880 VkImageCreateInfo image_create_info = {};
2881 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002882 image_create_info.pNext = NULL;
2883 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2884 image_create_info.format = tex_format;
2885 image_create_info.extent.width = tex_width;
2886 image_create_info.extent.height = tex_height;
2887 image_create_info.extent.depth = 1;
2888 image_create_info.mipLevels = 1;
2889 image_create_info.arrayLayers = 1;
2890 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2891 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2892 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2893 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002894
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002895 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002896 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002897 mem_alloc.pNext = NULL;
2898 mem_alloc.allocationSize = 0;
2899 // Introduce failure, do NOT set memProps to
2900 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
2901 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002902
Chia-I Wuf7458c52015-10-26 21:10:41 +08002903 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002904 ASSERT_VK_SUCCESS(err);
2905
Karl Schultz6addd812016-02-02 17:17:23 -07002906 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002907
Mark Lobodzinski23065352015-05-29 09:32:35 -05002908 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002909
Karl Schultz6addd812016-02-02 17:17:23 -07002910 pass =
2911 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
2912 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2913 if (!pass) { // If we can't find any unmappable memory this test doesn't
2914 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002915 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002916 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002917 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002918
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002919 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002920 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002921 ASSERT_VK_SUCCESS(err);
2922
2923 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002924 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002925 ASSERT_VK_SUCCESS(err);
2926
2927 // Map memory as if to initialize the image
2928 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002929 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
2930 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002931
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002932 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002933
Chia-I Wuf7458c52015-10-26 21:10:41 +08002934 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002935 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002936}
2937
Karl Schultz6addd812016-02-02 17:17:23 -07002938TEST_F(VkLayerTest, RebindMemory) {
2939 VkResult err;
2940 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002941
Karl Schultz6addd812016-02-02 17:17:23 -07002942 m_errorMonitor->SetDesiredFailureMsg(
2943 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002944 "which has already been bound to mem object");
2945
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002946 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002947
2948 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002949 VkImage image;
2950 VkDeviceMemory mem1;
2951 VkDeviceMemory mem2;
2952 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002953
Karl Schultz6addd812016-02-02 17:17:23 -07002954 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2955 const int32_t tex_width = 32;
2956 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002957
Tony Barboureb254902015-07-15 12:50:33 -06002958 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002959 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2960 image_create_info.pNext = NULL;
2961 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2962 image_create_info.format = tex_format;
2963 image_create_info.extent.width = tex_width;
2964 image_create_info.extent.height = tex_height;
2965 image_create_info.extent.depth = 1;
2966 image_create_info.mipLevels = 1;
2967 image_create_info.arrayLayers = 1;
2968 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2969 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2970 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2971 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002972
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002973 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002974 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2975 mem_alloc.pNext = NULL;
2976 mem_alloc.allocationSize = 0;
2977 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002978
Karl Schultz6addd812016-02-02 17:17:23 -07002979 // Introduce failure, do NOT set memProps to
2980 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002981 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002982 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002983 ASSERT_VK_SUCCESS(err);
2984
Karl Schultz6addd812016-02-02 17:17:23 -07002985 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002986
2987 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002988 pass =
2989 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002990 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002991
2992 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002993 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002994 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002995 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002996 ASSERT_VK_SUCCESS(err);
2997
2998 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002999 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003000 ASSERT_VK_SUCCESS(err);
3001
Karl Schultz6addd812016-02-02 17:17:23 -07003002 // Introduce validation failure, try to bind a different memory object to
3003 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06003004 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003005
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003006 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003007
Chia-I Wuf7458c52015-10-26 21:10:41 +08003008 vkDestroyImage(m_device->device(), image, NULL);
3009 vkFreeMemory(m_device->device(), mem1, NULL);
3010 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003011}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05003012
Karl Schultz6addd812016-02-02 17:17:23 -07003013TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003014 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003015
Karl Schultz6addd812016-02-02 17:17:23 -07003016 m_errorMonitor->SetDesiredFailureMsg(
3017 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
3018 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06003019
3020 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06003021 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3022 fenceInfo.pNext = NULL;
3023 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06003024
Tony Barbour300a6082015-04-07 13:44:53 -06003025 ASSERT_NO_FATAL_FAILURE(InitState());
3026 ASSERT_NO_FATAL_FAILURE(InitViewport());
3027 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3028
Tony Barbourfe3351b2015-07-28 10:17:20 -06003029 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003030 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
3031 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06003032 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06003033
3034 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06003035
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003036 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003037 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3038 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003039 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003040 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003041 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003042 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003043 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003044 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003045 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06003046
3047 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07003048 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06003049
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003050 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06003051}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003052// This is a positive test. We used to expect error in this case but spec now
3053// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07003054TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003055 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06003056 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06003057 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06003058 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3059 fenceInfo.pNext = NULL;
3060
Tony Barbour0b4d9562015-04-09 10:48:04 -06003061 ASSERT_NO_FATAL_FAILURE(InitState());
3062 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08003063 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003064 VkResult result = vkResetFences(m_device->device(), 1, fences);
3065 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06003066
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003067 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06003068}
Tobin Ehlis56ab9022016-08-17 17:59:31 -06003069#if 0 // A few devices have issues with this test so disabling for now
Chris Forbese70b7d32016-06-15 15:49:12 +12003070TEST_F(VkLayerTest, LongFenceChain)
3071{
3072 m_errorMonitor->ExpectSuccess();
3073
3074 ASSERT_NO_FATAL_FAILURE(InitState());
3075 VkResult err;
3076
3077 std::vector<VkFence> fences;
3078
3079 const int chainLength = 32768;
3080
3081 for (int i = 0; i < chainLength; i++) {
3082 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3083 VkFence fence;
3084 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3085 ASSERT_VK_SUCCESS(err);
3086
3087 fences.push_back(fence);
3088
3089 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3090 0, nullptr, 0, nullptr };
3091 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3092 ASSERT_VK_SUCCESS(err);
3093
3094 }
3095
3096 // BOOM, stack overflow.
3097 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
3098
3099 for (auto fence : fences)
3100 vkDestroyFence(m_device->device(), fence, nullptr);
3101
3102 m_errorMonitor->VerifyNotFound();
3103}
Tobin Ehlis56ab9022016-08-17 17:59:31 -06003104#endif
Chris Forbes18127d12016-06-08 16:52:28 +12003105TEST_F(VkLayerTest, CommandBufferSimultaneousUseSync)
3106{
3107 m_errorMonitor->ExpectSuccess();
3108
3109 ASSERT_NO_FATAL_FAILURE(InitState());
3110 VkResult err;
3111
3112 // Record (empty!) command buffer that can be submitted multiple times
3113 // simultaneously.
3114 VkCommandBufferBeginInfo cbbi = {
3115 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
3116 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr
3117 };
3118 m_commandBuffer->BeginCommandBuffer(&cbbi);
3119 m_commandBuffer->EndCommandBuffer();
3120
3121 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3122 VkFence fence;
3123 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3124 ASSERT_VK_SUCCESS(err);
3125
3126 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
3127 VkSemaphore s1, s2;
3128 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
3129 ASSERT_VK_SUCCESS(err);
3130 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
3131 ASSERT_VK_SUCCESS(err);
3132
3133 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
3134 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3135 1, &m_commandBuffer->handle(), 1, &s1 };
3136 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3137 ASSERT_VK_SUCCESS(err);
3138
3139 // Submit CB again, signaling s2.
3140 si.pSignalSemaphores = &s2;
3141 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
3142 ASSERT_VK_SUCCESS(err);
3143
3144 // Wait for fence.
3145 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3146 ASSERT_VK_SUCCESS(err);
3147
3148 // CB is still in flight from second submission, but semaphore s1 is no
3149 // longer in flight. delete it.
3150 vkDestroySemaphore(m_device->device(), s1, nullptr);
3151
3152 m_errorMonitor->VerifyNotFound();
3153
3154 // Force device idle and clean up remaining objects
3155 vkDeviceWaitIdle(m_device->device());
3156 vkDestroySemaphore(m_device->device(), s2, nullptr);
3157 vkDestroyFence(m_device->device(), fence, nullptr);
3158}
3159
Chris Forbes4e44c912016-06-16 10:20:00 +12003160TEST_F(VkLayerTest, FenceCreateSignaledWaitHandling)
3161{
3162 m_errorMonitor->ExpectSuccess();
3163
3164 ASSERT_NO_FATAL_FAILURE(InitState());
3165 VkResult err;
3166
3167 // A fence created signaled
3168 VkFenceCreateInfo fci1 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
3169 VkFence f1;
3170 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
3171 ASSERT_VK_SUCCESS(err);
3172
3173 // A fence created not
3174 VkFenceCreateInfo fci2 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3175 VkFence f2;
3176 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
3177 ASSERT_VK_SUCCESS(err);
3178
3179 // Submit the unsignaled fence
3180 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3181 0, nullptr, 0, nullptr };
3182 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
3183
3184 // Wait on both fences, with signaled first.
3185 VkFence fences[] = { f1, f2 };
3186 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
3187
3188 // Should have both retired!
3189 vkDestroyFence(m_device->device(), f1, nullptr);
3190 vkDestroyFence(m_device->device(), f2, nullptr);
3191
3192 m_errorMonitor->VerifyNotFound();
3193}
3194
Tobin Ehlis41376e12015-07-03 08:45:14 -06003195TEST_F(VkLayerTest, InvalidUsageBits)
3196{
Tony Barbourf92621a2016-05-02 14:28:12 -06003197 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003198 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06003199 "Initialize buffer with wrong usage then perform copy expecting errors "
3200 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003202 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06003203
3204 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06003205 VkImageObj image(m_device);
3206 // Initialize image with USAGE_INPUT_ATTACHMENT
Tobin Ehlis8b313c02016-05-25 15:01:52 -06003207 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003208 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3209 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06003210
Tony Barbourf92621a2016-05-02 14:28:12 -06003211 VkImageView dsv;
3212 VkImageViewCreateInfo dsvci = {};
3213 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3214 dsvci.image = image.handle();
3215 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3216 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
3217 dsvci.subresourceRange.layerCount = 1;
3218 dsvci.subresourceRange.baseMipLevel = 0;
3219 dsvci.subresourceRange.levelCount = 1;
3220 dsvci.subresourceRange.aspectMask =
3221 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06003222
Tony Barbourf92621a2016-05-02 14:28:12 -06003223 // Create a view with depth / stencil aspect for image with different usage
3224 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003225
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003226 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06003227
3228 // Initialize buffer with TRANSFER_DST usage
3229 vk_testing::Buffer buffer;
3230 VkMemoryPropertyFlags reqs = 0;
3231 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3232 VkBufferImageCopy region = {};
3233 region.bufferRowLength = 128;
3234 region.bufferImageHeight = 128;
3235 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3236 region.imageSubresource.layerCount = 1;
3237 region.imageExtent.height = 16;
3238 region.imageExtent.width = 16;
3239 region.imageExtent.depth = 1;
3240
3241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3242 "Invalid usage flag for buffer ");
3243 // Buffer usage not set to TRANSFER_SRC and image usage not set to
3244 // TRANSFER_DST
3245 BeginCommandBuffer();
3246 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3247 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3248 1, &region);
3249 m_errorMonitor->VerifyFound();
3250
3251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3252 "Invalid usage flag for image ");
3253 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3254 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3255 1, &region);
3256 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06003257}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003258#endif // MEM_TRACKER_TESTS
3259
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06003260#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003261
3262TEST_F(VkLayerTest, LeakAnObject) {
3263 VkResult err;
3264
3265 TEST_DESCRIPTION(
3266 "Create a fence and destroy its device without first destroying the fence.");
3267
3268 // Note that we have to create a new device since destroying the
3269 // framework's device causes Teardown() to fail and just calling Teardown
3270 // will destroy the errorMonitor.
3271
3272 m_errorMonitor->SetDesiredFailureMsg(
3273 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003274 "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003275
3276 ASSERT_NO_FATAL_FAILURE(InitState());
3277
3278 const std::vector<VkQueueFamilyProperties> queue_props =
3279 m_device->queue_props;
3280 std::vector<VkDeviceQueueCreateInfo> queue_info;
3281 queue_info.reserve(queue_props.size());
3282 std::vector<std::vector<float>> queue_priorities;
3283 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
3284 VkDeviceQueueCreateInfo qi = {};
3285 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
3286 qi.pNext = NULL;
3287 qi.queueFamilyIndex = i;
3288 qi.queueCount = queue_props[i].queueCount;
3289 queue_priorities.emplace_back(qi.queueCount, 0.0f);
3290 qi.pQueuePriorities = queue_priorities[i].data();
3291 queue_info.push_back(qi);
3292 }
3293
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003294 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003295
3296 // The sacrificial device object
3297 VkDevice testDevice;
3298 VkDeviceCreateInfo device_create_info = {};
3299 auto features = m_device->phy().features();
3300 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
3301 device_create_info.pNext = NULL;
3302 device_create_info.queueCreateInfoCount = queue_info.size();
3303 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06003304 device_create_info.enabledLayerCount = 0;
3305 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003306 device_create_info.pEnabledFeatures = &features;
3307 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
3308 ASSERT_VK_SUCCESS(err);
3309
3310 VkFence fence;
3311 VkFenceCreateInfo fence_create_info = {};
3312 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3313 fence_create_info.pNext = NULL;
3314 fence_create_info.flags = 0;
3315 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
3316 ASSERT_VK_SUCCESS(err);
3317
3318 // Induce failure by not calling vkDestroyFence
3319 vkDestroyDevice(testDevice, NULL);
3320 m_errorMonitor->VerifyFound();
3321}
3322
3323TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
3324
3325 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
3326 "attempt to delete them from another.");
3327
3328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3329 "FreeCommandBuffers is attempting to free Command Buffer");
3330
3331 VkCommandPool command_pool_one;
3332 VkCommandPool command_pool_two;
3333
3334 VkCommandPoolCreateInfo pool_create_info{};
3335 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3336 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3337 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3338
3339 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3340 &command_pool_one);
3341
3342 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3343 &command_pool_two);
3344
3345 VkCommandBuffer command_buffer[9];
3346 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3347 command_buffer_allocate_info.sType =
3348 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3349 command_buffer_allocate_info.commandPool = command_pool_one;
3350 command_buffer_allocate_info.commandBufferCount = 9;
3351 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3352 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3353 command_buffer);
3354
3355 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
3356 &command_buffer[3]);
3357
3358 m_errorMonitor->VerifyFound();
3359
3360 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
3361 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
3362}
3363
3364TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
3365 VkResult err;
3366
3367 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
3368 "attempt to delete them from another.");
3369
3370 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3371 "FreeDescriptorSets is attempting to free descriptorSet");
3372
3373 ASSERT_NO_FATAL_FAILURE(InitState());
3374 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3375
3376 VkDescriptorPoolSize ds_type_count = {};
3377 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3378 ds_type_count.descriptorCount = 1;
3379
3380 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3381 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3382 ds_pool_ci.pNext = NULL;
3383 ds_pool_ci.flags = 0;
3384 ds_pool_ci.maxSets = 1;
3385 ds_pool_ci.poolSizeCount = 1;
3386 ds_pool_ci.pPoolSizes = &ds_type_count;
3387
3388 VkDescriptorPool ds_pool_one;
3389 err =
3390 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
3391 ASSERT_VK_SUCCESS(err);
3392
3393 // Create a second descriptor pool
3394 VkDescriptorPool ds_pool_two;
3395 err =
3396 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
3397 ASSERT_VK_SUCCESS(err);
3398
3399 VkDescriptorSetLayoutBinding dsl_binding = {};
3400 dsl_binding.binding = 0;
3401 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3402 dsl_binding.descriptorCount = 1;
3403 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3404 dsl_binding.pImmutableSamplers = NULL;
3405
3406 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3407 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3408 ds_layout_ci.pNext = NULL;
3409 ds_layout_ci.bindingCount = 1;
3410 ds_layout_ci.pBindings = &dsl_binding;
3411
3412 VkDescriptorSetLayout ds_layout;
3413 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3414 &ds_layout);
3415 ASSERT_VK_SUCCESS(err);
3416
3417 VkDescriptorSet descriptorSet;
3418 VkDescriptorSetAllocateInfo alloc_info = {};
3419 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3420 alloc_info.descriptorSetCount = 1;
3421 alloc_info.descriptorPool = ds_pool_one;
3422 alloc_info.pSetLayouts = &ds_layout;
3423 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3424 &descriptorSet);
3425 ASSERT_VK_SUCCESS(err);
3426
3427 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
3428
3429 m_errorMonitor->VerifyFound();
3430
3431 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3432 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
3433 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
3434}
3435
3436TEST_F(VkLayerTest, CreateUnknownObject) {
3437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003438 "Invalid Image Object ");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003439
3440 TEST_DESCRIPTION(
3441 "Pass an invalid image object handle into a Vulkan API call.");
3442
3443 ASSERT_NO_FATAL_FAILURE(InitState());
3444
3445 // Pass bogus handle into GetImageMemoryRequirements
3446 VkMemoryRequirements mem_reqs;
3447 uint64_t fakeImageHandle = 0xCADECADE;
3448 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
3449
3450 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
3451
3452 m_errorMonitor->VerifyFound();
3453}
3454
Karl Schultz6addd812016-02-02 17:17:23 -07003455TEST_F(VkLayerTest, PipelineNotBound) {
3456 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003457
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003458 TEST_DESCRIPTION(
3459 "Pass in an invalid pipeline object handle into a Vulkan API call.");
3460
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003462 "Invalid Pipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003463
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003464 ASSERT_NO_FATAL_FAILURE(InitState());
3465 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003466
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003467 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003468 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3469 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003470
3471 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003472 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3473 ds_pool_ci.pNext = NULL;
3474 ds_pool_ci.maxSets = 1;
3475 ds_pool_ci.poolSizeCount = 1;
3476 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003477
3478 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003479 err =
3480 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003481 ASSERT_VK_SUCCESS(err);
3482
3483 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003484 dsl_binding.binding = 0;
3485 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3486 dsl_binding.descriptorCount = 1;
3487 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3488 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003489
3490 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003491 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3492 ds_layout_ci.pNext = NULL;
3493 ds_layout_ci.bindingCount = 1;
3494 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003495
3496 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003497 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3498 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003499 ASSERT_VK_SUCCESS(err);
3500
3501 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003502 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003503 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003504 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003505 alloc_info.descriptorPool = ds_pool;
3506 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003507 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3508 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003509 ASSERT_VK_SUCCESS(err);
3510
3511 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003512 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3513 pipeline_layout_ci.pNext = NULL;
3514 pipeline_layout_ci.setLayoutCount = 1;
3515 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003516
3517 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003518 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3519 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003520 ASSERT_VK_SUCCESS(err);
3521
Mark Youngad779052016-01-06 14:26:04 -07003522 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003523
3524 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003525 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3526 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003527
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003528 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003529
Chia-I Wuf7458c52015-10-26 21:10:41 +08003530 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3531 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3532 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003533}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003534
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003535TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
3536 VkResult err;
3537
3538 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
3539 "during bind[Buffer|Image]Memory time");
3540
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003541 ASSERT_NO_FATAL_FAILURE(InitState());
3542
3543 // Create an image, allocate memory, set a bad typeIndex and then try to
3544 // bind it
3545 VkImage image;
3546 VkDeviceMemory mem;
3547 VkMemoryRequirements mem_reqs;
3548 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3549 const int32_t tex_width = 32;
3550 const int32_t tex_height = 32;
3551
3552 VkImageCreateInfo image_create_info = {};
3553 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3554 image_create_info.pNext = NULL;
3555 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3556 image_create_info.format = tex_format;
3557 image_create_info.extent.width = tex_width;
3558 image_create_info.extent.height = tex_height;
3559 image_create_info.extent.depth = 1;
3560 image_create_info.mipLevels = 1;
3561 image_create_info.arrayLayers = 1;
3562 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3563 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3564 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3565 image_create_info.flags = 0;
3566
3567 VkMemoryAllocateInfo mem_alloc = {};
3568 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3569 mem_alloc.pNext = NULL;
3570 mem_alloc.allocationSize = 0;
3571 mem_alloc.memoryTypeIndex = 0;
3572
3573 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3574 ASSERT_VK_SUCCESS(err);
3575
3576 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
3577 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003578
3579 // Introduce Failure, select invalid TypeIndex
3580 VkPhysicalDeviceMemoryProperties memory_info;
3581
3582 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
3583 unsigned int i;
3584 for (i = 0; i < memory_info.memoryTypeCount; i++) {
3585 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
3586 mem_alloc.memoryTypeIndex = i;
3587 break;
3588 }
3589 }
3590 if (i >= memory_info.memoryTypeCount) {
3591 printf("No invalid memory type index could be found; skipped.\n");
3592 vkDestroyImage(m_device->device(), image, NULL);
3593 return;
3594 }
3595
3596 m_errorMonitor->SetDesiredFailureMsg(
3597 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3598 "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003599
3600 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3601 ASSERT_VK_SUCCESS(err);
3602
3603 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3604 (void)err;
3605
3606 m_errorMonitor->VerifyFound();
3607
3608 vkDestroyImage(m_device->device(), image, NULL);
3609 vkFreeMemory(m_device->device(), mem, NULL);
3610}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003611
Karl Schultz6addd812016-02-02 17:17:23 -07003612TEST_F(VkLayerTest, BindInvalidMemory) {
3613 VkResult err;
3614 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003615
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003617 "Invalid Device Memory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003618
Tobin Ehlisec598302015-09-15 15:02:17 -06003619 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003620
3621 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07003622 VkImage image;
3623 VkDeviceMemory mem;
3624 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003625
Karl Schultz6addd812016-02-02 17:17:23 -07003626 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3627 const int32_t tex_width = 32;
3628 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003629
3630 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003631 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3632 image_create_info.pNext = NULL;
3633 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3634 image_create_info.format = tex_format;
3635 image_create_info.extent.width = tex_width;
3636 image_create_info.extent.height = tex_height;
3637 image_create_info.extent.depth = 1;
3638 image_create_info.mipLevels = 1;
3639 image_create_info.arrayLayers = 1;
3640 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3641 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3642 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3643 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003644
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003645 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003646 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3647 mem_alloc.pNext = NULL;
3648 mem_alloc.allocationSize = 0;
3649 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003650
Chia-I Wuf7458c52015-10-26 21:10:41 +08003651 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003652 ASSERT_VK_SUCCESS(err);
3653
Karl Schultz6addd812016-02-02 17:17:23 -07003654 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003655
3656 mem_alloc.allocationSize = mem_reqs.size;
3657
Karl Schultz6addd812016-02-02 17:17:23 -07003658 pass =
3659 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003660 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003661
3662 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003663 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003664 ASSERT_VK_SUCCESS(err);
3665
3666 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003667 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003668
3669 // Try to bind free memory that has been freed
3670 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3671 // This may very well return an error.
3672 (void)err;
3673
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003674 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003675
Chia-I Wuf7458c52015-10-26 21:10:41 +08003676 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003677}
3678
Karl Schultz6addd812016-02-02 17:17:23 -07003679TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
3680 VkResult err;
3681 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003682
Karl Schultz6addd812016-02-02 17:17:23 -07003683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003684 "Invalid Image Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003685
Tobin Ehlisec598302015-09-15 15:02:17 -06003686 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003687
Karl Schultz6addd812016-02-02 17:17:23 -07003688 // Create an image object, allocate memory, destroy the object and then try
3689 // to bind it
3690 VkImage image;
3691 VkDeviceMemory mem;
3692 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003693
Karl Schultz6addd812016-02-02 17:17:23 -07003694 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3695 const int32_t tex_width = 32;
3696 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003697
3698 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003699 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3700 image_create_info.pNext = NULL;
3701 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3702 image_create_info.format = tex_format;
3703 image_create_info.extent.width = tex_width;
3704 image_create_info.extent.height = tex_height;
3705 image_create_info.extent.depth = 1;
3706 image_create_info.mipLevels = 1;
3707 image_create_info.arrayLayers = 1;
3708 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3709 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3710 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3711 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003712
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003713 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003714 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3715 mem_alloc.pNext = NULL;
3716 mem_alloc.allocationSize = 0;
3717 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003718
Chia-I Wuf7458c52015-10-26 21:10:41 +08003719 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003720 ASSERT_VK_SUCCESS(err);
3721
Karl Schultz6addd812016-02-02 17:17:23 -07003722 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003723
3724 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003725 pass =
3726 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003727 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003728
3729 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003730 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003731 ASSERT_VK_SUCCESS(err);
3732
3733 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003734 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003735 ASSERT_VK_SUCCESS(err);
3736
3737 // Now Try to bind memory to this destroyed object
3738 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3739 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003740 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003741
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003742 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003743
Chia-I Wuf7458c52015-10-26 21:10:41 +08003744 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003745}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003746
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003747#endif // OBJ_TRACKER_TESTS
3748
Tobin Ehlis0788f522015-05-26 16:11:58 -06003749#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003750
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003751TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003752 TEST_DESCRIPTION("Submit command buffer created using one queue family and "
3753 "attempt to submit them on a queue created in a different "
3754 "queue family.");
3755
3756 // This test is meaningless unless we have multiple queue families
3757 auto queue_family_properties = m_device->phy().queue_properties();
3758 if (queue_family_properties.size() < 2) {
3759 return;
3760 }
3761 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3762 " is being submitted on queue ");
3763 // Get safe index of another queue family
3764 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
3765 ASSERT_NO_FATAL_FAILURE(InitState());
3766 // Create a second queue using a different queue family
3767 VkQueue other_queue;
3768 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3769
3770 // Record an empty cmd buffer
3771 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3772 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3773 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3774 vkEndCommandBuffer(m_commandBuffer->handle());
3775
3776 // And submit on the wrong queue
3777 VkSubmitInfo submit_info = {};
3778 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3779 submit_info.commandBufferCount = 1;
3780 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003781 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003782
3783 m_errorMonitor->VerifyFound();
3784
3785}
3786
Chris Forbes48a53902016-06-30 11:46:27 +12003787TEST_F(VkLayerTest, RenderPassInitialLayoutUndefined) {
3788 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
3789 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
3790 "the command buffer has prior knowledge of that "
3791 "attachment's layout.");
3792
3793 m_errorMonitor->ExpectSuccess();
3794
3795 ASSERT_NO_FATAL_FAILURE(InitState());
3796
3797 // A renderpass with one color attachment.
3798 VkAttachmentDescription attachment = {
3799 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3800 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3801 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3802 VK_IMAGE_LAYOUT_UNDEFINED,
3803 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3804 };
3805
3806 VkAttachmentReference att_ref = {
3807 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3808 };
3809
3810 VkSubpassDescription subpass = {
3811 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3812 1, &att_ref, nullptr, nullptr, 0, nullptr
3813 };
3814
3815 VkRenderPassCreateInfo rpci = {
3816 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3817 0, 1, &attachment, 1, &subpass, 0, nullptr
3818 };
3819
3820 VkRenderPass rp;
3821 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3822 ASSERT_VK_SUCCESS(err);
3823
3824 // A compatible framebuffer.
3825 VkImageObj image(m_device);
3826 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3827 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3828 VK_IMAGE_TILING_OPTIMAL, 0);
3829 ASSERT_TRUE(image.initialized());
3830
3831 VkImageViewCreateInfo ivci = {
3832 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3833 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3834 {
3835 VK_COMPONENT_SWIZZLE_IDENTITY,
3836 VK_COMPONENT_SWIZZLE_IDENTITY,
3837 VK_COMPONENT_SWIZZLE_IDENTITY,
3838 VK_COMPONENT_SWIZZLE_IDENTITY
3839 },
3840 {
3841 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3842 },
3843 };
3844 VkImageView view;
3845 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3846 ASSERT_VK_SUCCESS(err);
3847
3848 VkFramebufferCreateInfo fci = {
3849 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3850 0, rp, 1, &view,
3851 32, 32, 1
3852 };
3853 VkFramebuffer fb;
3854 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3855 ASSERT_VK_SUCCESS(err);
3856
3857 // Record a single command buffer which uses this renderpass twice. The
3858 // bug is triggered at the beginning of the second renderpass, when the
3859 // command buffer already has a layout recorded for the attachment.
3860 VkRenderPassBeginInfo rpbi = {
3861 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003862 rp, fb, { { 0, 0 } , { 32, 32 } },
Chris Forbes48a53902016-06-30 11:46:27 +12003863 0, nullptr
3864 };
3865 BeginCommandBuffer();
3866 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3867 VK_SUBPASS_CONTENTS_INLINE);
3868 vkCmdEndRenderPass(m_commandBuffer->handle());
3869 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3870 VK_SUBPASS_CONTENTS_INLINE);
3871
3872 m_errorMonitor->VerifyNotFound();
3873
3874 vkCmdEndRenderPass(m_commandBuffer->handle());
3875 EndCommandBuffer();
3876
3877 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3878 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3879 vkDestroyImageView(m_device->device(), view, nullptr);
3880}
3881
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003882TEST_F(VkLayerTest, FramebufferBindingDestroyCommandPool) {
3883 TEST_DESCRIPTION("This test should pass. Create a Framebuffer and "
3884 "command buffer, bind them together, then destroy "
3885 "command pool and framebuffer and verify there are no "
3886 "errors.");
3887
3888 m_errorMonitor->ExpectSuccess();
3889
3890 ASSERT_NO_FATAL_FAILURE(InitState());
3891
3892 // A renderpass with one color attachment.
3893 VkAttachmentDescription attachment = {
3894 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3895 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3896 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3897 VK_IMAGE_LAYOUT_UNDEFINED,
3898 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3899 };
3900
3901 VkAttachmentReference att_ref = {
3902 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3903 };
3904
3905 VkSubpassDescription subpass = {
3906 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3907 1, &att_ref, nullptr, nullptr, 0, nullptr
3908 };
3909
3910 VkRenderPassCreateInfo rpci = {
3911 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3912 0, 1, &attachment, 1, &subpass, 0, nullptr
3913 };
3914
3915 VkRenderPass rp;
3916 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3917 ASSERT_VK_SUCCESS(err);
3918
3919 // A compatible framebuffer.
3920 VkImageObj image(m_device);
3921 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3922 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3923 VK_IMAGE_TILING_OPTIMAL, 0);
3924 ASSERT_TRUE(image.initialized());
3925
3926 VkImageViewCreateInfo ivci = {
3927 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3928 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3929 {
3930 VK_COMPONENT_SWIZZLE_IDENTITY,
3931 VK_COMPONENT_SWIZZLE_IDENTITY,
3932 VK_COMPONENT_SWIZZLE_IDENTITY,
3933 VK_COMPONENT_SWIZZLE_IDENTITY
3934 },
3935 {
3936 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3937 },
3938 };
3939 VkImageView view;
3940 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3941 ASSERT_VK_SUCCESS(err);
3942
3943 VkFramebufferCreateInfo fci = {
3944 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3945 0, rp, 1, &view,
3946 32, 32, 1
3947 };
3948 VkFramebuffer fb;
3949 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3950 ASSERT_VK_SUCCESS(err);
3951
3952 // Explicitly create a command buffer to bind the FB to so that we can then
3953 // destroy the command pool in order to implicitly free command buffer
3954 VkCommandPool command_pool;
3955 VkCommandPoolCreateInfo pool_create_info{};
3956 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3957 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3958 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3959 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3960 &command_pool);
3961
3962 VkCommandBuffer command_buffer;
3963 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3964 command_buffer_allocate_info.sType =
3965 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3966 command_buffer_allocate_info.commandPool = command_pool;
3967 command_buffer_allocate_info.commandBufferCount = 1;
3968 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3969 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3970 &command_buffer);
3971
3972 // Begin our cmd buffer with renderpass using our framebuffer
3973 VkRenderPassBeginInfo rpbi = {
3974 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
3975 rp, fb, { { 0, 0 } , { 32, 32 } },
3976 0, nullptr
3977 };
3978 VkCommandBufferBeginInfo begin_info{};
3979 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3980 vkBeginCommandBuffer(command_buffer, &begin_info);
3981
3982 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3983 vkCmdEndRenderPass(command_buffer);
3984 vkEndCommandBuffer(command_buffer);
Mark Lobodzinski7d10a822016-08-03 14:08:40 -06003985 vkDestroyImageView(m_device->device(), view, nullptr);
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003986 // Destroy command pool to implicitly free command buffer
3987 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3988 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3989 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3990 m_errorMonitor->VerifyNotFound();
3991}
3992
Chris Forbes51bf7c92016-06-30 15:22:08 +12003993TEST_F(VkLayerTest, RenderPassSubpassZeroTransitionsApplied) {
3994 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
3995 "transitions for the first subpass");
3996
3997 m_errorMonitor->ExpectSuccess();
3998
3999 ASSERT_NO_FATAL_FAILURE(InitState());
4000
4001 // A renderpass with one color attachment.
4002 VkAttachmentDescription attachment = {
4003 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
4004 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
4005 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4006 VK_IMAGE_LAYOUT_UNDEFINED,
4007 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4008 };
4009
4010 VkAttachmentReference att_ref = {
4011 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4012 };
4013
4014 VkSubpassDescription subpass = {
4015 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
4016 1, &att_ref, nullptr, nullptr, 0, nullptr
4017 };
4018
4019 VkSubpassDependency dep = {
Chris Forbescb4c7ad2016-07-06 10:28:18 +12004020 0, 0, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4021 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12004022 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4023 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4024 VK_DEPENDENCY_BY_REGION_BIT
4025 };
4026
4027 VkRenderPassCreateInfo rpci = {
4028 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4029 0, 1, &attachment, 1, &subpass, 1, &dep
4030 };
4031
4032 VkResult err;
4033 VkRenderPass rp;
4034 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4035 ASSERT_VK_SUCCESS(err);
4036
4037 // A compatible framebuffer.
4038 VkImageObj image(m_device);
4039 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
4040 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
4041 VK_IMAGE_TILING_OPTIMAL, 0);
4042 ASSERT_TRUE(image.initialized());
4043
4044 VkImageViewCreateInfo ivci = {
4045 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
4046 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
4047 {
4048 VK_COMPONENT_SWIZZLE_IDENTITY,
4049 VK_COMPONENT_SWIZZLE_IDENTITY,
4050 VK_COMPONENT_SWIZZLE_IDENTITY,
4051 VK_COMPONENT_SWIZZLE_IDENTITY
4052 },
4053 {
4054 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
4055 },
4056 };
4057 VkImageView view;
4058 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4059 ASSERT_VK_SUCCESS(err);
4060
4061 VkFramebufferCreateInfo fci = {
4062 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
4063 0, rp, 1, &view,
4064 32, 32, 1
4065 };
4066 VkFramebuffer fb;
4067 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4068 ASSERT_VK_SUCCESS(err);
4069
4070 // Record a single command buffer which issues a pipeline barrier w/
4071 // image memory barrier for the attachment. This detects the previously
4072 // missing tracking of the subpass layout by throwing a validation error
4073 // if it doesn't occur.
4074 VkRenderPassBeginInfo rpbi = {
4075 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06004076 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes51bf7c92016-06-30 15:22:08 +12004077 0, nullptr
4078 };
4079 BeginCommandBuffer();
4080 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4081 VK_SUBPASS_CONTENTS_INLINE);
4082
4083 VkImageMemoryBarrier imb = {
4084 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, nullptr,
4085 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4086 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4087 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4088 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4089 VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
4090 image.handle(),
4091 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
4092 };
4093 vkCmdPipelineBarrier(m_commandBuffer->handle(),
Chris Forbescb4c7ad2016-07-06 10:28:18 +12004094 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4095 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12004096 VK_DEPENDENCY_BY_REGION_BIT,
4097 0, nullptr, 0, nullptr, 1, &imb);
4098
4099 vkCmdEndRenderPass(m_commandBuffer->handle());
4100 m_errorMonitor->VerifyNotFound();
4101 EndCommandBuffer();
4102
4103 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4104 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4105 vkDestroyImageView(m_device->device(), view, nullptr);
4106}
4107
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004108TEST_F(VkLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
4109 TEST_DESCRIPTION("Validate that when an imageView of a depth/stencil image "
4110 "is used as a depth/stencil framebuffer attachment, the "
4111 "aspectMask is ignored and both depth and stencil image "
4112 "subresources are used.");
4113
4114 VkFormatProperties format_properties;
4115 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT,
4116 &format_properties);
4117 if (!(format_properties.optimalTilingFeatures &
4118 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
4119 return;
4120 }
4121
4122 m_errorMonitor->ExpectSuccess();
4123
4124 ASSERT_NO_FATAL_FAILURE(InitState());
4125
4126 VkAttachmentDescription attachment = {
4127 0,
4128 VK_FORMAT_D32_SFLOAT_S8_UINT,
4129 VK_SAMPLE_COUNT_1_BIT,
4130 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4131 VK_ATTACHMENT_STORE_OP_STORE,
4132 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4133 VK_ATTACHMENT_STORE_OP_DONT_CARE,
4134 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4135 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
4136
4137 VkAttachmentReference att_ref = {
4138 0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
4139
4140 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4141 0, nullptr,
4142 0, nullptr,
4143 nullptr, &att_ref,
4144 0, nullptr};
4145
4146 VkSubpassDependency dep = {0,
4147 0,
4148 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4149 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4150 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4151 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4152 VK_DEPENDENCY_BY_REGION_BIT};
4153
4154 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
4155 nullptr,
4156 0,
4157 1,
4158 &attachment,
4159 1,
4160 &subpass,
4161 1,
4162 &dep};
4163
4164 VkResult err;
4165 VkRenderPass rp;
4166 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4167 ASSERT_VK_SUCCESS(err);
4168
4169 VkImageObj image(m_device);
4170 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
4171 0x26, // usage
4172 VK_IMAGE_TILING_OPTIMAL, 0);
4173 ASSERT_TRUE(image.initialized());
4174 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
4175
4176 VkImageViewCreateInfo ivci = {
4177 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4178 nullptr,
4179 0,
4180 image.handle(),
4181 VK_IMAGE_VIEW_TYPE_2D,
4182 VK_FORMAT_D32_SFLOAT_S8_UINT,
4183 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B,
4184 VK_COMPONENT_SWIZZLE_A},
4185 {0x2, 0, 1, 0, 1},
4186 };
4187 VkImageView view;
4188 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4189 ASSERT_VK_SUCCESS(err);
4190
4191 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
4192 nullptr,
4193 0,
4194 rp,
4195 1,
4196 &view,
4197 32,
4198 32,
4199 1};
4200 VkFramebuffer fb;
4201 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4202 ASSERT_VK_SUCCESS(err);
4203
4204 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
4205 nullptr,
4206 rp,
4207 fb,
4208 {{0, 0}, {32, 32}},
4209 0,
4210 nullptr};
4211 BeginCommandBuffer();
4212 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4213 VK_SUBPASS_CONTENTS_INLINE);
4214
4215 VkImageMemoryBarrier imb = {};
4216 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4217 imb.pNext = nullptr;
4218 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4219 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4220 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4221 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4222 imb.srcQueueFamilyIndex = 0;
4223 imb.dstQueueFamilyIndex = 0;
4224 imb.image = image.handle();
4225 imb.subresourceRange.aspectMask = 0x6;
4226 imb.subresourceRange.baseMipLevel = 0;
4227 imb.subresourceRange.levelCount = 0x1;
4228 imb.subresourceRange.baseArrayLayer = 0;
4229 imb.subresourceRange.layerCount = 0x1;
4230
4231 vkCmdPipelineBarrier(m_commandBuffer->handle(),
4232 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4233 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4234 VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
4235 &imb);
4236
4237 vkCmdEndRenderPass(m_commandBuffer->handle());
4238 EndCommandBuffer();
4239 QueueCommandBuffer(false);
4240 m_errorMonitor->VerifyNotFound();
4241
4242 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4243 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4244 vkDestroyImageView(m_device->device(), view, nullptr);
4245}
Tony Barbourd5f7b822016-08-02 15:39:33 -06004246
Tony Barbour4e919972016-08-09 13:27:40 -06004247TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
4248 TEST_DESCRIPTION("Generate INVALID_RENDER_AREA error by beginning renderpass"
4249 "with extent outside of framebuffer");
4250 ASSERT_NO_FATAL_FAILURE(InitState());
4251 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4252
4253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4254 "Cannot execute a render pass with renderArea "
4255 "not within the bound of the framebuffer.");
4256
4257 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
4258 m_renderPassBeginInfo.renderArea.extent.width = 257;
4259 m_renderPassBeginInfo.renderArea.extent.height = 257;
4260 BeginCommandBuffer();
4261 m_errorMonitor->VerifyFound();
4262}
4263
4264TEST_F(VkLayerTest, DisabledIndependentBlend) {
4265 TEST_DESCRIPTION("Generate INDEPENDENT_BLEND by disabling independent "
4266 "blend and then specifying different blend states for two "
4267 "attachements");
4268 ASSERT_NO_FATAL_FAILURE(InitState());
4269
4270 m_errorMonitor->SetDesiredFailureMsg(
4271 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4272 "Invalid Pipeline CreateInfo: If independent blend feature not "
4273 "enabled, all elements of pAttachments must be identical");
4274 VkPhysicalDeviceFeatures features = {};
4275 features.independentBlend = VK_FALSE;
4276 std::vector<const char *> extension_names;
4277 VkDeviceObj noib_device(0, gpu(), extension_names, &features);
4278
4279 VkCommandPool cmd_pool;
4280 VkCommandPoolCreateInfo pool_create_info{};
4281 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4282 pool_create_info.queueFamilyIndex = noib_device.graphics_queue_node_index_;
4283 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4284
4285 vkCreateCommandPool(noib_device.device(), &pool_create_info, nullptr,
4286 &cmd_pool);
4287 {
4288 // Need cmd_buffer's destructor to be called before calling DestroyCommandPool
4289 VkCommandBufferObj cmd_buffer(&noib_device, cmd_pool);
4290 VkDescriptorSetObj descriptorSet(&noib_device);
4291 descriptorSet.AppendDummy();
4292 descriptorSet.CreateVKDescriptorSet(&cmd_buffer);
4293
4294 VkPipelineObj pipeline(&noib_device);
4295
4296 VkRenderpassObj renderpass(&noib_device);
4297
4298 VkShaderObj vs(&noib_device, bindStateVertShaderText,
4299 VK_SHADER_STAGE_VERTEX_BIT, this);
4300
4301 pipeline.AddShader(&vs);
4302
4303 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
4304 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
4305 att_state1.blendEnable = VK_TRUE;
4306 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
4307 att_state2.blendEnable = VK_FALSE;
4308 pipeline.AddColorAttachment(0, &att_state1);
4309 pipeline.AddColorAttachment(1, &att_state2);
4310 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(),
4311 renderpass.handle());
4312 m_errorMonitor->VerifyFound();
4313 }
4314 vkDestroyCommandPool(noib_device.device(), cmd_pool, NULL);
4315}
4316
4317TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
4318 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
4319 "depth attachments in subpass");
4320
4321 m_errorMonitor->SetDesiredFailureMsg(
4322 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4323 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
4324
4325 // Create a renderPass with a single color attachment
4326 VkAttachmentReference attach = {};
4327 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4328 VkSubpassDescription subpass = {};
4329 VkRenderPassCreateInfo rpci = {};
4330 rpci.subpassCount = 1;
4331 rpci.pSubpasses = &subpass;
4332 rpci.attachmentCount = 1;
4333 VkAttachmentDescription attach_desc = {};
4334 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4335 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4336 rpci.pAttachments = &attach_desc;
4337 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4338 VkRenderPass rp;
4339 subpass.pDepthStencilAttachment = &attach;
4340 subpass.pColorAttachments = NULL;
4341 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4342 m_errorMonitor->VerifyFound();
4343}
4344
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004345TEST_F(VkLayerTest, RenderPassTransitionsAttachmentUnused) {
4346 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
4347 "errors, when an attachment reference is "
4348 "VK_ATTACHMENT_UNUSED");
4349
4350 m_errorMonitor->ExpectSuccess();
4351
4352 ASSERT_NO_FATAL_FAILURE(InitState());
4353
4354 // A renderpass with no attachments
4355 VkAttachmentReference att_ref = {
4356 VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4357 };
4358
4359 VkSubpassDescription subpass = {
4360 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
4361 1, &att_ref, nullptr, nullptr, 0, nullptr
4362 };
4363
4364 VkRenderPassCreateInfo rpci = {
4365 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4366 0, 0, nullptr, 1, &subpass, 0, nullptr
4367 };
4368
4369 VkRenderPass rp;
4370 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4371 ASSERT_VK_SUCCESS(err);
4372
4373 // A compatible framebuffer.
4374 VkFramebufferCreateInfo fci = {
4375 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
4376 0, rp, 0, nullptr,
4377 32, 32, 1
4378 };
4379 VkFramebuffer fb;
4380 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4381 ASSERT_VK_SUCCESS(err);
4382
4383 // Record a command buffer which just begins and ends the renderpass. The
4384 // bug manifests in BeginRenderPass.
4385 VkRenderPassBeginInfo rpbi = {
4386 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06004387 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004388 0, nullptr
4389 };
4390 BeginCommandBuffer();
4391 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4392 VK_SUBPASS_CONTENTS_INLINE);
4393 vkCmdEndRenderPass(m_commandBuffer->handle());
4394 m_errorMonitor->VerifyNotFound();
4395 EndCommandBuffer();
4396
4397 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4398 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4399}
4400
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004401// This is a positive test. No errors are expected.
4402TEST_F(VkLayerTest, StencilLoadOp) {
4403 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
4404 "CLEAR. stencil[Load|Store]Op used to be ignored.");
4405 VkResult result = VK_SUCCESS;
4406 VkImageFormatProperties formatProps;
4407 vkGetPhysicalDeviceImageFormatProperties(
4408 gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D,
4409 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4410 VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
4411 0, &formatProps);
4412 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
4413 return;
4414 }
4415
4416 ASSERT_NO_FATAL_FAILURE(InitState());
4417 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
4418 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
4419 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4420 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
4421 VkAttachmentDescription att = {};
4422 VkAttachmentReference ref = {};
4423 att.format = depth_stencil_fmt;
4424 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
4425 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
4426 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
4427 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
4428 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4429 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4430
4431 VkClearValue clear;
4432 clear.depthStencil.depth = 1.0;
4433 clear.depthStencil.stencil = 0;
4434 ref.attachment = 0;
4435 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4436
4437 VkSubpassDescription subpass = {};
4438 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
4439 subpass.flags = 0;
4440 subpass.inputAttachmentCount = 0;
4441 subpass.pInputAttachments = NULL;
4442 subpass.colorAttachmentCount = 0;
4443 subpass.pColorAttachments = NULL;
4444 subpass.pResolveAttachments = NULL;
4445 subpass.pDepthStencilAttachment = &ref;
4446 subpass.preserveAttachmentCount = 0;
4447 subpass.pPreserveAttachments = NULL;
4448
4449 VkRenderPass rp;
4450 VkRenderPassCreateInfo rp_info = {};
4451 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4452 rp_info.attachmentCount = 1;
4453 rp_info.pAttachments = &att;
4454 rp_info.subpassCount = 1;
4455 rp_info.pSubpasses = &subpass;
4456 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
4457 ASSERT_VK_SUCCESS(result);
4458
4459 VkImageView *depthView = m_depthStencil->BindInfo();
4460 VkFramebufferCreateInfo fb_info = {};
4461 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4462 fb_info.pNext = NULL;
4463 fb_info.renderPass = rp;
4464 fb_info.attachmentCount = 1;
4465 fb_info.pAttachments = depthView;
4466 fb_info.width = 100;
4467 fb_info.height = 100;
4468 fb_info.layers = 1;
4469 VkFramebuffer fb;
4470 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4471 ASSERT_VK_SUCCESS(result);
4472
4473
4474 VkRenderPassBeginInfo rpbinfo = {};
4475 rpbinfo.clearValueCount = 1;
4476 rpbinfo.pClearValues = &clear;
4477 rpbinfo.pNext = NULL;
4478 rpbinfo.renderPass = rp;
4479 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4480 rpbinfo.renderArea.extent.width = 100;
4481 rpbinfo.renderArea.extent.height = 100;
4482 rpbinfo.renderArea.offset.x = 0;
4483 rpbinfo.renderArea.offset.y = 0;
4484 rpbinfo.framebuffer = fb;
4485
4486 VkFence fence = {};
4487 VkFenceCreateInfo fence_ci = {};
4488 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4489 fence_ci.pNext = nullptr;
4490 fence_ci.flags = 0;
4491 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
4492 ASSERT_VK_SUCCESS(result);
4493
4494
4495 m_commandBuffer->BeginCommandBuffer();
4496 m_commandBuffer->BeginRenderPass(rpbinfo);
4497 m_commandBuffer->EndRenderPass();
4498 m_commandBuffer->EndCommandBuffer();
4499 m_commandBuffer->QueueCommandBuffer(fence);
4500
4501 VkImageObj destImage(m_device);
4502 destImage.init(100, 100, depth_stencil_fmt,
4503 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4504 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4505 VK_IMAGE_TILING_OPTIMAL, 0);
4506 VkImageMemoryBarrier barrier = {};
4507 VkImageSubresourceRange range;
4508 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4509 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4510 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4511 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT |
4512 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
4513 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4514 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
4515 barrier.image = m_depthStencil->handle();
4516 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4517 range.baseMipLevel = 0;
4518 range.levelCount = 1;
4519 range.baseArrayLayer = 0;
4520 range.layerCount = 1;
4521 barrier.subresourceRange = range;
4522 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4523 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
4524 cmdbuf.BeginCommandBuffer();
4525 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4526 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4527 nullptr, 1, &barrier);
4528 barrier.srcAccessMask = 0;
4529 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4530 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
4531 barrier.image = destImage.handle();
4532 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4533 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4534 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4535 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4536 nullptr, 1, &barrier);
4537 VkImageCopy cregion;
4538 cregion.srcSubresource.aspectMask =
4539 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4540 cregion.srcSubresource.mipLevel = 0;
4541 cregion.srcSubresource.baseArrayLayer = 0;
4542 cregion.srcSubresource.layerCount = 1;
4543 cregion.srcOffset.x = 0;
4544 cregion.srcOffset.y = 0;
4545 cregion.srcOffset.z = 0;
4546 cregion.dstSubresource.aspectMask =
4547 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4548 cregion.dstSubresource.mipLevel = 0;
4549 cregion.dstSubresource.baseArrayLayer = 0;
4550 cregion.dstSubresource.layerCount = 1;
4551 cregion.dstOffset.x = 0;
4552 cregion.dstOffset.y = 0;
4553 cregion.dstOffset.z = 0;
4554 cregion.extent.width = 100;
4555 cregion.extent.height = 100;
4556 cregion.extent.depth = 1;
4557 cmdbuf.CopyImage(m_depthStencil->handle(),
4558 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
4559 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
4560 cmdbuf.EndCommandBuffer();
4561
4562 VkSubmitInfo submit_info;
4563 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4564 submit_info.pNext = NULL;
4565 submit_info.waitSemaphoreCount = 0;
4566 submit_info.pWaitSemaphores = NULL;
4567 submit_info.pWaitDstStageMask = NULL;
4568 submit_info.commandBufferCount = 1;
4569 submit_info.pCommandBuffers = &cmdbuf.handle();
4570 submit_info.signalSemaphoreCount = 0;
4571 submit_info.pSignalSemaphores = NULL;
4572
4573 m_errorMonitor->ExpectSuccess();
4574 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4575 m_errorMonitor->VerifyNotFound();
4576
Mark Lobodzinskid0440da2016-06-17 15:10:03 -06004577 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004578 vkDestroyFence(m_device->device(), fence, nullptr);
4579 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4580 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4581}
4582
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004583TEST_F(VkLayerTest, UnusedPreserveAttachment) {
4584 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
4585 "attachment reference of VK_ATTACHMENT_UNUSED");
4586
4587 ASSERT_NO_FATAL_FAILURE(InitState());
4588 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4589
4590 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4591 "must not be VK_ATTACHMENT_UNUSED");
4592
4593 VkAttachmentReference color_attach = {};
4594 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4595 color_attach.attachment = 0;
4596 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
4597 VkSubpassDescription subpass = {};
4598 subpass.colorAttachmentCount = 1;
4599 subpass.pColorAttachments = &color_attach;
4600 subpass.preserveAttachmentCount = 1;
4601 subpass.pPreserveAttachments = &preserve_attachment;
4602
4603 VkRenderPassCreateInfo rpci = {};
4604 rpci.subpassCount = 1;
4605 rpci.pSubpasses = &subpass;
4606 rpci.attachmentCount = 1;
4607 VkAttachmentDescription attach_desc = {};
4608 attach_desc.format = VK_FORMAT_UNDEFINED;
4609 rpci.pAttachments = &attach_desc;
4610 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4611 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004612 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004613
4614 m_errorMonitor->VerifyFound();
4615
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004616 if (result == VK_SUCCESS) {
4617 vkDestroyRenderPass(m_device->device(), rp, NULL);
4618 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004619}
4620
Chris Forbesc5389742016-06-29 11:49:23 +12004621TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004622 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
4623 "when the source of a subpass multisample resolve "
4624 "does not have multiple samples.");
4625
Chris Forbesc5389742016-06-29 11:49:23 +12004626 ASSERT_NO_FATAL_FAILURE(InitState());
4627
4628 m_errorMonitor->SetDesiredFailureMsg(
4629 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbes6655bb32016-07-01 18:27:30 +12004630 "Subpass 0 requests multisample resolve from attachment 0 which has "
4631 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12004632
4633 VkAttachmentDescription attachments[] = {
4634 {
4635 0, VK_FORMAT_R8G8B8A8_UNORM,
4636 VK_SAMPLE_COUNT_1_BIT,
4637 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4638 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4639 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4640 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4641 },
4642 {
4643 0, VK_FORMAT_R8G8B8A8_UNORM,
4644 VK_SAMPLE_COUNT_1_BIT,
4645 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4646 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4647 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4648 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4649 },
4650 };
4651
4652 VkAttachmentReference color = {
4653 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4654 };
4655
4656 VkAttachmentReference resolve = {
4657 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4658 };
4659
4660 VkSubpassDescription subpass = {
4661 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4662 0, nullptr,
4663 1, &color,
4664 &resolve,
4665 nullptr,
4666 0, nullptr
4667 };
4668
4669 VkRenderPassCreateInfo rpci = {
4670 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4671 0, 2, attachments, 1, &subpass, 0, nullptr
4672 };
4673
4674 VkRenderPass rp;
4675 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4676
4677 m_errorMonitor->VerifyFound();
4678
4679 if (err == VK_SUCCESS)
4680 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4681}
4682
4683TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004684 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4685 "when a subpass multisample resolve operation is "
4686 "requested, and the destination of that resolve has "
4687 "multiple samples.");
4688
Chris Forbesc5389742016-06-29 11:49:23 +12004689 ASSERT_NO_FATAL_FAILURE(InitState());
4690
4691 m_errorMonitor->SetDesiredFailureMsg(
4692 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4693 "Subpass 0 requests multisample resolve into attachment 1, which "
4694 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
4695
4696 VkAttachmentDescription attachments[] = {
4697 {
4698 0, VK_FORMAT_R8G8B8A8_UNORM,
4699 VK_SAMPLE_COUNT_4_BIT,
4700 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4701 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4702 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4703 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4704 },
4705 {
4706 0, VK_FORMAT_R8G8B8A8_UNORM,
4707 VK_SAMPLE_COUNT_4_BIT,
4708 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4709 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4710 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4711 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4712 },
4713 };
4714
4715 VkAttachmentReference color = {
4716 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4717 };
4718
4719 VkAttachmentReference resolve = {
4720 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4721 };
4722
4723 VkSubpassDescription subpass = {
4724 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4725 0, nullptr,
4726 1, &color,
4727 &resolve,
4728 nullptr,
4729 0, nullptr
4730 };
4731
4732 VkRenderPassCreateInfo rpci = {
4733 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4734 0, 2, attachments, 1, &subpass, 0, nullptr
4735 };
4736
4737 VkRenderPass rp;
4738 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4739
4740 m_errorMonitor->VerifyFound();
4741
4742 if (err == VK_SUCCESS)
4743 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4744}
4745
Chris Forbes3f128ef2016-06-29 14:58:53 +12004746TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004747 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4748 "when the color and depth attachments used by a subpass "
4749 "have inconsistent sample counts");
4750
Chris Forbes3f128ef2016-06-29 14:58:53 +12004751 ASSERT_NO_FATAL_FAILURE(InitState());
4752
4753 m_errorMonitor->SetDesiredFailureMsg(
4754 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4755 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
4756
4757 VkAttachmentDescription attachments[] = {
4758 {
4759 0, VK_FORMAT_R8G8B8A8_UNORM,
4760 VK_SAMPLE_COUNT_1_BIT,
4761 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4762 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4763 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4764 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4765 },
4766 {
4767 0, VK_FORMAT_R8G8B8A8_UNORM,
4768 VK_SAMPLE_COUNT_4_BIT,
4769 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4770 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4771 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4772 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4773 },
4774 };
4775
4776 VkAttachmentReference color[] = {
4777 {
4778 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4779 },
4780 {
4781 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4782 },
4783 };
4784
4785 VkSubpassDescription subpass = {
4786 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4787 0, nullptr,
4788 2, color,
4789 nullptr,
4790 nullptr,
4791 0, nullptr
4792 };
4793
4794 VkRenderPassCreateInfo rpci = {
4795 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4796 0, 2, attachments, 1, &subpass, 0, nullptr
4797 };
4798
4799 VkRenderPass rp;
4800 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4801
4802 m_errorMonitor->VerifyFound();
4803
4804 if (err == VK_SUCCESS)
4805 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4806}
4807
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004808TEST_F(VkLayerTest, FramebufferCreateErrors) {
4809 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
4810 " 1. Mismatch between fb & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004811 " 2. Use a color image as depthStencil attachment\n"
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004812 " 3. Mismatch fb & renderPass attachment formats\n"
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004813 " 4. Mismatch fb & renderPass attachment #samples\n"
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004814 " 5. FB attachment w/ non-1 mip-levels\n"
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004815 " 6. FB attachment where dimensions don't match\n"
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004816 " 7. FB attachment w/o identity swizzle\n"
4817 " 8. FB dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004818
4819 ASSERT_NO_FATAL_FAILURE(InitState());
4820 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4821
4822 m_errorMonitor->SetDesiredFailureMsg(
4823 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004824 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
4825 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004826
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004827 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004828 VkAttachmentReference attach = {};
4829 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4830 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004831 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004832 VkRenderPassCreateInfo rpci = {};
4833 rpci.subpassCount = 1;
4834 rpci.pSubpasses = &subpass;
4835 rpci.attachmentCount = 1;
4836 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004837 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004838 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004839 rpci.pAttachments = &attach_desc;
4840 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4841 VkRenderPass rp;
4842 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4843 ASSERT_VK_SUCCESS(err);
4844
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004845 VkImageView ivs[2];
4846 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
4847 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004848 VkFramebufferCreateInfo fb_info = {};
4849 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4850 fb_info.pNext = NULL;
4851 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004852 // Set mis-matching attachmentCount
4853 fb_info.attachmentCount = 2;
4854 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004855 fb_info.width = 100;
4856 fb_info.height = 100;
4857 fb_info.layers = 1;
4858
4859 VkFramebuffer fb;
4860 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4861
4862 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004863 if (err == VK_SUCCESS) {
4864 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4865 }
4866 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004867
4868 // Create a renderPass with a depth-stencil attachment created with
4869 // IMAGE_USAGE_COLOR_ATTACHMENT
4870 // Add our color attachment to pDepthStencilAttachment
4871 subpass.pDepthStencilAttachment = &attach;
4872 subpass.pColorAttachments = NULL;
4873 VkRenderPass rp_ds;
4874 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
4875 ASSERT_VK_SUCCESS(err);
4876 // Set correct attachment count, but attachment has COLOR usage bit set
4877 fb_info.attachmentCount = 1;
4878 fb_info.renderPass = rp_ds;
4879
4880 m_errorMonitor->SetDesiredFailureMsg(
4881 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4882 " conflicts with the image's IMAGE_USAGE flags ");
4883 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4884
4885 m_errorMonitor->VerifyFound();
4886 if (err == VK_SUCCESS) {
4887 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4888 }
4889 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004890
4891 // Create new renderpass with alternate attachment format from fb
4892 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
4893 subpass.pDepthStencilAttachment = NULL;
4894 subpass.pColorAttachments = &attach;
4895 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4896 ASSERT_VK_SUCCESS(err);
4897
4898 // Cause error due to mis-matched formats between rp & fb
4899 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
4900 fb_info.renderPass = rp;
4901 m_errorMonitor->SetDesiredFailureMsg(
4902 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4903 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
4904 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4905
4906 m_errorMonitor->VerifyFound();
4907 if (err == VK_SUCCESS) {
4908 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4909 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004910 vkDestroyRenderPass(m_device->device(), rp, NULL);
4911
4912 // Create new renderpass with alternate sample count from fb
4913 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4914 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
4915 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4916 ASSERT_VK_SUCCESS(err);
4917
4918 // Cause error due to mis-matched sample count between rp & fb
4919 fb_info.renderPass = rp;
4920 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4921 " has VK_SAMPLE_COUNT_1_BIT samples "
4922 "that do not match the "
4923 "VK_SAMPLE_COUNT_4_BIT ");
4924 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4925
4926 m_errorMonitor->VerifyFound();
4927 if (err == VK_SUCCESS) {
4928 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4929 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004930
4931 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004932
4933 // Create a custom imageView with non-1 mip levels
4934 VkImageObj image(m_device);
4935 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
4936 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4937 ASSERT_TRUE(image.initialized());
4938
4939 VkImageView view;
4940 VkImageViewCreateInfo ivci = {};
4941 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4942 ivci.image = image.handle();
4943 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4944 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4945 ivci.subresourceRange.layerCount = 1;
4946 ivci.subresourceRange.baseMipLevel = 0;
4947 // Set level count 2 (only 1 is allowed for FB attachment)
4948 ivci.subresourceRange.levelCount = 2;
4949 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4950 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4951 ASSERT_VK_SUCCESS(err);
4952 // Re-create renderpass to have matching sample count
4953 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4954 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4955 ASSERT_VK_SUCCESS(err);
4956
4957 fb_info.renderPass = rp;
4958 fb_info.pAttachments = &view;
4959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4960 " has mip levelCount of 2 but only ");
4961 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4962
4963 m_errorMonitor->VerifyFound();
4964 if (err == VK_SUCCESS) {
4965 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4966 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004967 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004968 // Update view to original color buffer and grow FB dimensions too big
4969 fb_info.pAttachments = ivs;
4970 fb_info.height = 1024;
4971 fb_info.width = 1024;
4972 fb_info.layers = 2;
4973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4974 " Attachment dimensions must be at "
4975 "least as large. ");
4976 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4977
4978 m_errorMonitor->VerifyFound();
4979 if (err == VK_SUCCESS) {
4980 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4981 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004982 // Create view attachment with non-identity swizzle
4983 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4984 ivci.image = image.handle();
4985 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4986 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4987 ivci.subresourceRange.layerCount = 1;
4988 ivci.subresourceRange.baseMipLevel = 0;
4989 ivci.subresourceRange.levelCount = 1;
4990 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4991 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4992 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4993 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4994 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4995 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4996 ASSERT_VK_SUCCESS(err);
4997
4998 fb_info.pAttachments = &view;
4999 fb_info.height = 100;
5000 fb_info.width = 100;
5001 fb_info.layers = 1;
5002 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5003 " has non-identy swizzle. All "
5004 "framebuffer attachments must have "
5005 "been created with the identity "
5006 "swizzle. ");
5007 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5008
5009 m_errorMonitor->VerifyFound();
5010 if (err == VK_SUCCESS) {
5011 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5012 }
5013 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06005014 // Request fb that exceeds max dimensions
5015 // reset attachment to color attachment
5016 fb_info.pAttachments = ivs;
5017 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
5018 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
5019 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
5020 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5021 " Requested VkFramebufferCreateInfo "
5022 "dimensions exceed physical device "
5023 "limits. ");
5024 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5025
5026 m_errorMonitor->VerifyFound();
5027 if (err == VK_SUCCESS) {
5028 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5029 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06005030
Tobin Ehlis6cfda642016-06-22 16:12:58 -06005031 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06005032}
5033
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005034// This is a positive test. No errors should be generated.
Michael Lentine860b0fe2016-05-20 10:14:00 -05005035TEST_F(VkLayerTest, WaitEventThenSet) {
5036 TEST_DESCRIPTION(
5037 "Wait on a event then set it after the wait has been submitted.");
5038
Michael Lentine860b0fe2016-05-20 10:14:00 -05005039 m_errorMonitor->ExpectSuccess();
5040
5041 VkEvent event;
5042 VkEventCreateInfo event_create_info{};
5043 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5044 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
5045
5046 VkCommandPool command_pool;
5047 VkCommandPoolCreateInfo pool_create_info{};
5048 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5049 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5050 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5051 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5052 &command_pool);
5053
5054 VkCommandBuffer command_buffer;
5055 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5056 command_buffer_allocate_info.sType =
5057 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5058 command_buffer_allocate_info.commandPool = command_pool;
5059 command_buffer_allocate_info.commandBufferCount = 1;
5060 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5061 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5062 &command_buffer);
5063
5064 VkQueue queue = VK_NULL_HANDLE;
5065 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06005066 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005067
5068 {
5069 VkCommandBufferBeginInfo begin_info{};
5070 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5071 vkBeginCommandBuffer(command_buffer, &begin_info);
5072
5073 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT,
5074 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
5075 nullptr, 0, nullptr);
5076 vkCmdResetEvent(command_buffer, event,
5077 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
5078 vkEndCommandBuffer(command_buffer);
5079 }
5080 {
5081 VkSubmitInfo submit_info{};
5082 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5083 submit_info.commandBufferCount = 1;
5084 submit_info.pCommandBuffers = &command_buffer;
5085 submit_info.signalSemaphoreCount = 0;
5086 submit_info.pSignalSemaphores = nullptr;
5087 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5088 }
5089 { vkSetEvent(m_device->device(), event); }
5090
5091 vkQueueWaitIdle(queue);
5092
5093 vkDestroyEvent(m_device->device(), event, nullptr);
5094 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5095 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5096
5097 m_errorMonitor->VerifyNotFound();
5098}
Michael Lentine5627e692016-05-20 17:45:02 -05005099// This is a positive test. No errors should be generated.
Michael Lentinef01fb382016-07-21 17:24:56 -05005100TEST_F(VkLayerTest, QueryAndCopySecondaryCommandBuffers) {
5101 TEST_DESCRIPTION(
5102 "Issue a query on a secondary command buffery and copy it on a primary.");
5103
5104 if ((m_device->queue_props.empty()) ||
5105 (m_device->queue_props[0].queueCount < 2))
5106 return;
5107
5108 m_errorMonitor->ExpectSuccess();
5109
5110 VkQueryPool query_pool;
5111 VkQueryPoolCreateInfo query_pool_create_info{};
5112 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5113 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
5114 query_pool_create_info.queryCount = 1;
5115 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
5116 &query_pool);
5117
5118 VkCommandPool command_pool;
5119 VkCommandPoolCreateInfo pool_create_info{};
5120 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5121 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5122 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5123 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5124 &command_pool);
5125
5126 VkCommandBuffer command_buffer;
5127 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5128 command_buffer_allocate_info.sType =
5129 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5130 command_buffer_allocate_info.commandPool = command_pool;
5131 command_buffer_allocate_info.commandBufferCount = 1;
5132 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5133 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5134 &command_buffer);
5135
5136 VkCommandBuffer secondary_command_buffer;
5137 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5138 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5139 &secondary_command_buffer);
5140
5141 VkQueue queue = VK_NULL_HANDLE;
5142 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5143 1, &queue);
5144
5145 uint32_t qfi = 0;
5146 VkBufferCreateInfo buff_create_info = {};
5147 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5148 buff_create_info.size = 1024;
5149 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
5150 buff_create_info.queueFamilyIndexCount = 1;
5151 buff_create_info.pQueueFamilyIndices = &qfi;
5152
5153 VkResult err;
5154 VkBuffer buffer;
5155 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
5156 ASSERT_VK_SUCCESS(err);
5157 VkMemoryAllocateInfo mem_alloc = {};
5158 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5159 mem_alloc.pNext = NULL;
5160 mem_alloc.allocationSize = 1024;
5161 mem_alloc.memoryTypeIndex = 0;
5162
5163 VkMemoryRequirements memReqs;
5164 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
5165 bool pass =
5166 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
5167 if (!pass) {
5168 vkDestroyBuffer(m_device->device(), buffer, NULL);
5169 return;
5170 }
5171
5172 VkDeviceMemory mem;
5173 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5174 ASSERT_VK_SUCCESS(err);
5175 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5176 ASSERT_VK_SUCCESS(err);
5177
5178 VkCommandBufferInheritanceInfo hinfo = {};
5179 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
5180 hinfo.renderPass = VK_NULL_HANDLE;
5181 hinfo.subpass = 0;
5182 hinfo.framebuffer = VK_NULL_HANDLE;
5183 hinfo.occlusionQueryEnable = VK_FALSE;
5184 hinfo.queryFlags = 0;
5185 hinfo.pipelineStatistics = 0;
5186
5187 {
5188 VkCommandBufferBeginInfo begin_info{};
5189 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5190 begin_info.pInheritanceInfo = &hinfo;
5191 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
5192
5193 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
5194 vkCmdWriteTimestamp(secondary_command_buffer,
5195 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
5196
5197 vkEndCommandBuffer(secondary_command_buffer);
5198
5199 begin_info.pInheritanceInfo = nullptr;
5200 vkBeginCommandBuffer(command_buffer, &begin_info);
5201
5202 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
5203 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer,
5204 0, 0, 0);
5205
5206 vkEndCommandBuffer(command_buffer);
5207 }
5208 {
5209 VkSubmitInfo submit_info{};
5210 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5211 submit_info.commandBufferCount = 1;
5212 submit_info.pCommandBuffers = &command_buffer;
5213 submit_info.signalSemaphoreCount = 0;
5214 submit_info.pSignalSemaphores = nullptr;
5215 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5216 }
5217
5218 vkQueueWaitIdle(queue);
5219
5220 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
5221 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5222 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
5223 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5224 vkDestroyBuffer(m_device->device(), buffer, NULL);
5225 vkFreeMemory(m_device->device(), mem, NULL);
5226
5227 m_errorMonitor->VerifyNotFound();
5228}
5229
5230// This is a positive test. No errors should be generated.
Michael Lentine5627e692016-05-20 17:45:02 -05005231TEST_F(VkLayerTest, QueryAndCopyMultipleCommandBuffers) {
5232 TEST_DESCRIPTION(
5233 "Issue a query and copy from it on a second command buffer.");
5234
5235 if ((m_device->queue_props.empty()) ||
5236 (m_device->queue_props[0].queueCount < 2))
5237 return;
5238
5239 m_errorMonitor->ExpectSuccess();
5240
5241 VkQueryPool query_pool;
5242 VkQueryPoolCreateInfo query_pool_create_info{};
5243 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5244 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
5245 query_pool_create_info.queryCount = 1;
5246 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
5247 &query_pool);
5248
5249 VkCommandPool command_pool;
5250 VkCommandPoolCreateInfo pool_create_info{};
5251 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5252 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5253 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5254 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5255 &command_pool);
5256
5257 VkCommandBuffer command_buffer[2];
5258 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5259 command_buffer_allocate_info.sType =
5260 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5261 command_buffer_allocate_info.commandPool = command_pool;
5262 command_buffer_allocate_info.commandBufferCount = 2;
5263 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5264 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5265 command_buffer);
5266
5267 VkQueue queue = VK_NULL_HANDLE;
5268 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5269 1, &queue);
5270
5271 uint32_t qfi = 0;
5272 VkBufferCreateInfo buff_create_info = {};
5273 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5274 buff_create_info.size = 1024;
5275 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
5276 buff_create_info.queueFamilyIndexCount = 1;
5277 buff_create_info.pQueueFamilyIndices = &qfi;
5278
5279 VkResult err;
5280 VkBuffer buffer;
5281 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
5282 ASSERT_VK_SUCCESS(err);
5283 VkMemoryAllocateInfo mem_alloc = {};
5284 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5285 mem_alloc.pNext = NULL;
5286 mem_alloc.allocationSize = 1024;
5287 mem_alloc.memoryTypeIndex = 0;
5288
5289 VkMemoryRequirements memReqs;
5290 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
5291 bool pass =
5292 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
5293 if (!pass) {
5294 vkDestroyBuffer(m_device->device(), buffer, NULL);
5295 return;
5296 }
5297
5298 VkDeviceMemory mem;
5299 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5300 ASSERT_VK_SUCCESS(err);
5301 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5302 ASSERT_VK_SUCCESS(err);
5303
5304 {
5305 VkCommandBufferBeginInfo begin_info{};
5306 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5307 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5308
5309 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
5310 vkCmdWriteTimestamp(command_buffer[0],
5311 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
5312
5313 vkEndCommandBuffer(command_buffer[0]);
5314
5315 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5316
5317 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer,
5318 0, 0, 0);
5319
5320 vkEndCommandBuffer(command_buffer[1]);
5321 }
5322 {
5323 VkSubmitInfo submit_info{};
5324 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5325 submit_info.commandBufferCount = 2;
5326 submit_info.pCommandBuffers = command_buffer;
5327 submit_info.signalSemaphoreCount = 0;
5328 submit_info.pSignalSemaphores = nullptr;
5329 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5330 }
5331
5332 vkQueueWaitIdle(queue);
5333
5334 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
5335 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
5336 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06005337 vkDestroyBuffer(m_device->device(), buffer, NULL);
5338 vkFreeMemory(m_device->device(), mem, NULL);
Michael Lentine5627e692016-05-20 17:45:02 -05005339
5340 m_errorMonitor->VerifyNotFound();
5341}
Michael Lentine860b0fe2016-05-20 10:14:00 -05005342
5343TEST_F(VkLayerTest, ResetEventThenSet) {
5344 TEST_DESCRIPTION(
5345 "Reset an event then set it after the reset has been submitted.");
5346
Michael Lentine860b0fe2016-05-20 10:14:00 -05005347 m_errorMonitor->ExpectSuccess();
5348
5349 VkEvent event;
5350 VkEventCreateInfo event_create_info{};
5351 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5352 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
5353
5354 VkCommandPool command_pool;
5355 VkCommandPoolCreateInfo pool_create_info{};
5356 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5357 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5358 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5359 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5360 &command_pool);
5361
5362 VkCommandBuffer command_buffer;
5363 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5364 command_buffer_allocate_info.sType =
5365 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5366 command_buffer_allocate_info.commandPool = command_pool;
5367 command_buffer_allocate_info.commandBufferCount = 1;
5368 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5369 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5370 &command_buffer);
5371
5372 VkQueue queue = VK_NULL_HANDLE;
5373 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06005374 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005375
5376 {
5377 VkCommandBufferBeginInfo begin_info{};
5378 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5379 vkBeginCommandBuffer(command_buffer, &begin_info);
5380
5381 vkCmdResetEvent(command_buffer, event,
5382 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
5383 vkCmdWaitEvents(command_buffer, 1, &event,
5384 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5385 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
5386 nullptr, 0, nullptr);
5387 vkEndCommandBuffer(command_buffer);
5388 }
5389 {
5390 VkSubmitInfo submit_info{};
5391 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5392 submit_info.commandBufferCount = 1;
5393 submit_info.pCommandBuffers = &command_buffer;
5394 submit_info.signalSemaphoreCount = 0;
5395 submit_info.pSignalSemaphores = nullptr;
5396 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5397 }
5398 {
5399 m_errorMonitor->SetDesiredFailureMsg(
5400 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkSetEvent() on event "
5401 "0x1 that is already in use by a "
5402 "command buffer.");
5403 vkSetEvent(m_device->device(), event);
5404 m_errorMonitor->VerifyFound();
5405 }
5406
5407 vkQueueWaitIdle(queue);
5408
5409 vkDestroyEvent(m_device->device(), event, nullptr);
5410 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5411 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5412}
5413
5414// This is a positive test. No errors should be generated.
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005415TEST_F(VkLayerTest, TwoFencesThreeFrames) {
5416 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
5417 "run through a Submit & WaitForFences cycle 3 times. This "
5418 "previously revealed a bug so running this positive test "
5419 "to prevent a regression.");
5420 m_errorMonitor->ExpectSuccess();
5421
5422 ASSERT_NO_FATAL_FAILURE(InitState());
5423 VkQueue queue = VK_NULL_HANDLE;
5424 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5425 0, &queue);
5426
5427 static const uint32_t NUM_OBJECTS = 2;
5428 static const uint32_t NUM_FRAMES = 3;
5429 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
5430 VkFence fences[NUM_OBJECTS] = {};
5431
5432 VkCommandPool cmd_pool;
5433 VkCommandPoolCreateInfo cmd_pool_ci = {};
5434 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5435 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
5436 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5437 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci,
5438 nullptr, &cmd_pool);
5439 ASSERT_VK_SUCCESS(err);
5440
5441 VkCommandBufferAllocateInfo cmd_buf_info = {};
5442 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5443 cmd_buf_info.commandPool = cmd_pool;
5444 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5445 cmd_buf_info.commandBufferCount = 1;
5446
5447 VkFenceCreateInfo fence_ci = {};
5448 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5449 fence_ci.pNext = nullptr;
5450 fence_ci.flags = 0;
5451
5452 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
5453 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info,
5454 &cmd_buffers[i]);
5455 ASSERT_VK_SUCCESS(err);
5456 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
5457 ASSERT_VK_SUCCESS(err);
5458 }
5459
5460 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
Tobin Ehlisf9025162016-05-26 06:55:21 -06005461 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
5462 // Create empty cmd buffer
5463 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
5464 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005465
Tobin Ehlisf9025162016-05-26 06:55:21 -06005466 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
5467 ASSERT_VK_SUCCESS(err);
5468 err = vkEndCommandBuffer(cmd_buffers[obj]);
5469 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005470
Tobin Ehlisf9025162016-05-26 06:55:21 -06005471 VkSubmitInfo submit_info = {};
5472 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5473 submit_info.commandBufferCount = 1;
5474 submit_info.pCommandBuffers = &cmd_buffers[obj];
5475 // Submit cmd buffer and wait for fence
5476 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
5477 ASSERT_VK_SUCCESS(err);
5478 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE,
5479 UINT64_MAX);
5480 ASSERT_VK_SUCCESS(err);
5481 err = vkResetFences(m_device->device(), 1, &fences[obj]);
5482 ASSERT_VK_SUCCESS(err);
5483 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005484 }
5485 m_errorMonitor->VerifyNotFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06005486 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
5487 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
5488 vkDestroyFence(m_device->device(), fences[i], nullptr);
5489 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005490}
5491// This is a positive test. No errors should be generated.
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005492TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
5493
5494 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5495 "submitted on separate queues followed by a QueueWaitIdle.");
5496
Dustin Graves48458142016-04-29 16:11:55 -06005497 if ((m_device->queue_props.empty()) ||
5498 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005499 return;
5500
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005501 m_errorMonitor->ExpectSuccess();
5502
5503 VkSemaphore semaphore;
5504 VkSemaphoreCreateInfo semaphore_create_info{};
5505 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5506 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5507 &semaphore);
5508
5509 VkCommandPool command_pool;
5510 VkCommandPoolCreateInfo pool_create_info{};
5511 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5512 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5513 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5514 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5515 &command_pool);
5516
5517 VkCommandBuffer command_buffer[2];
5518 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5519 command_buffer_allocate_info.sType =
5520 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5521 command_buffer_allocate_info.commandPool = command_pool;
5522 command_buffer_allocate_info.commandBufferCount = 2;
5523 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5524 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5525 command_buffer);
5526
5527 VkQueue queue = VK_NULL_HANDLE;
5528 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5529 1, &queue);
5530
5531 {
5532 VkCommandBufferBeginInfo begin_info{};
5533 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5534 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5535
5536 vkCmdPipelineBarrier(command_buffer[0],
5537 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5538 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5539 0, nullptr, 0, nullptr);
5540
5541 VkViewport viewport{};
5542 viewport.maxDepth = 1.0f;
5543 viewport.minDepth = 0.0f;
5544 viewport.width = 512;
5545 viewport.height = 512;
5546 viewport.x = 0;
5547 viewport.y = 0;
5548 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5549 vkEndCommandBuffer(command_buffer[0]);
5550 }
5551 {
5552 VkCommandBufferBeginInfo begin_info{};
5553 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5554 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5555
5556 VkViewport viewport{};
5557 viewport.maxDepth = 1.0f;
5558 viewport.minDepth = 0.0f;
5559 viewport.width = 512;
5560 viewport.height = 512;
5561 viewport.x = 0;
5562 viewport.y = 0;
5563 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5564 vkEndCommandBuffer(command_buffer[1]);
5565 }
5566 {
5567 VkSubmitInfo submit_info{};
5568 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5569 submit_info.commandBufferCount = 1;
5570 submit_info.pCommandBuffers = &command_buffer[0];
5571 submit_info.signalSemaphoreCount = 1;
5572 submit_info.pSignalSemaphores = &semaphore;
5573 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5574 }
5575 {
5576 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5577 VkSubmitInfo submit_info{};
5578 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5579 submit_info.commandBufferCount = 1;
5580 submit_info.pCommandBuffers = &command_buffer[1];
5581 submit_info.waitSemaphoreCount = 1;
5582 submit_info.pWaitSemaphores = &semaphore;
5583 submit_info.pWaitDstStageMask = flags;
5584 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5585 }
5586
5587 vkQueueWaitIdle(m_device->m_queue);
5588
5589 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5590 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5591 &command_buffer[0]);
5592 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5593
5594 m_errorMonitor->VerifyNotFound();
5595}
5596
5597// This is a positive test. No errors should be generated.
5598TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
5599
5600 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5601 "submitted on separate queues, the second having a fence"
5602 "followed by a QueueWaitIdle.");
5603
Dustin Graves48458142016-04-29 16:11:55 -06005604 if ((m_device->queue_props.empty()) ||
5605 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005606 return;
5607
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005608 m_errorMonitor->ExpectSuccess();
5609
5610 VkFence fence;
5611 VkFenceCreateInfo fence_create_info{};
5612 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5613 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5614
5615 VkSemaphore semaphore;
5616 VkSemaphoreCreateInfo semaphore_create_info{};
5617 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5618 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5619 &semaphore);
5620
5621 VkCommandPool command_pool;
5622 VkCommandPoolCreateInfo pool_create_info{};
5623 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5624 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5625 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5626 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5627 &command_pool);
5628
5629 VkCommandBuffer command_buffer[2];
5630 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5631 command_buffer_allocate_info.sType =
5632 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5633 command_buffer_allocate_info.commandPool = command_pool;
5634 command_buffer_allocate_info.commandBufferCount = 2;
5635 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5636 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5637 command_buffer);
5638
5639 VkQueue queue = VK_NULL_HANDLE;
5640 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5641 1, &queue);
5642
5643 {
5644 VkCommandBufferBeginInfo begin_info{};
5645 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5646 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5647
5648 vkCmdPipelineBarrier(command_buffer[0],
5649 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5650 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5651 0, nullptr, 0, nullptr);
5652
5653 VkViewport viewport{};
5654 viewport.maxDepth = 1.0f;
5655 viewport.minDepth = 0.0f;
5656 viewport.width = 512;
5657 viewport.height = 512;
5658 viewport.x = 0;
5659 viewport.y = 0;
5660 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5661 vkEndCommandBuffer(command_buffer[0]);
5662 }
5663 {
5664 VkCommandBufferBeginInfo begin_info{};
5665 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5666 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5667
5668 VkViewport viewport{};
5669 viewport.maxDepth = 1.0f;
5670 viewport.minDepth = 0.0f;
5671 viewport.width = 512;
5672 viewport.height = 512;
5673 viewport.x = 0;
5674 viewport.y = 0;
5675 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5676 vkEndCommandBuffer(command_buffer[1]);
5677 }
5678 {
5679 VkSubmitInfo submit_info{};
5680 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5681 submit_info.commandBufferCount = 1;
5682 submit_info.pCommandBuffers = &command_buffer[0];
5683 submit_info.signalSemaphoreCount = 1;
5684 submit_info.pSignalSemaphores = &semaphore;
5685 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5686 }
5687 {
5688 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5689 VkSubmitInfo submit_info{};
5690 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5691 submit_info.commandBufferCount = 1;
5692 submit_info.pCommandBuffers = &command_buffer[1];
5693 submit_info.waitSemaphoreCount = 1;
5694 submit_info.pWaitSemaphores = &semaphore;
5695 submit_info.pWaitDstStageMask = flags;
5696 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5697 }
5698
5699 vkQueueWaitIdle(m_device->m_queue);
5700
5701 vkDestroyFence(m_device->device(), fence, nullptr);
5702 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5703 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5704 &command_buffer[0]);
5705 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5706
5707 m_errorMonitor->VerifyNotFound();
5708}
5709
5710// This is a positive test. No errors should be generated.
5711TEST_F(VkLayerTest,
5712 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
5713
5714 TEST_DESCRIPTION(
5715 "Two command buffers, each in a separate QueueSubmit call "
5716 "submitted on separate queues, the second having a fence"
5717 "followed by two consecutive WaitForFences calls on the same fence.");
5718
Dustin Graves48458142016-04-29 16:11:55 -06005719 if ((m_device->queue_props.empty()) ||
5720 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005721 return;
5722
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005723 m_errorMonitor->ExpectSuccess();
5724
5725 VkFence fence;
5726 VkFenceCreateInfo fence_create_info{};
5727 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5728 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5729
5730 VkSemaphore semaphore;
5731 VkSemaphoreCreateInfo semaphore_create_info{};
5732 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5733 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5734 &semaphore);
5735
5736 VkCommandPool command_pool;
5737 VkCommandPoolCreateInfo pool_create_info{};
5738 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5739 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5740 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5741 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5742 &command_pool);
5743
5744 VkCommandBuffer command_buffer[2];
5745 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5746 command_buffer_allocate_info.sType =
5747 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5748 command_buffer_allocate_info.commandPool = command_pool;
5749 command_buffer_allocate_info.commandBufferCount = 2;
5750 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5751 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5752 command_buffer);
5753
5754 VkQueue queue = VK_NULL_HANDLE;
5755 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5756 1, &queue);
5757
5758 {
5759 VkCommandBufferBeginInfo begin_info{};
5760 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5761 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5762
5763 vkCmdPipelineBarrier(command_buffer[0],
5764 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5765 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5766 0, nullptr, 0, nullptr);
5767
5768 VkViewport viewport{};
5769 viewport.maxDepth = 1.0f;
5770 viewport.minDepth = 0.0f;
5771 viewport.width = 512;
5772 viewport.height = 512;
5773 viewport.x = 0;
5774 viewport.y = 0;
5775 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5776 vkEndCommandBuffer(command_buffer[0]);
5777 }
5778 {
5779 VkCommandBufferBeginInfo begin_info{};
5780 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5781 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5782
5783 VkViewport viewport{};
5784 viewport.maxDepth = 1.0f;
5785 viewport.minDepth = 0.0f;
5786 viewport.width = 512;
5787 viewport.height = 512;
5788 viewport.x = 0;
5789 viewport.y = 0;
5790 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5791 vkEndCommandBuffer(command_buffer[1]);
5792 }
5793 {
5794 VkSubmitInfo submit_info{};
5795 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5796 submit_info.commandBufferCount = 1;
5797 submit_info.pCommandBuffers = &command_buffer[0];
5798 submit_info.signalSemaphoreCount = 1;
5799 submit_info.pSignalSemaphores = &semaphore;
5800 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5801 }
5802 {
5803 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5804 VkSubmitInfo submit_info{};
5805 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5806 submit_info.commandBufferCount = 1;
5807 submit_info.pCommandBuffers = &command_buffer[1];
5808 submit_info.waitSemaphoreCount = 1;
5809 submit_info.pWaitSemaphores = &semaphore;
5810 submit_info.pWaitDstStageMask = flags;
5811 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5812 }
5813
5814 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5815 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5816
5817 vkDestroyFence(m_device->device(), fence, nullptr);
5818 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5819 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5820 &command_buffer[0]);
5821 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5822
5823 m_errorMonitor->VerifyNotFound();
5824}
5825
Chris Forbes0f8126b2016-06-20 17:48:22 +12005826TEST_F(VkLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
5827 if ((m_device->queue_props.empty()) ||
5828 (m_device->queue_props[0].queueCount < 2)) {
5829 printf("Test requires two queues, skipping\n");
5830 return;
5831 }
5832
5833 VkResult err;
5834
5835 m_errorMonitor->ExpectSuccess();
5836
5837 VkQueue q0 = m_device->m_queue;
5838 VkQueue q1 = nullptr;
5839 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
5840 ASSERT_NE(q1, nullptr);
5841
5842 // An (empty) command buffer. We must have work in the first submission --
5843 // the layer treats unfenced work differently from fenced work.
5844 VkCommandPoolCreateInfo cpci = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0 };
5845 VkCommandPool pool;
5846 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
5847 ASSERT_VK_SUCCESS(err);
5848 VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr,
5849 pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1
5850 };
5851 VkCommandBuffer cb;
5852 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
5853 ASSERT_VK_SUCCESS(err);
5854 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
5855 0, nullptr
5856 };
5857 err = vkBeginCommandBuffer(cb, &cbbi);
5858 ASSERT_VK_SUCCESS(err);
5859 err = vkEndCommandBuffer(cb);
5860 ASSERT_VK_SUCCESS(err);
5861
5862 // A semaphore
5863 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
5864 VkSemaphore s;
5865 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
5866 ASSERT_VK_SUCCESS(err);
5867
5868 // First submission, to q0
5869 VkSubmitInfo s0 = {
5870 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5871 0, nullptr, nullptr,
5872 1, &cb,
5873 1, &s
5874 };
5875
5876 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
5877 ASSERT_VK_SUCCESS(err);
5878
5879 // Second submission, to q1, waiting on s
5880 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
5881 VkSubmitInfo s1 = {
5882 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5883 1, &s, &waitmask,
5884 0, nullptr,
5885 0, nullptr
5886 };
5887
5888 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
5889 ASSERT_VK_SUCCESS(err);
5890
5891 // Wait for q0 idle
5892 err = vkQueueWaitIdle(q0);
5893 ASSERT_VK_SUCCESS(err);
5894
5895 // Command buffer should have been completed (it was on q0); reset the pool.
5896 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
5897
5898 m_errorMonitor->VerifyNotFound();
5899
5900 // Force device completely idle and clean up resources
5901 vkDeviceWaitIdle(m_device->device());
5902 vkDestroyCommandPool(m_device->device(), pool, nullptr);
5903 vkDestroySemaphore(m_device->device(), s, nullptr);
5904}
Chris Forbes0f8126b2016-06-20 17:48:22 +12005905
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005906// This is a positive test. No errors should be generated.
5907TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
5908
5909 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5910 "submitted on separate queues, the second having a fence, "
5911 "followed by a WaitForFences call.");
5912
Dustin Graves48458142016-04-29 16:11:55 -06005913 if ((m_device->queue_props.empty()) ||
5914 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005915 return;
5916
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005917 m_errorMonitor->ExpectSuccess();
5918
5919 VkFence fence;
5920 VkFenceCreateInfo fence_create_info{};
5921 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5922 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5923
5924 VkSemaphore semaphore;
5925 VkSemaphoreCreateInfo semaphore_create_info{};
5926 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5927 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5928 &semaphore);
5929
5930 VkCommandPool command_pool;
5931 VkCommandPoolCreateInfo pool_create_info{};
5932 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5933 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5934 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5935 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5936 &command_pool);
5937
5938 VkCommandBuffer command_buffer[2];
5939 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5940 command_buffer_allocate_info.sType =
5941 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5942 command_buffer_allocate_info.commandPool = command_pool;
5943 command_buffer_allocate_info.commandBufferCount = 2;
5944 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5945 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5946 command_buffer);
5947
5948 VkQueue queue = VK_NULL_HANDLE;
5949 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5950 1, &queue);
5951
5952
5953 {
5954 VkCommandBufferBeginInfo begin_info{};
5955 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5956 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5957
5958 vkCmdPipelineBarrier(command_buffer[0],
5959 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5960 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5961 0, nullptr, 0, nullptr);
5962
5963 VkViewport viewport{};
5964 viewport.maxDepth = 1.0f;
5965 viewport.minDepth = 0.0f;
5966 viewport.width = 512;
5967 viewport.height = 512;
5968 viewport.x = 0;
5969 viewport.y = 0;
5970 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5971 vkEndCommandBuffer(command_buffer[0]);
5972 }
5973 {
5974 VkCommandBufferBeginInfo begin_info{};
5975 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5976 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5977
5978 VkViewport viewport{};
5979 viewport.maxDepth = 1.0f;
5980 viewport.minDepth = 0.0f;
5981 viewport.width = 512;
5982 viewport.height = 512;
5983 viewport.x = 0;
5984 viewport.y = 0;
5985 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5986 vkEndCommandBuffer(command_buffer[1]);
5987 }
5988 {
5989 VkSubmitInfo submit_info{};
5990 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5991 submit_info.commandBufferCount = 1;
5992 submit_info.pCommandBuffers = &command_buffer[0];
5993 submit_info.signalSemaphoreCount = 1;
5994 submit_info.pSignalSemaphores = &semaphore;
5995 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5996 }
5997 {
5998 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5999 VkSubmitInfo submit_info{};
6000 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6001 submit_info.commandBufferCount = 1;
6002 submit_info.pCommandBuffers = &command_buffer[1];
6003 submit_info.waitSemaphoreCount = 1;
6004 submit_info.pWaitSemaphores = &semaphore;
6005 submit_info.pWaitDstStageMask = flags;
6006 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6007 }
6008
6009 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6010
6011 vkDestroyFence(m_device->device(), fence, nullptr);
6012 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
6013 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6014 &command_buffer[0]);
6015 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6016
6017 m_errorMonitor->VerifyNotFound();
6018}
6019
6020// This is a positive test. No errors should be generated.
6021TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
6022
6023 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
6024 "on the same queue, sharing a signal/wait semaphore, the "
6025 "second having a fence, "
6026 "followed by a WaitForFences call.");
6027
6028 m_errorMonitor->ExpectSuccess();
6029
6030 VkFence fence;
6031 VkFenceCreateInfo fence_create_info{};
6032 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6033 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6034
6035 VkSemaphore semaphore;
6036 VkSemaphoreCreateInfo semaphore_create_info{};
6037 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6038 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
6039 &semaphore);
6040
6041 VkCommandPool command_pool;
6042 VkCommandPoolCreateInfo pool_create_info{};
6043 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6044 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6045 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6046 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6047 &command_pool);
6048
6049 VkCommandBuffer command_buffer[2];
6050 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6051 command_buffer_allocate_info.sType =
6052 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6053 command_buffer_allocate_info.commandPool = command_pool;
6054 command_buffer_allocate_info.commandBufferCount = 2;
6055 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6056 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6057 command_buffer);
6058
6059 {
6060 VkCommandBufferBeginInfo begin_info{};
6061 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6062 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6063
6064 vkCmdPipelineBarrier(command_buffer[0],
6065 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6066 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6067 0, nullptr, 0, nullptr);
6068
6069 VkViewport viewport{};
6070 viewport.maxDepth = 1.0f;
6071 viewport.minDepth = 0.0f;
6072 viewport.width = 512;
6073 viewport.height = 512;
6074 viewport.x = 0;
6075 viewport.y = 0;
6076 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6077 vkEndCommandBuffer(command_buffer[0]);
6078 }
6079 {
6080 VkCommandBufferBeginInfo begin_info{};
6081 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6082 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6083
6084 VkViewport viewport{};
6085 viewport.maxDepth = 1.0f;
6086 viewport.minDepth = 0.0f;
6087 viewport.width = 512;
6088 viewport.height = 512;
6089 viewport.x = 0;
6090 viewport.y = 0;
6091 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6092 vkEndCommandBuffer(command_buffer[1]);
6093 }
6094 {
6095 VkSubmitInfo submit_info{};
6096 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6097 submit_info.commandBufferCount = 1;
6098 submit_info.pCommandBuffers = &command_buffer[0];
6099 submit_info.signalSemaphoreCount = 1;
6100 submit_info.pSignalSemaphores = &semaphore;
6101 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6102 }
6103 {
6104 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6105 VkSubmitInfo submit_info{};
6106 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6107 submit_info.commandBufferCount = 1;
6108 submit_info.pCommandBuffers = &command_buffer[1];
6109 submit_info.waitSemaphoreCount = 1;
6110 submit_info.pWaitSemaphores = &semaphore;
6111 submit_info.pWaitDstStageMask = flags;
6112 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6113 }
6114
6115 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6116
6117 vkDestroyFence(m_device->device(), fence, nullptr);
6118 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
6119 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6120 &command_buffer[0]);
6121 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6122
6123 m_errorMonitor->VerifyNotFound();
6124}
6125
6126// This is a positive test. No errors should be generated.
6127TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
6128
6129 TEST_DESCRIPTION(
6130 "Two command buffers, each in a separate QueueSubmit call "
6131 "on the same queue, no fences, followed by a third QueueSubmit with NO "
6132 "SubmitInfos but with a fence, followed by a WaitForFences call.");
6133
6134 m_errorMonitor->ExpectSuccess();
6135
6136 VkFence fence;
6137 VkFenceCreateInfo fence_create_info{};
6138 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6139 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6140
6141 VkCommandPool command_pool;
6142 VkCommandPoolCreateInfo pool_create_info{};
6143 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6144 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6145 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6146 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6147 &command_pool);
6148
6149 VkCommandBuffer command_buffer[2];
6150 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6151 command_buffer_allocate_info.sType =
6152 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6153 command_buffer_allocate_info.commandPool = command_pool;
6154 command_buffer_allocate_info.commandBufferCount = 2;
6155 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6156 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6157 command_buffer);
6158
6159 {
6160 VkCommandBufferBeginInfo begin_info{};
6161 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6162 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6163
6164 vkCmdPipelineBarrier(command_buffer[0],
6165 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6166 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6167 0, nullptr, 0, nullptr);
6168
6169 VkViewport viewport{};
6170 viewport.maxDepth = 1.0f;
6171 viewport.minDepth = 0.0f;
6172 viewport.width = 512;
6173 viewport.height = 512;
6174 viewport.x = 0;
6175 viewport.y = 0;
6176 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6177 vkEndCommandBuffer(command_buffer[0]);
6178 }
6179 {
6180 VkCommandBufferBeginInfo begin_info{};
6181 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6182 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6183
6184 VkViewport viewport{};
6185 viewport.maxDepth = 1.0f;
6186 viewport.minDepth = 0.0f;
6187 viewport.width = 512;
6188 viewport.height = 512;
6189 viewport.x = 0;
6190 viewport.y = 0;
6191 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6192 vkEndCommandBuffer(command_buffer[1]);
6193 }
6194 {
6195 VkSubmitInfo submit_info{};
6196 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6197 submit_info.commandBufferCount = 1;
6198 submit_info.pCommandBuffers = &command_buffer[0];
6199 submit_info.signalSemaphoreCount = 0;
6200 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
6201 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6202 }
6203 {
6204 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6205 VkSubmitInfo submit_info{};
6206 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6207 submit_info.commandBufferCount = 1;
6208 submit_info.pCommandBuffers = &command_buffer[1];
6209 submit_info.waitSemaphoreCount = 0;
6210 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
6211 submit_info.pWaitDstStageMask = flags;
6212 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6213 }
6214
6215 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
6216
Mike Stroyancd1c3e52016-06-21 09:20:01 -06006217 VkResult err =
6218 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6219 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006220
6221 vkDestroyFence(m_device->device(), fence, nullptr);
6222 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6223 &command_buffer[0]);
6224 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6225
6226 m_errorMonitor->VerifyNotFound();
6227}
6228
6229// This is a positive test. No errors should be generated.
6230TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
6231
6232 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
6233 "on the same queue, the second having a fence, followed "
6234 "by a WaitForFences call.");
6235
6236 m_errorMonitor->ExpectSuccess();
6237
6238 VkFence fence;
6239 VkFenceCreateInfo fence_create_info{};
6240 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6241 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6242
6243 VkCommandPool command_pool;
6244 VkCommandPoolCreateInfo pool_create_info{};
6245 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6246 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6247 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6248 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6249 &command_pool);
6250
6251 VkCommandBuffer command_buffer[2];
6252 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6253 command_buffer_allocate_info.sType =
6254 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6255 command_buffer_allocate_info.commandPool = command_pool;
6256 command_buffer_allocate_info.commandBufferCount = 2;
6257 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6258 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6259 command_buffer);
6260
6261 {
6262 VkCommandBufferBeginInfo begin_info{};
6263 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6264 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6265
6266 vkCmdPipelineBarrier(command_buffer[0],
6267 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6268 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6269 0, nullptr, 0, nullptr);
6270
6271 VkViewport viewport{};
6272 viewport.maxDepth = 1.0f;
6273 viewport.minDepth = 0.0f;
6274 viewport.width = 512;
6275 viewport.height = 512;
6276 viewport.x = 0;
6277 viewport.y = 0;
6278 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6279 vkEndCommandBuffer(command_buffer[0]);
6280 }
6281 {
6282 VkCommandBufferBeginInfo begin_info{};
6283 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6284 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6285
6286 VkViewport viewport{};
6287 viewport.maxDepth = 1.0f;
6288 viewport.minDepth = 0.0f;
6289 viewport.width = 512;
6290 viewport.height = 512;
6291 viewport.x = 0;
6292 viewport.y = 0;
6293 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6294 vkEndCommandBuffer(command_buffer[1]);
6295 }
6296 {
6297 VkSubmitInfo submit_info{};
6298 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6299 submit_info.commandBufferCount = 1;
6300 submit_info.pCommandBuffers = &command_buffer[0];
6301 submit_info.signalSemaphoreCount = 0;
6302 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
6303 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6304 }
6305 {
6306 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6307 VkSubmitInfo submit_info{};
6308 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6309 submit_info.commandBufferCount = 1;
6310 submit_info.pCommandBuffers = &command_buffer[1];
6311 submit_info.waitSemaphoreCount = 0;
6312 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
6313 submit_info.pWaitDstStageMask = flags;
6314 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6315 }
6316
6317 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6318
6319 vkDestroyFence(m_device->device(), fence, nullptr);
6320 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6321 &command_buffer[0]);
6322 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6323
6324 m_errorMonitor->VerifyNotFound();
6325}
6326
6327// This is a positive test. No errors should be generated.
6328TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
6329
6330 TEST_DESCRIPTION(
6331 "Two command buffers each in a separate SubmitInfo sent in a single "
6332 "QueueSubmit call followed by a WaitForFences call.");
6333
6334 m_errorMonitor->ExpectSuccess();
6335
6336 VkFence fence;
6337 VkFenceCreateInfo fence_create_info{};
6338 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6339 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6340
6341 VkSemaphore semaphore;
6342 VkSemaphoreCreateInfo semaphore_create_info{};
6343 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6344 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
6345 &semaphore);
6346
6347 VkCommandPool command_pool;
6348 VkCommandPoolCreateInfo pool_create_info{};
6349 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6350 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6351 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6352 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6353 &command_pool);
6354
6355 VkCommandBuffer command_buffer[2];
6356 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6357 command_buffer_allocate_info.sType =
6358 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6359 command_buffer_allocate_info.commandPool = command_pool;
6360 command_buffer_allocate_info.commandBufferCount = 2;
6361 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6362 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6363 command_buffer);
6364
6365 {
6366 VkCommandBufferBeginInfo begin_info{};
6367 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6368 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6369
6370 vkCmdPipelineBarrier(command_buffer[0],
6371 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6372 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6373 0, nullptr, 0, nullptr);
6374
6375 VkViewport viewport{};
6376 viewport.maxDepth = 1.0f;
6377 viewport.minDepth = 0.0f;
6378 viewport.width = 512;
6379 viewport.height = 512;
6380 viewport.x = 0;
6381 viewport.y = 0;
6382 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6383 vkEndCommandBuffer(command_buffer[0]);
6384 }
6385 {
6386 VkCommandBufferBeginInfo begin_info{};
6387 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6388 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6389
6390 VkViewport viewport{};
6391 viewport.maxDepth = 1.0f;
6392 viewport.minDepth = 0.0f;
6393 viewport.width = 512;
6394 viewport.height = 512;
6395 viewport.x = 0;
6396 viewport.y = 0;
6397 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6398 vkEndCommandBuffer(command_buffer[1]);
6399 }
6400 {
6401 VkSubmitInfo submit_info[2];
6402 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6403
6404 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6405 submit_info[0].pNext = NULL;
6406 submit_info[0].commandBufferCount = 1;
6407 submit_info[0].pCommandBuffers = &command_buffer[0];
6408 submit_info[0].signalSemaphoreCount = 1;
6409 submit_info[0].pSignalSemaphores = &semaphore;
6410 submit_info[0].waitSemaphoreCount = 0;
6411 submit_info[0].pWaitSemaphores = NULL;
6412 submit_info[0].pWaitDstStageMask = 0;
6413
6414 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6415 submit_info[1].pNext = NULL;
6416 submit_info[1].commandBufferCount = 1;
6417 submit_info[1].pCommandBuffers = &command_buffer[1];
6418 submit_info[1].waitSemaphoreCount = 1;
6419 submit_info[1].pWaitSemaphores = &semaphore;
6420 submit_info[1].pWaitDstStageMask = flags;
6421 submit_info[1].signalSemaphoreCount = 0;
6422 submit_info[1].pSignalSemaphores = NULL;
6423 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
6424 }
6425
6426 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6427
6428 vkDestroyFence(m_device->device(), fence, nullptr);
6429 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6430 &command_buffer[0]);
6431 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006432 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006433
6434 m_errorMonitor->VerifyNotFound();
6435}
6436
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006437TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006438 TEST_DESCRIPTION(
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006439 "Run a simple draw calls to validate failure when Depth Bias dynamic "
6440 "state is required but not correctly bound.");
6441
6442 // Dynamic depth bias
6443 m_errorMonitor->SetDesiredFailureMsg(
6444 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6445 "Dynamic depth bias state not set for this command buffer");
6446 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6447 BsoFailDepthBias);
6448 m_errorMonitor->VerifyFound();
6449}
6450
6451TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
6452 TEST_DESCRIPTION(
6453 "Run a simple draw calls to validate failure when Line Width dynamic "
6454 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006455
6456 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07006457 m_errorMonitor->SetDesiredFailureMsg(
6458 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006459 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006460 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6461 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006462 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006463}
6464
6465TEST_F(VkLayerTest, DynamicViewportNotBound) {
6466 TEST_DESCRIPTION(
6467 "Run a simple draw calls to validate failure when Viewport dynamic "
6468 "state is required but not correctly bound.");
6469
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006470 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07006471 m_errorMonitor->SetDesiredFailureMsg(
6472 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006473 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006474 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6475 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006476 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006477}
6478
6479TEST_F(VkLayerTest, DynamicScissorNotBound) {
6480 TEST_DESCRIPTION(
6481 "Run a simple draw calls to validate failure when Scissor dynamic "
6482 "state is required but not correctly bound.");
6483
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006484 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07006485 m_errorMonitor->SetDesiredFailureMsg(
6486 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006487 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006488 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6489 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006490 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006491}
6492
Cortd713fe82016-07-27 09:51:27 -07006493TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006494 TEST_DESCRIPTION(
Tobin Ehlis21c88352016-05-26 06:15:45 -06006495 "Run a simple draw calls to validate failure when Blend Constants "
6496 "dynamic state is required but not correctly bound.");
6497 // Dynamic blend constant state
6498 m_errorMonitor->SetDesiredFailureMsg(
6499 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6500 "Dynamic blend constants state not set for this command buffer");
6501 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6502 BsoFailBlend);
6503 m_errorMonitor->VerifyFound();
6504}
6505
6506TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
6507 TEST_DESCRIPTION(
6508 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006509 "state is required but not correctly bound.");
Tobin Ehlis21c88352016-05-26 06:15:45 -06006510 if (!m_device->phy().features().depthBounds) {
6511 printf("Device does not support depthBounds test; skipped.\n");
6512 return;
6513 }
6514 // Dynamic depth bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006515 m_errorMonitor->SetDesiredFailureMsg(
6516 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006517 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006518 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6519 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006520 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006521}
6522
6523TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
6524 TEST_DESCRIPTION(
6525 "Run a simple draw calls to validate failure when Stencil Read dynamic "
6526 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006527 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07006528 m_errorMonitor->SetDesiredFailureMsg(
6529 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006530 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006531 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6532 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006533 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006534}
6535
6536TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
6537 TEST_DESCRIPTION(
6538 "Run a simple draw calls to validate failure when Stencil Write dynamic"
6539 " state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006540 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07006541 m_errorMonitor->SetDesiredFailureMsg(
6542 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006543 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006544 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6545 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006546 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006547}
6548
6549TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
6550 TEST_DESCRIPTION(
6551 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
6552 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006553 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07006554 m_errorMonitor->SetDesiredFailureMsg(
6555 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006556 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006557 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6558 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006559 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06006560}
6561
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06006562TEST_F(VkLayerTest, IndexBufferNotBound) {
6563 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
6564 m_errorMonitor->SetDesiredFailureMsg(
6565 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6566 "Index buffer object not bound to this command buffer when Indexed ");
6567 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6568 BsoFailIndexBuffer);
6569 m_errorMonitor->VerifyFound();
6570}
6571
Karl Schultz6addd812016-02-02 17:17:23 -07006572TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Karl Schultz6addd812016-02-02 17:17:23 -07006573 m_errorMonitor->SetDesiredFailureMsg(
6574 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6575 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
6576 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006577
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006578 ASSERT_NO_FATAL_FAILURE(InitState());
6579 ASSERT_NO_FATAL_FAILURE(InitViewport());
6580 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6581
Karl Schultz6addd812016-02-02 17:17:23 -07006582 // We luck out b/c by default the framework creates CB w/ the
6583 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006584 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006585 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
6586 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006587 EndCommandBuffer();
6588
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006589 // Bypass framework since it does the waits automatically
6590 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006591 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08006592 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6593 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006594 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006595 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07006596 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006597 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006598 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08006599 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006600 submit_info.pSignalSemaphores = NULL;
6601
Chris Forbes40028e22016-06-13 09:59:34 +12006602 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07006603 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006604
Karl Schultz6addd812016-02-02 17:17:23 -07006605 // Cause validation error by re-submitting cmd buffer that should only be
6606 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12006607 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006608
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006609 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006610}
6611
Karl Schultz6addd812016-02-02 17:17:23 -07006612TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006613 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07006614 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006615
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006617 "Unable to allocate 1 descriptors of "
6618 "type "
6619 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006620
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006621 ASSERT_NO_FATAL_FAILURE(InitState());
6622 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006623
Karl Schultz6addd812016-02-02 17:17:23 -07006624 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
6625 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006626 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006627 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6628 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006629
6630 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006631 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6632 ds_pool_ci.pNext = NULL;
6633 ds_pool_ci.flags = 0;
6634 ds_pool_ci.maxSets = 1;
6635 ds_pool_ci.poolSizeCount = 1;
6636 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006637
6638 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006639 err =
6640 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006641 ASSERT_VK_SUCCESS(err);
6642
6643 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006644 dsl_binding.binding = 0;
6645 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6646 dsl_binding.descriptorCount = 1;
6647 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6648 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006649
6650 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006651 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6652 ds_layout_ci.pNext = NULL;
6653 ds_layout_ci.bindingCount = 1;
6654 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006655
6656 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006657 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6658 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006659 ASSERT_VK_SUCCESS(err);
6660
6661 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006662 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006663 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006664 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006665 alloc_info.descriptorPool = ds_pool;
6666 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006667 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6668 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006669
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006670 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006671
Chia-I Wuf7458c52015-10-26 21:10:41 +08006672 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6673 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006674}
6675
Karl Schultz6addd812016-02-02 17:17:23 -07006676TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
6677 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06006678
Karl Schultz6addd812016-02-02 17:17:23 -07006679 m_errorMonitor->SetDesiredFailureMsg(
6680 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6681 "It is invalid to call vkFreeDescriptorSets() with a pool created "
6682 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006683
Tobin Ehlise735c692015-10-08 13:13:50 -06006684 ASSERT_NO_FATAL_FAILURE(InitState());
6685 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06006686
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006687 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006688 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6689 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06006690
6691 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006692 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6693 ds_pool_ci.pNext = NULL;
6694 ds_pool_ci.maxSets = 1;
6695 ds_pool_ci.poolSizeCount = 1;
6696 ds_pool_ci.flags = 0;
6697 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
6698 // app can only call vkResetDescriptorPool on this pool.;
6699 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06006700
6701 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006702 err =
6703 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06006704 ASSERT_VK_SUCCESS(err);
6705
6706 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006707 dsl_binding.binding = 0;
6708 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6709 dsl_binding.descriptorCount = 1;
6710 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6711 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06006712
6713 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006714 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6715 ds_layout_ci.pNext = NULL;
6716 ds_layout_ci.bindingCount = 1;
6717 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06006718
6719 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006720 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6721 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06006722 ASSERT_VK_SUCCESS(err);
6723
6724 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006725 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006726 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006727 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006728 alloc_info.descriptorPool = ds_pool;
6729 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006730 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6731 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06006732 ASSERT_VK_SUCCESS(err);
6733
6734 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006735 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06006736
Chia-I Wuf7458c52015-10-26 21:10:41 +08006737 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6738 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06006739}
6740
Karl Schultz6addd812016-02-02 17:17:23 -07006741TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006742 // Attempt to clear Descriptor Pool with bad object.
6743 // ObjectTracker should catch this.
6744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006745 "Invalid Descriptor Pool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006746 uint64_t fake_pool_handle = 0xbaad6001;
6747 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
6748 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06006749 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006750}
6751
Karl Schultz6addd812016-02-02 17:17:23 -07006752TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006753 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
6754 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006755 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06006756 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006757
6758 uint64_t fake_set_handle = 0xbaad6001;
6759 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006760 VkResult err;
6761 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006762 "Invalid Descriptor Set Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06006763
6764 ASSERT_NO_FATAL_FAILURE(InitState());
6765
6766 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
6767 layout_bindings[0].binding = 0;
6768 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6769 layout_bindings[0].descriptorCount = 1;
6770 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
6771 layout_bindings[0].pImmutableSamplers = NULL;
6772
6773 VkDescriptorSetLayout descriptor_set_layout;
6774 VkDescriptorSetLayoutCreateInfo dslci = {};
6775 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6776 dslci.pNext = NULL;
6777 dslci.bindingCount = 1;
6778 dslci.pBindings = layout_bindings;
6779 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006780 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006781
6782 VkPipelineLayout pipeline_layout;
6783 VkPipelineLayoutCreateInfo plci = {};
6784 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6785 plci.pNext = NULL;
6786 plci.setLayoutCount = 1;
6787 plci.pSetLayouts = &descriptor_set_layout;
6788 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006789 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006790
6791 BeginCommandBuffer();
6792 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006793 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06006794 m_errorMonitor->VerifyFound();
6795 EndCommandBuffer();
6796 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
6797 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006798}
6799
Karl Schultz6addd812016-02-02 17:17:23 -07006800TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006801 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
6802 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006803 uint64_t fake_layout_handle = 0xbaad6001;
6804 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006806 "Invalid Descriptor Set Layout Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06006807
6808 VkPipelineLayout pipeline_layout;
6809 VkPipelineLayoutCreateInfo plci = {};
6810 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6811 plci.pNext = NULL;
6812 plci.setLayoutCount = 1;
6813 plci.pSetLayouts = &bad_layout;
6814 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
6815
6816 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006817}
6818
Mark Muellerd4914412016-06-13 17:52:06 -06006819TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
6820 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
6821 "1) A uniform buffer update must have a valid buffer index."
6822 "2) When using an array of descriptors in a single WriteDescriptor,"
6823 " the descriptor types and stageflags must all be the same."
6824 "3) Immutable Sampler state must match across descriptors");
6825
6826 const char *invalid_BufferInfo_ErrorMessage =
6827 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
6828 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
6829 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
6830 const char *stateFlag_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006831 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006832 const char *immutable_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006833 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006834
Mark Muellerd4914412016-06-13 17:52:06 -06006835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
6836
6837 ASSERT_NO_FATAL_FAILURE(InitState());
6838 VkDescriptorPoolSize ds_type_count[4] = {};
6839 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6840 ds_type_count[0].descriptorCount = 1;
6841 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6842 ds_type_count[1].descriptorCount = 1;
6843 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6844 ds_type_count[2].descriptorCount = 1;
6845 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6846 ds_type_count[3].descriptorCount = 1;
6847
6848 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6849 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6850 ds_pool_ci.maxSets = 1;
6851 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
6852 ds_pool_ci.pPoolSizes = ds_type_count;
6853
6854 VkDescriptorPool ds_pool;
6855 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6856 ASSERT_VK_SUCCESS(err);
6857
Mark Muellerb9896722016-06-16 09:54:29 -06006858 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006859 layout_binding[0].binding = 0;
6860 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6861 layout_binding[0].descriptorCount = 1;
6862 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6863 layout_binding[0].pImmutableSamplers = NULL;
6864
6865 layout_binding[1].binding = 1;
6866 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6867 layout_binding[1].descriptorCount = 1;
6868 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6869 layout_binding[1].pImmutableSamplers = NULL;
6870
6871 VkSamplerCreateInfo sampler_ci = {};
6872 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6873 sampler_ci.pNext = NULL;
6874 sampler_ci.magFilter = VK_FILTER_NEAREST;
6875 sampler_ci.minFilter = VK_FILTER_NEAREST;
6876 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6877 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6878 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6879 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6880 sampler_ci.mipLodBias = 1.0;
6881 sampler_ci.anisotropyEnable = VK_FALSE;
6882 sampler_ci.maxAnisotropy = 1;
6883 sampler_ci.compareEnable = VK_FALSE;
6884 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6885 sampler_ci.minLod = 1.0;
6886 sampler_ci.maxLod = 1.0;
6887 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6888 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6889 VkSampler sampler;
6890
6891 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6892 ASSERT_VK_SUCCESS(err);
6893
6894 layout_binding[2].binding = 2;
6895 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6896 layout_binding[2].descriptorCount = 1;
6897 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6898 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
6899
Mark Muellerd4914412016-06-13 17:52:06 -06006900 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6901 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6902 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
6903 ds_layout_ci.pBindings = layout_binding;
6904 VkDescriptorSetLayout ds_layout;
6905 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6906 ASSERT_VK_SUCCESS(err);
6907
6908 VkDescriptorSetAllocateInfo alloc_info = {};
6909 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6910 alloc_info.descriptorSetCount = 1;
6911 alloc_info.descriptorPool = ds_pool;
6912 alloc_info.pSetLayouts = &ds_layout;
6913 VkDescriptorSet descriptorSet;
6914 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6915 ASSERT_VK_SUCCESS(err);
6916
6917 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6918 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6919 pipeline_layout_ci.pNext = NULL;
6920 pipeline_layout_ci.setLayoutCount = 1;
6921 pipeline_layout_ci.pSetLayouts = &ds_layout;
6922
6923 VkPipelineLayout pipeline_layout;
6924 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6925 ASSERT_VK_SUCCESS(err);
6926
Mark Mueller5c838ce2016-06-16 09:54:29 -06006927 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006928 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6929 descriptor_write.dstSet = descriptorSet;
6930 descriptor_write.dstBinding = 0;
6931 descriptor_write.descriptorCount = 1;
6932 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6933
Mark Mueller5c838ce2016-06-16 09:54:29 -06006934 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06006935 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6936 m_errorMonitor->VerifyFound();
6937
6938 // Create a buffer to update the descriptor with
6939 uint32_t qfi = 0;
6940 VkBufferCreateInfo buffCI = {};
6941 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6942 buffCI.size = 1024;
6943 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6944 buffCI.queueFamilyIndexCount = 1;
6945 buffCI.pQueueFamilyIndices = &qfi;
6946
6947 VkBuffer dyub;
6948 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6949 ASSERT_VK_SUCCESS(err);
6950 VkDescriptorBufferInfo buffInfo = {};
6951 buffInfo.buffer = dyub;
6952 buffInfo.offset = 0;
6953 buffInfo.range = 1024;
6954
6955 descriptor_write.pBufferInfo = &buffInfo;
6956 descriptor_write.descriptorCount = 2;
6957
Mark Mueller5c838ce2016-06-16 09:54:29 -06006958 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06006959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
6960 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6961 m_errorMonitor->VerifyFound();
6962
Mark Mueller5c838ce2016-06-16 09:54:29 -06006963 // 3) The second descriptor has a null_ptr pImmutableSamplers and
6964 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06006965 descriptor_write.dstBinding = 1;
6966 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06006967
6968
6969 // Make pImageInfo index non-null to avoid complaints of it missing
6970 VkDescriptorImageInfo imageInfo = {};
6971 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6972 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06006973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
6974 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6975 m_errorMonitor->VerifyFound();
6976
Mark Muellerd4914412016-06-13 17:52:06 -06006977 vkDestroyBuffer(m_device->device(), dyub, NULL);
6978 vkDestroySampler(m_device->device(), sampler, NULL);
6979 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6980 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6981 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6982}
6983
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06006984TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
6985 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6986 "due to a buffer dependency being destroyed.");
6987 ASSERT_NO_FATAL_FAILURE(InitState());
6988
6989 VkImageObj image(m_device);
6990 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6991 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
6992 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
6993 VK_IMAGE_TILING_OPTIMAL, 0);
6994 ASSERT_TRUE(image.initialized());
6995
6996 VkBuffer buffer;
6997 VkDeviceMemory mem;
6998 VkMemoryRequirements mem_reqs;
6999
7000 VkBufferCreateInfo buf_info = {};
7001 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7002 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7003 buf_info.size = 256;
7004 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7005 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
7006 ASSERT_VK_SUCCESS(err);
7007
7008 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
7009
7010 VkMemoryAllocateInfo alloc_info = {};
7011 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7012 alloc_info.allocationSize = 256;
7013 bool pass = false;
7014 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
7015 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
7016 if (!pass) {
7017 vkDestroyBuffer(m_device->device(), buffer, NULL);
7018 return;
7019 }
7020 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
7021 ASSERT_VK_SUCCESS(err);
7022
7023 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
7024 ASSERT_VK_SUCCESS(err);
7025
7026 VkBufferImageCopy region = {};
7027 region.bufferRowLength = 128;
7028 region.bufferImageHeight = 128;
7029 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7030
7031 region.imageSubresource.layerCount = 1;
7032 region.imageExtent.height = 4;
7033 region.imageExtent.width = 4;
7034 region.imageExtent.depth = 1;
7035 m_commandBuffer->BeginCommandBuffer();
7036 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
7037 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
7038 1, &region);
7039 m_commandBuffer->EndCommandBuffer();
7040
7041 m_errorMonitor->SetDesiredFailureMsg(
7042 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7043 " that is invalid because bound buffer ");
7044 // Destroy buffer dependency prior to submit to cause ERROR
7045 vkDestroyBuffer(m_device->device(), buffer, NULL);
7046
7047 VkSubmitInfo submit_info = {};
7048 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7049 submit_info.commandBufferCount = 1;
7050 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7051 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7052
7053 m_errorMonitor->VerifyFound();
7054 vkFreeMemory(m_device->handle(), mem, NULL);
7055}
7056
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007057TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
7058 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7059 "due to an image dependency being destroyed.");
7060 ASSERT_NO_FATAL_FAILURE(InitState());
7061
7062 VkImage image;
7063 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7064 VkImageCreateInfo image_create_info = {};
7065 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7066 image_create_info.pNext = NULL;
7067 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7068 image_create_info.format = tex_format;
7069 image_create_info.extent.width = 32;
7070 image_create_info.extent.height = 32;
7071 image_create_info.extent.depth = 1;
7072 image_create_info.mipLevels = 1;
7073 image_create_info.arrayLayers = 1;
7074 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7075 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7076 image_create_info.usage =
7077 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7078 image_create_info.flags = 0;
7079 VkResult err =
7080 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7081 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007082 // Have to bind memory to image before recording cmd in cmd buffer using it
7083 VkMemoryRequirements mem_reqs;
7084 VkDeviceMemory image_mem;
7085 bool pass;
7086 VkMemoryAllocateInfo mem_alloc = {};
7087 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7088 mem_alloc.pNext = NULL;
7089 mem_alloc.memoryTypeIndex = 0;
7090 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
7091 mem_alloc.allocationSize = mem_reqs.size;
7092 pass =
7093 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
7094 ASSERT_TRUE(pass);
7095 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
7096 ASSERT_VK_SUCCESS(err);
7097 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
7098 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007099
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007100 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06007101 VkClearColorValue ccv;
7102 ccv.float32[0] = 1.0f;
7103 ccv.float32[1] = 1.0f;
7104 ccv.float32[2] = 1.0f;
7105 ccv.float32[3] = 1.0f;
7106 VkImageSubresourceRange isr = {};
7107 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007108 isr.baseArrayLayer = 0;
7109 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06007110 isr.layerCount = 1;
7111 isr.levelCount = 1;
7112 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
7113 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007114 m_commandBuffer->EndCommandBuffer();
7115
7116 m_errorMonitor->SetDesiredFailureMsg(
7117 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
7118 // Destroy image dependency prior to submit to cause ERROR
7119 vkDestroyImage(m_device->device(), image, NULL);
7120
7121 VkSubmitInfo submit_info = {};
7122 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7123 submit_info.commandBufferCount = 1;
7124 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7125 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7126
7127 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007128 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007129}
7130
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007131TEST_F(VkLayerTest, ImageMemoryNotBound) {
7132 TEST_DESCRIPTION(
7133 "Attempt to draw with an image which has not had memory bound to it.");
7134 ASSERT_NO_FATAL_FAILURE(InitState());
7135
7136 VkImage image;
7137 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7138 VkImageCreateInfo image_create_info = {};
7139 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7140 image_create_info.pNext = NULL;
7141 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7142 image_create_info.format = tex_format;
7143 image_create_info.extent.width = 32;
7144 image_create_info.extent.height = 32;
7145 image_create_info.extent.depth = 1;
7146 image_create_info.mipLevels = 1;
7147 image_create_info.arrayLayers = 1;
7148 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7149 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7150 image_create_info.usage =
7151 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7152 image_create_info.flags = 0;
7153 VkResult err =
7154 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7155 ASSERT_VK_SUCCESS(err);
7156 // Have to bind memory to image before recording cmd in cmd buffer using it
7157 VkMemoryRequirements mem_reqs;
7158 VkDeviceMemory image_mem;
7159 bool pass;
7160 VkMemoryAllocateInfo mem_alloc = {};
7161 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7162 mem_alloc.pNext = NULL;
7163 mem_alloc.memoryTypeIndex = 0;
7164 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
7165 mem_alloc.allocationSize = mem_reqs.size;
7166 pass =
7167 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
7168 ASSERT_TRUE(pass);
7169 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
7170 ASSERT_VK_SUCCESS(err);
7171
7172 // Introduce error, do not call vkBindImageMemory(m_device->device(), image,
7173 // image_mem, 0);
7174 m_errorMonitor->SetDesiredFailureMsg(
7175 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7176 "used without first calling vkBindImageMemory");
7177
7178 m_commandBuffer->BeginCommandBuffer();
7179 VkClearColorValue ccv;
7180 ccv.float32[0] = 1.0f;
7181 ccv.float32[1] = 1.0f;
7182 ccv.float32[2] = 1.0f;
7183 ccv.float32[3] = 1.0f;
7184 VkImageSubresourceRange isr = {};
7185 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7186 isr.baseArrayLayer = 0;
7187 isr.baseMipLevel = 0;
7188 isr.layerCount = 1;
7189 isr.levelCount = 1;
7190 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
7191 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
7192 m_commandBuffer->EndCommandBuffer();
7193
7194 m_errorMonitor->VerifyFound();
7195 vkDestroyImage(m_device->device(), image, NULL);
7196 vkFreeMemory(m_device->device(), image_mem, nullptr);
7197}
7198
7199TEST_F(VkLayerTest, BufferMemoryNotBound) {
7200 TEST_DESCRIPTION(
7201 "Attempt to copy from a buffer which has not had memory bound to it.");
7202 ASSERT_NO_FATAL_FAILURE(InitState());
7203
7204 VkImageObj image(m_device);
7205 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
7206 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
7207 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
7208 VK_IMAGE_TILING_OPTIMAL, 0);
7209 ASSERT_TRUE(image.initialized());
7210
7211 VkBuffer buffer;
7212 VkDeviceMemory mem;
7213 VkMemoryRequirements mem_reqs;
7214
7215 VkBufferCreateInfo buf_info = {};
7216 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7217 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7218 buf_info.size = 256;
7219 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7220 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
7221 ASSERT_VK_SUCCESS(err);
7222
7223 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
7224
7225 VkMemoryAllocateInfo alloc_info = {};
7226 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7227 alloc_info.allocationSize = 256;
7228 bool pass = false;
7229 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
7230 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
7231 if (!pass) {
7232 vkDestroyBuffer(m_device->device(), buffer, NULL);
7233 return;
7234 }
7235 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
7236 ASSERT_VK_SUCCESS(err);
7237
7238 // Introduce failure by not calling vkBindBufferMemory(m_device->device(),
7239 // buffer, mem, 0);
7240 m_errorMonitor->SetDesiredFailureMsg(
7241 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7242 "used without first calling vkBindBufferMemory");
7243 VkBufferImageCopy region = {};
7244 region.bufferRowLength = 128;
7245 region.bufferImageHeight = 128;
7246 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7247
7248 region.imageSubresource.layerCount = 1;
7249 region.imageExtent.height = 4;
7250 region.imageExtent.width = 4;
7251 region.imageExtent.depth = 1;
7252 m_commandBuffer->BeginCommandBuffer();
7253 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
7254 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
7255 1, &region);
7256 m_commandBuffer->EndCommandBuffer();
7257
7258 m_errorMonitor->VerifyFound();
7259
7260 vkDestroyBuffer(m_device->device(), buffer, NULL);
7261 vkFreeMemory(m_device->handle(), mem, NULL);
7262}
7263
Tobin Ehlis85940f52016-07-07 16:57:21 -06007264TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
7265 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7266 "due to an event dependency being destroyed.");
7267 ASSERT_NO_FATAL_FAILURE(InitState());
7268
7269 VkEvent event;
7270 VkEventCreateInfo evci = {};
7271 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
7272 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
7273 ASSERT_VK_SUCCESS(result);
7274
7275 m_commandBuffer->BeginCommandBuffer();
7276 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event,
7277 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
7278 m_commandBuffer->EndCommandBuffer();
7279
7280 m_errorMonitor->SetDesiredFailureMsg(
7281 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
7282 // Destroy event dependency prior to submit to cause ERROR
7283 vkDestroyEvent(m_device->device(), event, NULL);
7284
7285 VkSubmitInfo submit_info = {};
7286 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7287 submit_info.commandBufferCount = 1;
7288 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7289 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7290
7291 m_errorMonitor->VerifyFound();
7292}
7293
Tobin Ehlisdbea7552016-07-08 14:33:31 -06007294TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
7295 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7296 "due to a query pool dependency being destroyed.");
7297 ASSERT_NO_FATAL_FAILURE(InitState());
7298
7299 VkQueryPool query_pool;
7300 VkQueryPoolCreateInfo qpci{};
7301 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
7302 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
7303 qpci.queryCount = 1;
7304 VkResult result =
7305 vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
7306 ASSERT_VK_SUCCESS(result);
7307
7308 m_commandBuffer->BeginCommandBuffer();
7309 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
7310 m_commandBuffer->EndCommandBuffer();
7311
7312 m_errorMonitor->SetDesiredFailureMsg(
7313 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7314 " that is invalid because bound query pool ");
7315 // Destroy query pool dependency prior to submit to cause ERROR
7316 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
7317
7318 VkSubmitInfo submit_info = {};
7319 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7320 submit_info.commandBufferCount = 1;
7321 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7322 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7323
7324 m_errorMonitor->VerifyFound();
7325}
7326
Tobin Ehlis24130d92016-07-08 15:50:53 -06007327TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
7328 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7329 "due to a pipeline dependency being destroyed.");
7330 ASSERT_NO_FATAL_FAILURE(InitState());
7331 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7332
7333 VkResult err;
7334
7335 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7336 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7337
7338 VkPipelineLayout pipeline_layout;
7339 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7340 &pipeline_layout);
7341 ASSERT_VK_SUCCESS(err);
7342
7343 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7344 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7345 vp_state_ci.viewportCount = 1;
7346 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06007347 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06007348 vp_state_ci.scissorCount = 1;
7349 VkRect2D scissors = {}; // Dummy scissors to point to
7350 vp_state_ci.pScissors = &scissors;
7351 // No dynamic state
7352 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7353 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7354
7355 VkPipelineShaderStageCreateInfo shaderStages[2];
7356 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7357
7358 VkShaderObj vs(m_device, bindStateVertShaderText,
7359 VK_SHADER_STAGE_VERTEX_BIT, this);
7360 VkShaderObj fs(m_device, bindStateFragShaderText,
7361 VK_SHADER_STAGE_FRAGMENT_BIT,
7362 this); // We shouldn't need a fragment shader
7363 // but add it to be able to run on more devices
7364 shaderStages[0] = vs.GetStageCreateInfo();
7365 shaderStages[1] = fs.GetStageCreateInfo();
7366
7367 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7368 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7369
7370 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7371 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7372 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7373
7374 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7375 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7376
7377 VkPipelineColorBlendAttachmentState att = {};
7378 att.blendEnable = VK_FALSE;
7379 att.colorWriteMask = 0xf;
7380
7381 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7382 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7383 cb_ci.attachmentCount = 1;
7384 cb_ci.pAttachments = &att;
7385
7386 VkGraphicsPipelineCreateInfo gp_ci = {};
7387 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7388 gp_ci.stageCount = 2;
7389 gp_ci.pStages = shaderStages;
7390 gp_ci.pVertexInputState = &vi_ci;
7391 gp_ci.pInputAssemblyState = &ia_ci;
7392 gp_ci.pViewportState = &vp_state_ci;
7393 gp_ci.pRasterizationState = &rs_ci;
7394 gp_ci.pColorBlendState = &cb_ci;
7395 gp_ci.pDynamicState = &dyn_state_ci;
7396 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7397 gp_ci.layout = pipeline_layout;
7398 gp_ci.renderPass = renderPass();
7399
7400 VkPipelineCacheCreateInfo pc_ci = {};
7401 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7402
7403 VkPipeline pipeline;
7404 VkPipelineCache pipelineCache;
7405 err =
7406 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
7407 ASSERT_VK_SUCCESS(err);
7408
7409 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7410 &gp_ci, NULL, &pipeline);
7411 ASSERT_VK_SUCCESS(err);
7412
7413 m_commandBuffer->BeginCommandBuffer();
7414 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7415 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
7416 m_commandBuffer->EndCommandBuffer();
7417 // Now destroy pipeline in order to cause error when submitting
7418 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
7419
7420 m_errorMonitor->SetDesiredFailureMsg(
7421 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7422 " that is invalid because bound pipeline ");
7423
7424 VkSubmitInfo submit_info = {};
7425 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7426 submit_info.commandBufferCount = 1;
7427 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7428 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7429
7430 m_errorMonitor->VerifyFound();
7431 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7432 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7433}
7434
Karl Schultz6addd812016-02-02 17:17:23 -07007435TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06007436 // Attempt to bind an invalid Pipeline to a valid Command Buffer
7437 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007438 // Create a valid cmd buffer
7439 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06007440 uint64_t fake_pipeline_handle = 0xbaad6001;
7441 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06007442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06007443 "Invalid Pipeline Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06007444 ASSERT_NO_FATAL_FAILURE(InitState());
7445 BeginCommandBuffer();
7446 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7447 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
7448 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06007449 // Now issue a draw call with no pipeline bound
7450 m_errorMonitor->SetDesiredFailureMsg(
7451 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7452 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tony Barbourdf4c0042016-06-01 15:55:43 -06007453
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06007454 BeginCommandBuffer();
7455 Draw(1, 0, 0, 0);
7456 m_errorMonitor->VerifyFound();
7457 // Finally same check once more but with Dispatch/Compute
7458 m_errorMonitor->SetDesiredFailureMsg(
7459 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7460 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06007461 BeginCommandBuffer();
7462 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
7463 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007464}
7465
Karl Schultz6addd812016-02-02 17:17:23 -07007466TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
7467 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
7468 // CommandBuffer
7469 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007470
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007471 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007472 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007473
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007474 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06007475 ASSERT_NO_FATAL_FAILURE(InitViewport());
7476 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007477 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007478 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7479 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007480
7481 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007482 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7483 ds_pool_ci.pNext = NULL;
7484 ds_pool_ci.maxSets = 1;
7485 ds_pool_ci.poolSizeCount = 1;
7486 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06007487
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007488 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007489 err =
7490 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007491 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007492
Tony Barboureb254902015-07-15 12:50:33 -06007493 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007494 dsl_binding.binding = 0;
7495 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7496 dsl_binding.descriptorCount = 1;
7497 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7498 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007499
Tony Barboureb254902015-07-15 12:50:33 -06007500 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007501 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7502 ds_layout_ci.pNext = NULL;
7503 ds_layout_ci.bindingCount = 1;
7504 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007505 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007506 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7507 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007508 ASSERT_VK_SUCCESS(err);
7509
7510 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007511 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007512 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007513 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007514 alloc_info.descriptorPool = ds_pool;
7515 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007516 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7517 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007518 ASSERT_VK_SUCCESS(err);
7519
Tony Barboureb254902015-07-15 12:50:33 -06007520 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007521 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7522 pipeline_layout_ci.pNext = NULL;
7523 pipeline_layout_ci.setLayoutCount = 1;
7524 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007525
7526 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007527 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7528 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007529 ASSERT_VK_SUCCESS(err);
7530
Karl Schultz6addd812016-02-02 17:17:23 -07007531 VkShaderObj vs(m_device, bindStateVertShaderText,
7532 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06007533 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07007534 // on more devices
7535 VkShaderObj fs(m_device, bindStateFragShaderText,
7536 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007537
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007538 VkPipelineObj pipe(m_device);
7539 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007540 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06007541 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007542 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007543
7544 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007545 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7546 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7547 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7548 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7549 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007550
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007551 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007552
Chia-I Wuf7458c52015-10-26 21:10:41 +08007553 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7554 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7555 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007556}
7557
Karl Schultz6addd812016-02-02 17:17:23 -07007558TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007559 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07007560 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007561
Karl Schultz6addd812016-02-02 17:17:23 -07007562 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007563 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
7564 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007565
7566 ASSERT_NO_FATAL_FAILURE(InitState());
7567 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007568 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7569 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007570
7571 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007572 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7573 ds_pool_ci.pNext = NULL;
7574 ds_pool_ci.maxSets = 1;
7575 ds_pool_ci.poolSizeCount = 1;
7576 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007577
7578 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007579 err =
7580 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007581 ASSERT_VK_SUCCESS(err);
7582
7583 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007584 dsl_binding.binding = 0;
7585 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7586 dsl_binding.descriptorCount = 1;
7587 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7588 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007589
7590 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007591 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7592 ds_layout_ci.pNext = NULL;
7593 ds_layout_ci.bindingCount = 1;
7594 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007595 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007596 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7597 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007598 ASSERT_VK_SUCCESS(err);
7599
7600 VkDescriptorSet descriptorSet;
7601 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007602 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007603 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007604 alloc_info.descriptorPool = ds_pool;
7605 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007606 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7607 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007608 ASSERT_VK_SUCCESS(err);
7609
Karl Schultz6addd812016-02-02 17:17:23 -07007610 VkBufferView view =
7611 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007612 VkWriteDescriptorSet descriptor_write;
7613 memset(&descriptor_write, 0, sizeof(descriptor_write));
7614 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7615 descriptor_write.dstSet = descriptorSet;
7616 descriptor_write.dstBinding = 0;
7617 descriptor_write.descriptorCount = 1;
7618 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7619 descriptor_write.pTexelBufferView = &view;
7620
7621 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7622
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007623 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007624
7625 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7626 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7627}
7628
Mark Youngd339ba32016-05-30 13:28:35 -06007629TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
7630 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has"
7631 " no memory bound to it.");
7632
7633 VkResult err;
7634 m_errorMonitor->SetDesiredFailureMsg(
7635 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -06007636 "used without first calling vkBindBufferMemory");
Mark Youngd339ba32016-05-30 13:28:35 -06007637
7638 ASSERT_NO_FATAL_FAILURE(InitState());
7639
7640 // Create a buffer with no bound memory and then attempt to create
7641 // a buffer view.
7642 VkBufferCreateInfo buff_ci = {};
7643 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7644 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7645 buff_ci.size = 256;
7646 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7647 VkBuffer buffer;
7648 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
7649 ASSERT_VK_SUCCESS(err);
7650
7651 VkBufferViewCreateInfo buff_view_ci = {};
7652 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
7653 buff_view_ci.buffer = buffer;
7654 buff_view_ci.format = VK_FORMAT_R8_UNORM;
7655 buff_view_ci.range = VK_WHOLE_SIZE;
7656 VkBufferView buff_view;
7657 err =
7658 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
7659
7660 m_errorMonitor->VerifyFound();
7661 vkDestroyBuffer(m_device->device(), buffer, NULL);
7662 // If last error is success, it still created the view, so delete it.
7663 if (err == VK_SUCCESS) {
7664 vkDestroyBufferView(m_device->device(), buff_view, NULL);
7665 }
7666}
7667
Karl Schultz6addd812016-02-02 17:17:23 -07007668TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
7669 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
7670 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07007671 // 1. No dynamicOffset supplied
7672 // 2. Too many dynamicOffsets supplied
7673 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07007674 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007676 " requires 1 dynamicOffsets, but only "
7677 "0 dynamicOffsets are left in "
7678 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007679
7680 ASSERT_NO_FATAL_FAILURE(InitState());
7681 ASSERT_NO_FATAL_FAILURE(InitViewport());
7682 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7683
7684 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007685 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7686 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007687
7688 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007689 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7690 ds_pool_ci.pNext = NULL;
7691 ds_pool_ci.maxSets = 1;
7692 ds_pool_ci.poolSizeCount = 1;
7693 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007694
7695 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007696 err =
7697 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007698 ASSERT_VK_SUCCESS(err);
7699
7700 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007701 dsl_binding.binding = 0;
7702 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7703 dsl_binding.descriptorCount = 1;
7704 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7705 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007706
7707 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007708 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7709 ds_layout_ci.pNext = NULL;
7710 ds_layout_ci.bindingCount = 1;
7711 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007712 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007713 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7714 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007715 ASSERT_VK_SUCCESS(err);
7716
7717 VkDescriptorSet descriptorSet;
7718 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007719 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007720 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007721 alloc_info.descriptorPool = ds_pool;
7722 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007723 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7724 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007725 ASSERT_VK_SUCCESS(err);
7726
7727 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007728 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7729 pipeline_layout_ci.pNext = NULL;
7730 pipeline_layout_ci.setLayoutCount = 1;
7731 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007732
7733 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007734 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7735 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007736 ASSERT_VK_SUCCESS(err);
7737
7738 // Create a buffer to update the descriptor with
7739 uint32_t qfi = 0;
7740 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007741 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7742 buffCI.size = 1024;
7743 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7744 buffCI.queueFamilyIndexCount = 1;
7745 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007746
7747 VkBuffer dyub;
7748 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7749 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007750 // Allocate memory and bind to buffer so we can make it to the appropriate
7751 // error
7752 VkMemoryAllocateInfo mem_alloc = {};
7753 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7754 mem_alloc.pNext = NULL;
7755 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12007756 mem_alloc.memoryTypeIndex = 0;
7757
7758 VkMemoryRequirements memReqs;
7759 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
7760 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
7761 0);
7762 if (!pass) {
7763 vkDestroyBuffer(m_device->device(), dyub, NULL);
7764 return;
7765 }
7766
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007767 VkDeviceMemory mem;
7768 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
7769 ASSERT_VK_SUCCESS(err);
7770 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
7771 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007772 // Correctly update descriptor to avoid "NOT_UPDATED" error
7773 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007774 buffInfo.buffer = dyub;
7775 buffInfo.offset = 0;
7776 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007777
7778 VkWriteDescriptorSet descriptor_write;
7779 memset(&descriptor_write, 0, sizeof(descriptor_write));
7780 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7781 descriptor_write.dstSet = descriptorSet;
7782 descriptor_write.dstBinding = 0;
7783 descriptor_write.descriptorCount = 1;
7784 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7785 descriptor_write.pBufferInfo = &buffInfo;
7786
7787 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7788
7789 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007790 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7791 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7792 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007793 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007794 uint32_t pDynOff[2] = {512, 756};
7795 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07007796 m_errorMonitor->SetDesiredFailureMsg(
7797 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07007798 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07007799 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7800 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7801 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12007802 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007803 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7805 " dynamic offset 512 combined with "
7806 "offset 0 and range 1024 that "
7807 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07007808 // Create PSO to be used for draw-time errors below
7809 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007810 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007811 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007812 "out gl_PerVertex { \n"
7813 " vec4 gl_Position;\n"
7814 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007815 "void main(){\n"
7816 " gl_Position = vec4(1);\n"
7817 "}\n";
7818 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007819 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007820 "\n"
7821 "layout(location=0) out vec4 x;\n"
7822 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7823 "void main(){\n"
7824 " x = vec4(bar.y);\n"
7825 "}\n";
7826 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7827 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7828 VkPipelineObj pipe(m_device);
7829 pipe.AddShader(&vs);
7830 pipe.AddShader(&fs);
7831 pipe.AddColorAttachment();
7832 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7833
Karl Schultz6addd812016-02-02 17:17:23 -07007834 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7835 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7836 // This update should succeed, but offset size of 512 will overstep buffer
7837 // /w range 1024 & size 1024
7838 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7839 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7840 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07007841 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007842 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007843
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007844 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06007845 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007846
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007847 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007848 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007849 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7850}
7851
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007852TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
7853 TEST_DESCRIPTION("Attempt to update a descriptor with a non-sparse buffer "
7854 "that doesn't have memory bound");
7855 VkResult err;
7856 m_errorMonitor->SetDesiredFailureMsg(
7857 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7858 " used without first calling vkBindBufferMemory.");
7859
7860 ASSERT_NO_FATAL_FAILURE(InitState());
7861 ASSERT_NO_FATAL_FAILURE(InitViewport());
7862 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7863
7864 VkDescriptorPoolSize ds_type_count = {};
7865 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7866 ds_type_count.descriptorCount = 1;
7867
7868 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7869 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7870 ds_pool_ci.pNext = NULL;
7871 ds_pool_ci.maxSets = 1;
7872 ds_pool_ci.poolSizeCount = 1;
7873 ds_pool_ci.pPoolSizes = &ds_type_count;
7874
7875 VkDescriptorPool ds_pool;
7876 err =
7877 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
7878 ASSERT_VK_SUCCESS(err);
7879
7880 VkDescriptorSetLayoutBinding dsl_binding = {};
7881 dsl_binding.binding = 0;
7882 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7883 dsl_binding.descriptorCount = 1;
7884 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7885 dsl_binding.pImmutableSamplers = NULL;
7886
7887 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7888 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7889 ds_layout_ci.pNext = NULL;
7890 ds_layout_ci.bindingCount = 1;
7891 ds_layout_ci.pBindings = &dsl_binding;
7892 VkDescriptorSetLayout ds_layout;
7893 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7894 &ds_layout);
7895 ASSERT_VK_SUCCESS(err);
7896
7897 VkDescriptorSet descriptorSet;
7898 VkDescriptorSetAllocateInfo alloc_info = {};
7899 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7900 alloc_info.descriptorSetCount = 1;
7901 alloc_info.descriptorPool = ds_pool;
7902 alloc_info.pSetLayouts = &ds_layout;
7903 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7904 &descriptorSet);
7905 ASSERT_VK_SUCCESS(err);
7906
7907 // Create a buffer to update the descriptor with
7908 uint32_t qfi = 0;
7909 VkBufferCreateInfo buffCI = {};
7910 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7911 buffCI.size = 1024;
7912 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7913 buffCI.queueFamilyIndexCount = 1;
7914 buffCI.pQueueFamilyIndices = &qfi;
7915
7916 VkBuffer dyub;
7917 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7918 ASSERT_VK_SUCCESS(err);
7919
7920 // Attempt to update descriptor without binding memory to it
7921 VkDescriptorBufferInfo buffInfo = {};
7922 buffInfo.buffer = dyub;
7923 buffInfo.offset = 0;
7924 buffInfo.range = 1024;
7925
7926 VkWriteDescriptorSet descriptor_write;
7927 memset(&descriptor_write, 0, sizeof(descriptor_write));
7928 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7929 descriptor_write.dstSet = descriptorSet;
7930 descriptor_write.dstBinding = 0;
7931 descriptor_write.descriptorCount = 1;
7932 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7933 descriptor_write.pBufferInfo = &buffInfo;
7934
7935 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7936 m_errorMonitor->VerifyFound();
7937
7938 vkDestroyBuffer(m_device->device(), dyub, NULL);
7939 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7940 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7941}
7942
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007943TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007944 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007945 ASSERT_NO_FATAL_FAILURE(InitState());
7946 ASSERT_NO_FATAL_FAILURE(InitViewport());
7947 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7948
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007949 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007950 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007951 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7952 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7953 pipeline_layout_ci.pushConstantRangeCount = 1;
7954 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7955
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007956 //
7957 // Check for invalid push constant ranges in pipeline layouts.
7958 //
7959 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007960 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007961 char const *msg;
7962 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007963
Karl Schultzc81037d2016-05-12 08:11:23 -06007964 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7965 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7966 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7967 "vkCreatePipelineLayout() call has push constants index 0 with "
7968 "size 0."},
7969 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7970 "vkCreatePipelineLayout() call has push constants index 0 with "
7971 "size 1."},
7972 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7973 "vkCreatePipelineLayout() call has push constants index 0 with "
7974 "size 1."},
7975 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7976 "vkCreatePipelineLayout() call has push constants index 0 with "
7977 "size 0."},
7978 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7979 "vkCreatePipelineLayout() call has push constants index 0 with "
7980 "offset 1. Offset must"},
7981 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7982 "vkCreatePipelineLayout() call has push constants index 0 "
7983 "with offset "},
7984 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7985 "vkCreatePipelineLayout() call has push constants "
7986 "index 0 with offset "},
7987 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
7988 "vkCreatePipelineLayout() call has push constants index 0 "
7989 "with offset "},
7990 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7991 "vkCreatePipelineLayout() call has push "
7992 "constants index 0 with offset "},
7993 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7994 "vkCreatePipelineLayout() call has push "
7995 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007996 }};
7997
7998 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007999 for (const auto &iter : range_tests) {
8000 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008001 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8002 iter.msg);
8003 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
8004 NULL, &pipeline_layout);
8005 m_errorMonitor->VerifyFound();
8006 if (VK_SUCCESS == err) {
8007 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8008 }
8009 }
8010
8011 // Check for invalid stage flag
8012 pc_range.offset = 0;
8013 pc_range.size = 16;
8014 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008015 m_errorMonitor->SetDesiredFailureMsg(
8016 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008017 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008018 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8019 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008020 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008021 if (VK_SUCCESS == err) {
8022 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8023 }
8024
8025 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06008026 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008027 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06008028 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008029 char const *msg;
8030 };
8031
Karl Schultzc81037d2016-05-12 08:11:23 -06008032 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008033 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8034 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8035 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8036 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8037 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
8038 "vkCreatePipelineLayout() call has push constants with overlapping "
8039 "ranges: 0:[0, 4), 1:[0, 4)"},
8040 {
8041 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8042 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8043 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8044 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
8045 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
8046 "vkCreatePipelineLayout() call has push constants with "
8047 "overlapping "
8048 "ranges: 3:[12, 20), 4:[16, 20)",
8049 },
8050 {
8051 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8052 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
8053 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8054 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8055 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
8056 "vkCreatePipelineLayout() call has push constants with "
8057 "overlapping "
8058 "ranges: 0:[16, 20), 1:[12, 20)",
8059 },
8060 {
8061 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8062 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8063 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8064 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
8065 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
8066 "vkCreatePipelineLayout() call has push constants with "
8067 "overlapping "
8068 "ranges: 0:[16, 20), 3:[12, 20)",
8069 },
8070 {
8071 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8072 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
8073 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
8074 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
8075 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
8076 "vkCreatePipelineLayout() call has push constants with "
8077 "overlapping "
8078 "ranges: 0:[16, 20), 2:[4, 100)",
8079 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008080
Karl Schultzc81037d2016-05-12 08:11:23 -06008081 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008082 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06008083 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
8084 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008085 iter.msg);
8086 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
8087 NULL, &pipeline_layout);
8088 m_errorMonitor->VerifyFound();
8089 if (VK_SUCCESS == err) {
8090 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8091 }
8092 }
8093
8094 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06008095 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
8096 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8097 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8098 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8099 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
8100 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
8101 ""},
8102 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
8103 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
8104 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
8105 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
8106 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
8107 ""}}};
8108 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008109 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
8110 m_errorMonitor->ExpectSuccess();
8111 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
8112 NULL, &pipeline_layout);
8113 m_errorMonitor->VerifyNotFound();
8114 if (VK_SUCCESS == err) {
8115 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8116 }
8117 }
8118
8119 //
8120 // CmdPushConstants tests
8121 //
Karl Schultzc81037d2016-05-12 08:11:23 -06008122 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008123
8124 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06008125 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
8126 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
8127 "vkCmdPushConstants() call has push constants with size 0. Size "
8128 "must be greater than zero and a multiple of 4."},
8129 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
8130 "vkCmdPushConstants() call has push constants with size 1. Size "
8131 "must be greater than zero and a multiple of 4."},
8132 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
8133 "vkCmdPushConstants() call has push constants with size 1. Size "
8134 "must be greater than zero and a multiple of 4."},
8135 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
8136 "vkCmdPushConstants() call has push constants with offset 1. "
8137 "Offset must be a multiple of 4."},
8138 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
8139 "vkCmdPushConstants() call has push constants with offset 1. "
8140 "Offset must be a multiple of 4."},
8141 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
8142 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
8143 "0x1 not within flag-matching ranges in pipeline layout"},
8144 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
8145 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
8146 "0x1 not within flag-matching ranges in pipeline layout"},
8147 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
8148 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
8149 "0x1 not within flag-matching ranges in pipeline layout"},
8150 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
8151 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
8152 "0x1 not within flag-matching ranges in pipeline layout"},
8153 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
8154 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
8155 "any of the ranges in pipeline layout"},
8156 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
8157 0, 16},
8158 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
8159 "any of the ranges in pipeline layout"},
8160 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008161 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008162 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008163 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008164 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008165 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008166 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008167 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008168 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008169 "vkCmdPushConstants() call has push constants with offset "},
8170 }};
8171
8172 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06008173 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008174 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06008175 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008176 };
Karl Schultzc81037d2016-05-12 08:11:23 -06008177 pipeline_layout_ci.pushConstantRangeCount =
8178 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008179 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008180 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8181 &pipeline_layout);
8182 ASSERT_VK_SUCCESS(err);
8183 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06008184 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8186 iter.msg);
8187 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06008188 iter.range.stageFlags, iter.range.offset,
8189 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008190 m_errorMonitor->VerifyFound();
8191 }
8192
8193 // Check for invalid stage flag
8194 m_errorMonitor->SetDesiredFailureMsg(
8195 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8196 "vkCmdPushConstants() call has no stageFlags set.");
8197 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06008198 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008199 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06008200 EndCommandBuffer();
8201 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
8202 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008203
Karl Schultzc81037d2016-05-12 08:11:23 -06008204 // overlapping range tests with cmd
8205 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
8206 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
8207 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
8208 "0x1 not within flag-matching ranges in pipeline layout"},
8209 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8210 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
8211 "0x1 not within flag-matching ranges in pipeline layout"},
8212 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
8213 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
8214 "0x1 not within flag-matching ranges in pipeline layout"},
8215 }};
8216 const VkPushConstantRange pc_range3[] = {
8217 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
8218 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
8219 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8220 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
8221 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
8222 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
8223 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
8224 };
8225 pipeline_layout_ci.pushConstantRangeCount =
8226 sizeof(pc_range3) / sizeof(VkPushConstantRange);
8227 pipeline_layout_ci.pPushConstantRanges = pc_range3;
8228 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8229 &pipeline_layout);
8230 ASSERT_VK_SUCCESS(err);
8231 BeginCommandBuffer();
8232 for (const auto &iter : cmd_overlap_tests) {
8233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8234 iter.msg);
8235 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
8236 iter.range.stageFlags, iter.range.offset,
8237 iter.range.size, dummy_values);
8238 m_errorMonitor->VerifyFound();
8239 }
8240 EndCommandBuffer();
8241 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
8242 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8243
8244 // positive overlapping range tests with cmd
8245 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
8246 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
8247 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
8248 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
8249 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
8250 }};
8251 const VkPushConstantRange pc_range4[] = {
8252 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
8253 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
8254 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
8255 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8256 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
8257 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
8258 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
8259 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
8260 };
8261 pipeline_layout_ci.pushConstantRangeCount =
8262 sizeof(pc_range4) / sizeof(VkPushConstantRange);
8263 pipeline_layout_ci.pPushConstantRanges = pc_range4;
8264 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8265 &pipeline_layout);
8266 ASSERT_VK_SUCCESS(err);
8267 BeginCommandBuffer();
8268 for (const auto &iter : cmd_overlap_tests_pos) {
8269 m_errorMonitor->ExpectSuccess();
8270 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
8271 iter.range.stageFlags, iter.range.offset,
8272 iter.range.size, dummy_values);
8273 m_errorMonitor->VerifyNotFound();
8274 }
8275 EndCommandBuffer();
8276 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008277 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8278}
8279
Karl Schultz6addd812016-02-02 17:17:23 -07008280TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07008281 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07008282 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008283
8284 ASSERT_NO_FATAL_FAILURE(InitState());
8285 ASSERT_NO_FATAL_FAILURE(InitViewport());
8286 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8287
Mike Stroyanb8a61002016-06-20 16:00:28 -06008288 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
8289 VkImageTiling tiling;
8290 VkFormatProperties format_properties;
8291 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
8292 if (format_properties.linearTilingFeatures &
8293 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
8294 tiling = VK_IMAGE_TILING_LINEAR;
8295 } else if (format_properties.optimalTilingFeatures &
8296 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
8297 tiling = VK_IMAGE_TILING_OPTIMAL;
8298 } else {
8299 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
8300 "skipped.\n");
8301 return;
8302 }
8303
Tobin Ehlis559c6382015-11-05 09:52:49 -07008304 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
8305 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008306 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8307 ds_type_count[0].descriptorCount = 10;
8308 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8309 ds_type_count[1].descriptorCount = 2;
8310 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
8311 ds_type_count[2].descriptorCount = 2;
8312 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
8313 ds_type_count[3].descriptorCount = 5;
8314 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
8315 // type
8316 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8317 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
8318 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008319
8320 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008321 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8322 ds_pool_ci.pNext = NULL;
8323 ds_pool_ci.maxSets = 5;
8324 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
8325 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008326
8327 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008328 err =
8329 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008330 ASSERT_VK_SUCCESS(err);
8331
8332 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
8333 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008334 dsl_binding[0].binding = 0;
8335 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8336 dsl_binding[0].descriptorCount = 5;
8337 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
8338 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008339
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008340 // Create layout identical to set0 layout but w/ different stageFlags
8341 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008342 dsl_fs_stage_only.binding = 0;
8343 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8344 dsl_fs_stage_only.descriptorCount = 5;
8345 dsl_fs_stage_only.stageFlags =
8346 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
8347 // bind time
8348 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008349 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008350 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8351 ds_layout_ci.pNext = NULL;
8352 ds_layout_ci.bindingCount = 1;
8353 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008354 static const uint32_t NUM_LAYOUTS = 4;
8355 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008356 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008357 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
8358 // layout for error case
8359 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8360 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008361 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008362 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07008363 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8364 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008365 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008366 dsl_binding[0].binding = 0;
8367 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008368 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008369 dsl_binding[1].binding = 1;
8370 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
8371 dsl_binding[1].descriptorCount = 2;
8372 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
8373 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008374 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008375 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07008376 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8377 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008378 ASSERT_VK_SUCCESS(err);
8379 dsl_binding[0].binding = 0;
8380 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008381 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008382 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008383 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8384 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008385 ASSERT_VK_SUCCESS(err);
8386 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008387 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07008388 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8389 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008390 ASSERT_VK_SUCCESS(err);
8391
8392 static const uint32_t NUM_SETS = 4;
8393 VkDescriptorSet descriptorSet[NUM_SETS] = {};
8394 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008395 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008396 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008397 alloc_info.descriptorPool = ds_pool;
8398 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008399 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8400 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008401 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008402 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008403 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008404 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07008405 err =
8406 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008407 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008408
8409 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008410 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8411 pipeline_layout_ci.pNext = NULL;
8412 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
8413 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008414
8415 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008416 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8417 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008418 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008419 // Create pipelineLayout with only one setLayout
8420 pipeline_layout_ci.setLayoutCount = 1;
8421 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008422 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8423 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008424 ASSERT_VK_SUCCESS(err);
8425 // Create pipelineLayout with 2 descriptor setLayout at index 0
8426 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
8427 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07008428 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8429 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008430 ASSERT_VK_SUCCESS(err);
8431 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
8432 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
8433 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07008434 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8435 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008436 ASSERT_VK_SUCCESS(err);
8437 // Create pipelineLayout with UB type, but stageFlags for FS only
8438 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
8439 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07008440 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8441 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008442 ASSERT_VK_SUCCESS(err);
8443 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
8444 VkDescriptorSetLayout pl_bad_s0[2] = {};
8445 pl_bad_s0[0] = ds_layout_fs_only;
8446 pl_bad_s0[1] = ds_layout[1];
8447 pipeline_layout_ci.setLayoutCount = 2;
8448 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
8449 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07008450 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8451 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008452 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008453
8454 // Create a buffer to update the descriptor with
8455 uint32_t qfi = 0;
8456 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008457 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8458 buffCI.size = 1024;
8459 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
8460 buffCI.queueFamilyIndexCount = 1;
8461 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008462
8463 VkBuffer dyub;
8464 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
8465 ASSERT_VK_SUCCESS(err);
8466 // Correctly update descriptor to avoid "NOT_UPDATED" error
8467 static const uint32_t NUM_BUFFS = 5;
8468 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008469 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07008470 buffInfo[i].buffer = dyub;
8471 buffInfo[i].offset = 0;
8472 buffInfo[i].range = 1024;
8473 }
Karl Schultz6addd812016-02-02 17:17:23 -07008474 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07008475 const int32_t tex_width = 32;
8476 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008477 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008478 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8479 image_create_info.pNext = NULL;
8480 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8481 image_create_info.format = tex_format;
8482 image_create_info.extent.width = tex_width;
8483 image_create_info.extent.height = tex_height;
8484 image_create_info.extent.depth = 1;
8485 image_create_info.mipLevels = 1;
8486 image_create_info.arrayLayers = 1;
8487 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06008488 image_create_info.tiling = tiling;
8489 image_create_info.usage =
8490 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07008491 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008492 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8493 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008494
Karl Schultz6addd812016-02-02 17:17:23 -07008495 VkMemoryRequirements memReqs;
8496 VkDeviceMemory imageMem;
8497 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008498 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008499 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8500 memAlloc.pNext = NULL;
8501 memAlloc.allocationSize = 0;
8502 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008503 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
8504 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008505 pass =
8506 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008507 ASSERT_TRUE(pass);
8508 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
8509 ASSERT_VK_SUCCESS(err);
8510 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
8511 ASSERT_VK_SUCCESS(err);
8512
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008513 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008514 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8515 image_view_create_info.image = image;
8516 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8517 image_view_create_info.format = tex_format;
8518 image_view_create_info.subresourceRange.layerCount = 1;
8519 image_view_create_info.subresourceRange.baseMipLevel = 0;
8520 image_view_create_info.subresourceRange.levelCount = 1;
8521 image_view_create_info.subresourceRange.aspectMask =
8522 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008523
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008524 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008525 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8526 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008527 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008528 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008529 imageInfo[0].imageView = view;
8530 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
8531 imageInfo[1].imageView = view;
8532 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008533 imageInfo[2].imageView = view;
8534 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
8535 imageInfo[3].imageView = view;
8536 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008537
8538 static const uint32_t NUM_SET_UPDATES = 3;
8539 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
8540 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8541 descriptor_write[0].dstSet = descriptorSet[0];
8542 descriptor_write[0].dstBinding = 0;
8543 descriptor_write[0].descriptorCount = 5;
8544 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8545 descriptor_write[0].pBufferInfo = buffInfo;
8546 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8547 descriptor_write[1].dstSet = descriptorSet[1];
8548 descriptor_write[1].dstBinding = 0;
8549 descriptor_write[1].descriptorCount = 2;
8550 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8551 descriptor_write[1].pImageInfo = imageInfo;
8552 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8553 descriptor_write[2].dstSet = descriptorSet[1];
8554 descriptor_write[2].dstBinding = 1;
8555 descriptor_write[2].descriptorCount = 2;
8556 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008557 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008558
8559 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008560
Tobin Ehlis88452832015-12-03 09:40:56 -07008561 // Create PSO to be used for draw-time errors below
8562 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12008563 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008564 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008565 "out gl_PerVertex {\n"
8566 " vec4 gl_Position;\n"
8567 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008568 "void main(){\n"
8569 " gl_Position = vec4(1);\n"
8570 "}\n";
8571 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12008572 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008573 "\n"
8574 "layout(location=0) out vec4 x;\n"
8575 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
8576 "void main(){\n"
8577 " x = vec4(bar.y);\n"
8578 "}\n";
8579 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8580 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008581 VkPipelineObj pipe(m_device);
8582 pipe.AddShader(&vs);
8583 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07008584 pipe.AddColorAttachment();
8585 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07008586
8587 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07008588
Karl Schultz6addd812016-02-02 17:17:23 -07008589 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8590 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8591 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
8592 // of PSO
8593 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
8594 // cmd_pipeline.c
8595 // due to the fact that cmd_alloc_dset_data() has not been called in
8596 // cmd_bind_graphics_pipeline()
8597 // TODO : Want to cause various binding incompatibility issues here to test
8598 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07008599 // First cause various verify_layout_compatibility() fails
8600 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008601 // verify_set_layout_compatibility fail cases:
8602 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07008603 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06008604 "Invalid Pipeline Layout Object ");
Karl Schultz6addd812016-02-02 17:17:23 -07008605 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8606 VK_PIPELINE_BIND_POINT_GRAPHICS,
8607 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
8608 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008609 m_errorMonitor->VerifyFound();
8610
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008611 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07008612 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8613 " attempting to bind set to index 1");
8614 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8615 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
8616 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008617 m_errorMonitor->VerifyFound();
8618
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008619 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008620 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
8621 // descriptors
8622 m_errorMonitor->SetDesiredFailureMsg(
8623 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008624 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07008625 vkCmdBindDescriptorSets(
8626 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8627 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008628 m_errorMonitor->VerifyFound();
8629
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008630 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
8631 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07008632 m_errorMonitor->SetDesiredFailureMsg(
8633 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008634 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07008635 vkCmdBindDescriptorSets(
8636 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8637 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008638 m_errorMonitor->VerifyFound();
8639
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008640 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
8641 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07008642 m_errorMonitor->SetDesiredFailureMsg(
8643 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008644 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07008645 vkCmdBindDescriptorSets(
8646 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8647 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008648 m_errorMonitor->VerifyFound();
8649
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008650 // Cause INFO messages due to disturbing previously bound Sets
8651 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07008652 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8653 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8654 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008655 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07008656 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008657 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008658 " previously bound as set #0 was disturbed ");
8659 vkCmdBindDescriptorSets(
8660 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8661 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008662 m_errorMonitor->VerifyFound();
8663
Karl Schultz6addd812016-02-02 17:17:23 -07008664 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8665 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8666 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008667 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008669 " newly bound as set #0 so set #1 and "
8670 "any subsequent sets were disturbed ");
8671 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8672 VK_PIPELINE_BIND_POINT_GRAPHICS,
8673 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008674 m_errorMonitor->VerifyFound();
8675
Tobin Ehlis10fad692016-07-07 12:00:36 -06008676 // Now that we're done actively using the pipelineLayout that gfx pipeline
8677 // was created with, we should be able to delete it. Do that now to verify
8678 // that validation obeys pipelineLayout lifetime
8679 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
8680
Tobin Ehlis88452832015-12-03 09:40:56 -07008681 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07008682 // 1. Error due to not binding required set (we actually use same code as
8683 // above to disturb set0)
8684 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8685 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8686 2, &descriptorSet[0], 0, NULL);
8687 vkCmdBindDescriptorSets(
8688 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8689 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
8690 m_errorMonitor->SetDesiredFailureMsg(
8691 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8692 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07008693 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008694 m_errorMonitor->VerifyFound();
8695
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008696 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008697 // 2. Error due to bound set not being compatible with PSO's
8698 // VkPipelineLayout (diff stageFlags in this case)
8699 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8700 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8701 2, &descriptorSet[0], 0, NULL);
8702 m_errorMonitor->SetDesiredFailureMsg(
8703 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8704 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07008705 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008706 m_errorMonitor->VerifyFound();
8707
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008708 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07008709 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008710 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
8711 }
8712 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06008713 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
8714 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008715 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008716 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8717 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008718 vkFreeMemory(m_device->device(), imageMem, NULL);
8719 vkDestroyImage(m_device->device(), image, NULL);
8720 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008721}
Tobin Ehlis559c6382015-11-05 09:52:49 -07008722
Karl Schultz6addd812016-02-02 17:17:23 -07008723TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008724
Karl Schultz6addd812016-02-02 17:17:23 -07008725 m_errorMonitor->SetDesiredFailureMsg(
8726 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008727 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008728
8729 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008730 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008731 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008732 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008733
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008734 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008735}
8736
Karl Schultz6addd812016-02-02 17:17:23 -07008737TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
8738 VkResult err;
8739 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008740
Karl Schultz6addd812016-02-02 17:17:23 -07008741 m_errorMonitor->SetDesiredFailureMsg(
8742 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07008743 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008744
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008745 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008746
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008747 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008748 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008749 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008750 cmd.commandPool = m_commandPool;
8751 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008752 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06008753
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008754 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06008755 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008756
8757 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008758 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008759 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008760 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008761 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008762 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
8763 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008764 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008765
8766 // The error should be caught by validation of the BeginCommandBuffer call
8767 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
8768
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008769 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008770 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008771}
8772
Karl Schultz6addd812016-02-02 17:17:23 -07008773TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008774 // Cause error due to Begin while recording CB
8775 // Then cause 2 errors for attempting to reset CB w/o having
8776 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
8777 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008779 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008780
8781 ASSERT_NO_FATAL_FAILURE(InitState());
8782
8783 // Calls AllocateCommandBuffers
8784 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
8785
Karl Schultz6addd812016-02-02 17:17:23 -07008786 // Force the failure by setting the Renderpass and Framebuffer fields with
8787 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008788 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008789 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008790 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8791 cmd_buf_info.pNext = NULL;
8792 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008793 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008794
8795 // Begin CB to transition to recording state
8796 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
8797 // Can't re-begin. This should trigger error
8798 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008799 m_errorMonitor->VerifyFound();
8800
Karl Schultz6addd812016-02-02 17:17:23 -07008801 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8802 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008803 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
8804 // Reset attempt will trigger error due to incorrect CommandPool state
8805 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008806 m_errorMonitor->VerifyFound();
8807
Karl Schultz6addd812016-02-02 17:17:23 -07008808 m_errorMonitor->SetDesiredFailureMsg(
8809 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8810 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008811 // Transition CB to RECORDED state
8812 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
8813 // Now attempting to Begin will implicitly reset, which triggers error
8814 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008815 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008816}
8817
Karl Schultz6addd812016-02-02 17:17:23 -07008818TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008819 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008820 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008821
Karl Schultz6addd812016-02-02 17:17:23 -07008822 m_errorMonitor->SetDesiredFailureMsg(
8823 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008824 "Invalid Pipeline CreateInfo State: Vtx Shader required");
8825
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008826 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008827 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008828
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008829 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008830 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8831 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06008832
8833 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008834 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8835 ds_pool_ci.pNext = NULL;
8836 ds_pool_ci.maxSets = 1;
8837 ds_pool_ci.poolSizeCount = 1;
8838 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008839
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008840 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008841 err =
8842 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008843 ASSERT_VK_SUCCESS(err);
8844
Tony Barboureb254902015-07-15 12:50:33 -06008845 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008846 dsl_binding.binding = 0;
8847 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8848 dsl_binding.descriptorCount = 1;
8849 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8850 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008851
Tony Barboureb254902015-07-15 12:50:33 -06008852 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008853 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8854 ds_layout_ci.pNext = NULL;
8855 ds_layout_ci.bindingCount = 1;
8856 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06008857
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008858 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008859 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8860 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008861 ASSERT_VK_SUCCESS(err);
8862
8863 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008864 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008865 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008866 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008867 alloc_info.descriptorPool = ds_pool;
8868 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008869 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8870 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008871 ASSERT_VK_SUCCESS(err);
8872
Tony Barboureb254902015-07-15 12:50:33 -06008873 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008874 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8875 pipeline_layout_ci.setLayoutCount = 1;
8876 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008877
8878 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008879 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8880 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008881 ASSERT_VK_SUCCESS(err);
8882
Tobin Ehlise68360f2015-10-01 11:15:13 -06008883 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008884 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06008885
8886 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008887 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8888 vp_state_ci.scissorCount = 1;
8889 vp_state_ci.pScissors = &sc;
8890 vp_state_ci.viewportCount = 1;
8891 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008892
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008893 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8894 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8895 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8896 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8897 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8898 rs_state_ci.depthClampEnable = VK_FALSE;
8899 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8900 rs_state_ci.depthBiasEnable = VK_FALSE;
8901
Tony Barboureb254902015-07-15 12:50:33 -06008902 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008903 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8904 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008905 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008906 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8907 gp_ci.layout = pipeline_layout;
8908 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06008909
8910 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008911 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8912 pc_ci.initialDataSize = 0;
8913 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008914
8915 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06008916 VkPipelineCache pipelineCache;
8917
Karl Schultz6addd812016-02-02 17:17:23 -07008918 err =
8919 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06008920 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008921 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8922 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008923
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008924 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008925
Chia-I Wuf7458c52015-10-26 21:10:41 +08008926 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8927 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8928 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8929 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008930}
Tobin Ehlis912df022015-09-17 08:46:18 -06008931/*// TODO : This test should be good, but needs Tess support in compiler to run
8932TEST_F(VkLayerTest, InvalidPatchControlPoints)
8933{
8934 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06008935 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008936
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008938 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
8939primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008940
Tobin Ehlis912df022015-09-17 08:46:18 -06008941 ASSERT_NO_FATAL_FAILURE(InitState());
8942 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06008943
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008944 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06008945 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008946 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008947
8948 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8949 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8950 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008951 ds_pool_ci.poolSizeCount = 1;
8952 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06008953
8954 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008955 err = vkCreateDescriptorPool(m_device->device(),
8956VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06008957 ASSERT_VK_SUCCESS(err);
8958
8959 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08008960 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06008961 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08008962 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008963 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8964 dsl_binding.pImmutableSamplers = NULL;
8965
8966 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008967 ds_layout_ci.sType =
8968VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008969 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008970 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008971 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06008972
8973 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008974 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8975&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008976 ASSERT_VK_SUCCESS(err);
8977
8978 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07008979 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
8980VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06008981 ASSERT_VK_SUCCESS(err);
8982
8983 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008984 pipeline_layout_ci.sType =
8985VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008986 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008987 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008988 pipeline_layout_ci.pSetLayouts = &ds_layout;
8989
8990 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008991 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8992&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008993 ASSERT_VK_SUCCESS(err);
8994
8995 VkPipelineShaderStageCreateInfo shaderStages[3];
8996 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
8997
Karl Schultz6addd812016-02-02 17:17:23 -07008998 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
8999this);
Tobin Ehlis912df022015-09-17 08:46:18 -06009000 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07009001 VkShaderObj
9002tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
9003this);
9004 VkShaderObj
9005te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
9006this);
Tobin Ehlis912df022015-09-17 08:46:18 -06009007
Karl Schultz6addd812016-02-02 17:17:23 -07009008 shaderStages[0].sType =
9009VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009010 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06009011 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07009012 shaderStages[1].sType =
9013VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009014 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06009015 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07009016 shaderStages[2].sType =
9017VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009018 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06009019 shaderStages[2].shader = te.handle();
9020
9021 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009022 iaCI.sType =
9023VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08009024 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06009025
9026 VkPipelineTessellationStateCreateInfo tsCI = {};
9027 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
9028 tsCI.patchControlPoints = 0; // This will cause an error
9029
9030 VkGraphicsPipelineCreateInfo gp_ci = {};
9031 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9032 gp_ci.pNext = NULL;
9033 gp_ci.stageCount = 3;
9034 gp_ci.pStages = shaderStages;
9035 gp_ci.pVertexInputState = NULL;
9036 gp_ci.pInputAssemblyState = &iaCI;
9037 gp_ci.pTessellationState = &tsCI;
9038 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009039 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06009040 gp_ci.pMultisampleState = NULL;
9041 gp_ci.pDepthStencilState = NULL;
9042 gp_ci.pColorBlendState = NULL;
9043 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9044 gp_ci.layout = pipeline_layout;
9045 gp_ci.renderPass = renderPass();
9046
9047 VkPipelineCacheCreateInfo pc_ci = {};
9048 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9049 pc_ci.pNext = NULL;
9050 pc_ci.initialSize = 0;
9051 pc_ci.initialData = 0;
9052 pc_ci.maxSize = 0;
9053
9054 VkPipeline pipeline;
9055 VkPipelineCache pipelineCache;
9056
Karl Schultz6addd812016-02-02 17:17:23 -07009057 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
9058&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06009059 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009060 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9061&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06009062
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009063 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009064
Chia-I Wuf7458c52015-10-26 21:10:41 +08009065 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9066 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9067 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9068 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06009069}
9070*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06009071// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07009072TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07009073 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009074
Karl Schultz6addd812016-02-02 17:17:23 -07009075 m_errorMonitor->SetDesiredFailureMsg(
9076 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009077 "Gfx Pipeline viewport count (1) must match scissor count (0).");
9078
Tobin Ehlise68360f2015-10-01 11:15:13 -06009079 ASSERT_NO_FATAL_FAILURE(InitState());
9080 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06009081
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009082 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009083 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9084 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009085
9086 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009087 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9088 ds_pool_ci.maxSets = 1;
9089 ds_pool_ci.poolSizeCount = 1;
9090 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009091
9092 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009093 err =
9094 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009095 ASSERT_VK_SUCCESS(err);
9096
9097 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009098 dsl_binding.binding = 0;
9099 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9100 dsl_binding.descriptorCount = 1;
9101 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009102
9103 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009104 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9105 ds_layout_ci.bindingCount = 1;
9106 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009107
9108 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009109 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9110 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009111 ASSERT_VK_SUCCESS(err);
9112
9113 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009114 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009115 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009116 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009117 alloc_info.descriptorPool = ds_pool;
9118 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009119 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9120 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009121 ASSERT_VK_SUCCESS(err);
9122
9123 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009124 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9125 pipeline_layout_ci.setLayoutCount = 1;
9126 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009127
9128 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009129 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9130 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009131 ASSERT_VK_SUCCESS(err);
9132
9133 VkViewport vp = {}; // Just need dummy vp to point to
9134
9135 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009136 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9137 vp_state_ci.scissorCount = 0;
9138 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
9139 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009140
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009141 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
9142 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9143 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
9144 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
9145 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9146 rs_state_ci.depthClampEnable = VK_FALSE;
9147 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
9148 rs_state_ci.depthBiasEnable = VK_FALSE;
9149
Cody Northropeb3a6c12015-10-05 14:44:45 -06009150 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009151 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009152
Karl Schultz6addd812016-02-02 17:17:23 -07009153 VkShaderObj vs(m_device, bindStateVertShaderText,
9154 VK_SHADER_STAGE_VERTEX_BIT, this);
9155 VkShaderObj fs(m_device, bindStateFragShaderText,
9156 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009157 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009158 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009159 shaderStages[0] = vs.GetStageCreateInfo();
9160 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009161
9162 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009163 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9164 gp_ci.stageCount = 2;
9165 gp_ci.pStages = shaderStages;
9166 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009167 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07009168 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9169 gp_ci.layout = pipeline_layout;
9170 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009171
9172 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009173 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009174
9175 VkPipeline pipeline;
9176 VkPipelineCache pipelineCache;
9177
Karl Schultz6addd812016-02-02 17:17:23 -07009178 err =
9179 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009180 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009181 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9182 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009183
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009184 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009185
Chia-I Wuf7458c52015-10-26 21:10:41 +08009186 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9187 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9188 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9189 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009190}
Karl Schultz6addd812016-02-02 17:17:23 -07009191// Don't set viewport state in PSO. This is an error b/c we always need this
9192// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06009193// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07009194TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06009195 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07009196 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009197
Karl Schultz6addd812016-02-02 17:17:23 -07009198 m_errorMonitor->SetDesiredFailureMsg(
9199 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009200 "Gfx Pipeline pViewportState is null. Even if ");
9201
Tobin Ehlise68360f2015-10-01 11:15:13 -06009202 ASSERT_NO_FATAL_FAILURE(InitState());
9203 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06009204
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009205 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009206 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9207 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009208
9209 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009210 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9211 ds_pool_ci.maxSets = 1;
9212 ds_pool_ci.poolSizeCount = 1;
9213 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009214
9215 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009216 err =
9217 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009218 ASSERT_VK_SUCCESS(err);
9219
9220 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009221 dsl_binding.binding = 0;
9222 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9223 dsl_binding.descriptorCount = 1;
9224 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009225
9226 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009227 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9228 ds_layout_ci.bindingCount = 1;
9229 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009230
9231 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009232 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9233 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009234 ASSERT_VK_SUCCESS(err);
9235
9236 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009237 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009238 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009239 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009240 alloc_info.descriptorPool = ds_pool;
9241 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009242 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9243 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009244 ASSERT_VK_SUCCESS(err);
9245
9246 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009247 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9248 pipeline_layout_ci.setLayoutCount = 1;
9249 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009250
9251 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009252 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9253 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009254 ASSERT_VK_SUCCESS(err);
9255
9256 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
9257 // Set scissor as dynamic to avoid second error
9258 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009259 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9260 dyn_state_ci.dynamicStateCount = 1;
9261 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009262
Cody Northropeb3a6c12015-10-05 14:44:45 -06009263 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009264 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009265
Karl Schultz6addd812016-02-02 17:17:23 -07009266 VkShaderObj vs(m_device, bindStateVertShaderText,
9267 VK_SHADER_STAGE_VERTEX_BIT, this);
9268 VkShaderObj fs(m_device, bindStateFragShaderText,
9269 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009270 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009271 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009272 shaderStages[0] = vs.GetStageCreateInfo();
9273 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009274
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009275
9276 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
9277 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9278 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
9279 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
9280 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9281 rs_state_ci.depthClampEnable = VK_FALSE;
9282 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
9283 rs_state_ci.depthBiasEnable = VK_FALSE;
9284
Tobin Ehlise68360f2015-10-01 11:15:13 -06009285 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009286 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9287 gp_ci.stageCount = 2;
9288 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009289 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07009290 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
9291 // should cause validation error
9292 gp_ci.pDynamicState = &dyn_state_ci;
9293 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9294 gp_ci.layout = pipeline_layout;
9295 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009296
9297 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009298 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009299
9300 VkPipeline pipeline;
9301 VkPipelineCache pipelineCache;
9302
Karl Schultz6addd812016-02-02 17:17:23 -07009303 err =
9304 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009305 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009306 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9307 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009308
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009309 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009310
Chia-I Wuf7458c52015-10-26 21:10:41 +08009311 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9312 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9313 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9314 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009315}
9316// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07009317// Then run second test where dynamic scissor count doesn't match PSO scissor
9318// count
9319TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
9320 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009321
Karl Schultz6addd812016-02-02 17:17:23 -07009322 m_errorMonitor->SetDesiredFailureMsg(
9323 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009324 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
9325
Tobin Ehlise68360f2015-10-01 11:15:13 -06009326 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009327
9328 if (!m_device->phy().features().multiViewport) {
9329 printf("Device does not support multiple viewports/scissors; skipped.\n");
9330 return;
9331 }
9332
Tobin Ehlise68360f2015-10-01 11:15:13 -06009333 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06009334
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009335 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009336 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9337 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009338
9339 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009340 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9341 ds_pool_ci.maxSets = 1;
9342 ds_pool_ci.poolSizeCount = 1;
9343 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009344
9345 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009346 err =
9347 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009348 ASSERT_VK_SUCCESS(err);
9349
9350 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009351 dsl_binding.binding = 0;
9352 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9353 dsl_binding.descriptorCount = 1;
9354 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009355
9356 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009357 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9358 ds_layout_ci.bindingCount = 1;
9359 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009360
9361 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009362 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9363 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009364 ASSERT_VK_SUCCESS(err);
9365
9366 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009367 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009368 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009369 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009370 alloc_info.descriptorPool = ds_pool;
9371 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009372 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9373 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009374 ASSERT_VK_SUCCESS(err);
9375
9376 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009377 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9378 pipeline_layout_ci.setLayoutCount = 1;
9379 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009380
9381 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009382 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9383 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009384 ASSERT_VK_SUCCESS(err);
9385
9386 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009387 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9388 vp_state_ci.viewportCount = 1;
9389 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
9390 vp_state_ci.scissorCount = 1;
9391 vp_state_ci.pScissors =
9392 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06009393
9394 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
9395 // Set scissor as dynamic to avoid that error
9396 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009397 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9398 dyn_state_ci.dynamicStateCount = 1;
9399 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009400
Cody Northropeb3a6c12015-10-05 14:44:45 -06009401 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009402 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009403
Karl Schultz6addd812016-02-02 17:17:23 -07009404 VkShaderObj vs(m_device, bindStateVertShaderText,
9405 VK_SHADER_STAGE_VERTEX_BIT, this);
9406 VkShaderObj fs(m_device, bindStateFragShaderText,
9407 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009408 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009409 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009410 shaderStages[0] = vs.GetStageCreateInfo();
9411 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009412
Cody Northropf6622dc2015-10-06 10:33:21 -06009413 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9414 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9415 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009416 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06009417 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009418 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06009419 vi_ci.pVertexAttributeDescriptions = nullptr;
9420
9421 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9422 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9423 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9424
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009425 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009426 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06009427 rs_ci.pNext = nullptr;
9428
Mark Youngc89c6312016-03-31 16:03:20 -06009429 VkPipelineColorBlendAttachmentState att = {};
9430 att.blendEnable = VK_FALSE;
9431 att.colorWriteMask = 0xf;
9432
Cody Northropf6622dc2015-10-06 10:33:21 -06009433 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9434 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9435 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06009436 cb_ci.attachmentCount = 1;
9437 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06009438
Tobin Ehlise68360f2015-10-01 11:15:13 -06009439 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009440 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9441 gp_ci.stageCount = 2;
9442 gp_ci.pStages = shaderStages;
9443 gp_ci.pVertexInputState = &vi_ci;
9444 gp_ci.pInputAssemblyState = &ia_ci;
9445 gp_ci.pViewportState = &vp_state_ci;
9446 gp_ci.pRasterizationState = &rs_ci;
9447 gp_ci.pColorBlendState = &cb_ci;
9448 gp_ci.pDynamicState = &dyn_state_ci;
9449 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9450 gp_ci.layout = pipeline_layout;
9451 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009452
9453 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009454 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009455
9456 VkPipeline pipeline;
9457 VkPipelineCache pipelineCache;
9458
Karl Schultz6addd812016-02-02 17:17:23 -07009459 err =
9460 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009461 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009462 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9463 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009464
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009465 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009466
Tobin Ehlisd332f282015-10-02 11:00:56 -06009467 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07009468 // First need to successfully create the PSO from above by setting
9469 // pViewports
9470 m_errorMonitor->SetDesiredFailureMsg(
9471 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009472 "Dynamic scissor(s) 0 are used by PSO, ");
Karl Schultz6addd812016-02-02 17:17:23 -07009473
9474 VkViewport vp = {}; // Just need dummy vp to point to
9475 vp_state_ci.pViewports = &vp;
9476 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9477 &gp_ci, NULL, &pipeline);
9478 ASSERT_VK_SUCCESS(err);
9479 BeginCommandBuffer();
9480 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9481 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009482 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07009483 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009484 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07009485 Draw(1, 0, 0, 0);
9486
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009487 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07009488
9489 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9490 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9491 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9492 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009493 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07009494}
9495// Create PSO w/o non-zero scissorCount but no scissor data
9496// Then run second test where dynamic viewportCount doesn't match PSO
9497// viewportCount
9498TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
9499 VkResult err;
9500
9501 m_errorMonitor->SetDesiredFailureMsg(
9502 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9503 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
9504
9505 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009506
9507 if (!m_device->phy().features().multiViewport) {
9508 printf("Device does not support multiple viewports/scissors; skipped.\n");
9509 return;
9510 }
9511
Karl Schultz6addd812016-02-02 17:17:23 -07009512 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9513
9514 VkDescriptorPoolSize ds_type_count = {};
9515 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9516 ds_type_count.descriptorCount = 1;
9517
9518 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9519 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9520 ds_pool_ci.maxSets = 1;
9521 ds_pool_ci.poolSizeCount = 1;
9522 ds_pool_ci.pPoolSizes = &ds_type_count;
9523
9524 VkDescriptorPool ds_pool;
9525 err =
9526 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9527 ASSERT_VK_SUCCESS(err);
9528
9529 VkDescriptorSetLayoutBinding dsl_binding = {};
9530 dsl_binding.binding = 0;
9531 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9532 dsl_binding.descriptorCount = 1;
9533 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9534
9535 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9536 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9537 ds_layout_ci.bindingCount = 1;
9538 ds_layout_ci.pBindings = &dsl_binding;
9539
9540 VkDescriptorSetLayout ds_layout;
9541 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9542 &ds_layout);
9543 ASSERT_VK_SUCCESS(err);
9544
9545 VkDescriptorSet descriptorSet;
9546 VkDescriptorSetAllocateInfo alloc_info = {};
9547 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9548 alloc_info.descriptorSetCount = 1;
9549 alloc_info.descriptorPool = ds_pool;
9550 alloc_info.pSetLayouts = &ds_layout;
9551 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9552 &descriptorSet);
9553 ASSERT_VK_SUCCESS(err);
9554
9555 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9556 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9557 pipeline_layout_ci.setLayoutCount = 1;
9558 pipeline_layout_ci.pSetLayouts = &ds_layout;
9559
9560 VkPipelineLayout pipeline_layout;
9561 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9562 &pipeline_layout);
9563 ASSERT_VK_SUCCESS(err);
9564
9565 VkPipelineViewportStateCreateInfo vp_state_ci = {};
9566 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9567 vp_state_ci.scissorCount = 1;
9568 vp_state_ci.pScissors =
9569 NULL; // Null scissor w/ count of 1 should cause error
9570 vp_state_ci.viewportCount = 1;
9571 vp_state_ci.pViewports =
9572 NULL; // vp is dynamic (below) so this won't cause error
9573
9574 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
9575 // Set scissor as dynamic to avoid that error
9576 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
9577 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9578 dyn_state_ci.dynamicStateCount = 1;
9579 dyn_state_ci.pDynamicStates = &vp_state;
9580
9581 VkPipelineShaderStageCreateInfo shaderStages[2];
9582 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
9583
9584 VkShaderObj vs(m_device, bindStateVertShaderText,
9585 VK_SHADER_STAGE_VERTEX_BIT, this);
9586 VkShaderObj fs(m_device, bindStateFragShaderText,
9587 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009588 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009589 // but add it to be able to run on more devices
9590 shaderStages[0] = vs.GetStageCreateInfo();
9591 shaderStages[1] = fs.GetStageCreateInfo();
9592
9593 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9594 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9595 vi_ci.pNext = nullptr;
9596 vi_ci.vertexBindingDescriptionCount = 0;
9597 vi_ci.pVertexBindingDescriptions = nullptr;
9598 vi_ci.vertexAttributeDescriptionCount = 0;
9599 vi_ci.pVertexAttributeDescriptions = nullptr;
9600
9601 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9602 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9603 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9604
9605 VkPipelineRasterizationStateCreateInfo rs_ci = {};
9606 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9607 rs_ci.pNext = nullptr;
9608
Mark Youngc89c6312016-03-31 16:03:20 -06009609 VkPipelineColorBlendAttachmentState att = {};
9610 att.blendEnable = VK_FALSE;
9611 att.colorWriteMask = 0xf;
9612
Karl Schultz6addd812016-02-02 17:17:23 -07009613 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9614 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9615 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06009616 cb_ci.attachmentCount = 1;
9617 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07009618
9619 VkGraphicsPipelineCreateInfo gp_ci = {};
9620 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9621 gp_ci.stageCount = 2;
9622 gp_ci.pStages = shaderStages;
9623 gp_ci.pVertexInputState = &vi_ci;
9624 gp_ci.pInputAssemblyState = &ia_ci;
9625 gp_ci.pViewportState = &vp_state_ci;
9626 gp_ci.pRasterizationState = &rs_ci;
9627 gp_ci.pColorBlendState = &cb_ci;
9628 gp_ci.pDynamicState = &dyn_state_ci;
9629 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9630 gp_ci.layout = pipeline_layout;
9631 gp_ci.renderPass = renderPass();
9632
9633 VkPipelineCacheCreateInfo pc_ci = {};
9634 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9635
9636 VkPipeline pipeline;
9637 VkPipelineCache pipelineCache;
9638
9639 err =
9640 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9641 ASSERT_VK_SUCCESS(err);
9642 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9643 &gp_ci, NULL, &pipeline);
9644
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009645 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07009646
9647 // Now hit second fail case where we set scissor w/ different count than PSO
9648 // First need to successfully create the PSO from above by setting
9649 // pViewports
9650 m_errorMonitor->SetDesiredFailureMsg(
9651 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009652 "Dynamic viewport(s) 0 are used by PSO, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009653
Tobin Ehlisd332f282015-10-02 11:00:56 -06009654 VkRect2D sc = {}; // Just need dummy vp to point to
9655 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07009656 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9657 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009658 ASSERT_VK_SUCCESS(err);
9659 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009660 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9661 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009662 VkViewport viewports[1] = {}; // don't care about data
Tobin Ehlisd332f282015-10-02 11:00:56 -06009663 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009664 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009665 Draw(1, 0, 0, 0);
9666
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009667 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009668
Chia-I Wuf7458c52015-10-26 21:10:41 +08009669 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9670 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9671 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9672 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009673 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009674}
9675
Mark Young7394fdd2016-03-31 14:56:43 -06009676TEST_F(VkLayerTest, PSOLineWidthInvalid) {
9677 VkResult err;
9678
9679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009680 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009681
9682 ASSERT_NO_FATAL_FAILURE(InitState());
9683 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9684
9685 VkDescriptorPoolSize ds_type_count = {};
9686 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9687 ds_type_count.descriptorCount = 1;
9688
9689 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9690 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9691 ds_pool_ci.maxSets = 1;
9692 ds_pool_ci.poolSizeCount = 1;
9693 ds_pool_ci.pPoolSizes = &ds_type_count;
9694
9695 VkDescriptorPool ds_pool;
9696 err =
9697 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9698 ASSERT_VK_SUCCESS(err);
9699
9700 VkDescriptorSetLayoutBinding dsl_binding = {};
9701 dsl_binding.binding = 0;
9702 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9703 dsl_binding.descriptorCount = 1;
9704 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9705
9706 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9707 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9708 ds_layout_ci.bindingCount = 1;
9709 ds_layout_ci.pBindings = &dsl_binding;
9710
9711 VkDescriptorSetLayout ds_layout;
9712 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9713 &ds_layout);
9714 ASSERT_VK_SUCCESS(err);
9715
9716 VkDescriptorSet descriptorSet;
9717 VkDescriptorSetAllocateInfo alloc_info = {};
9718 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9719 alloc_info.descriptorSetCount = 1;
9720 alloc_info.descriptorPool = ds_pool;
9721 alloc_info.pSetLayouts = &ds_layout;
9722 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9723 &descriptorSet);
9724 ASSERT_VK_SUCCESS(err);
9725
9726 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9727 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9728 pipeline_layout_ci.setLayoutCount = 1;
9729 pipeline_layout_ci.pSetLayouts = &ds_layout;
9730
9731 VkPipelineLayout pipeline_layout;
9732 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9733 &pipeline_layout);
9734 ASSERT_VK_SUCCESS(err);
9735
9736 VkPipelineViewportStateCreateInfo vp_state_ci = {};
9737 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9738 vp_state_ci.scissorCount = 1;
9739 vp_state_ci.pScissors = NULL;
9740 vp_state_ci.viewportCount = 1;
9741 vp_state_ci.pViewports = NULL;
9742
9743 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
9744 VK_DYNAMIC_STATE_SCISSOR,
9745 VK_DYNAMIC_STATE_LINE_WIDTH};
9746 // Set scissor as dynamic to avoid that error
9747 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
9748 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9749 dyn_state_ci.dynamicStateCount = 2;
9750 dyn_state_ci.pDynamicStates = dynamic_states;
9751
9752 VkPipelineShaderStageCreateInfo shaderStages[2];
9753 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
9754
9755 VkShaderObj vs(m_device, bindStateVertShaderText,
9756 VK_SHADER_STAGE_VERTEX_BIT, this);
9757 VkShaderObj fs(m_device, bindStateFragShaderText,
9758 VK_SHADER_STAGE_FRAGMENT_BIT,
9759 this); // TODO - We shouldn't need a fragment shader
9760 // but add it to be able to run on more devices
9761 shaderStages[0] = vs.GetStageCreateInfo();
9762 shaderStages[1] = fs.GetStageCreateInfo();
9763
9764 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9765 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9766 vi_ci.pNext = nullptr;
9767 vi_ci.vertexBindingDescriptionCount = 0;
9768 vi_ci.pVertexBindingDescriptions = nullptr;
9769 vi_ci.vertexAttributeDescriptionCount = 0;
9770 vi_ci.pVertexAttributeDescriptions = nullptr;
9771
9772 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9773 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9774 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9775
9776 VkPipelineRasterizationStateCreateInfo rs_ci = {};
9777 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9778 rs_ci.pNext = nullptr;
9779
Mark Young47107952016-05-02 15:59:55 -06009780 // Check too low (line width of -1.0f).
9781 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06009782
9783 VkPipelineColorBlendAttachmentState att = {};
9784 att.blendEnable = VK_FALSE;
9785 att.colorWriteMask = 0xf;
9786
9787 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9788 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9789 cb_ci.pNext = nullptr;
9790 cb_ci.attachmentCount = 1;
9791 cb_ci.pAttachments = &att;
9792
9793 VkGraphicsPipelineCreateInfo gp_ci = {};
9794 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9795 gp_ci.stageCount = 2;
9796 gp_ci.pStages = shaderStages;
9797 gp_ci.pVertexInputState = &vi_ci;
9798 gp_ci.pInputAssemblyState = &ia_ci;
9799 gp_ci.pViewportState = &vp_state_ci;
9800 gp_ci.pRasterizationState = &rs_ci;
9801 gp_ci.pColorBlendState = &cb_ci;
9802 gp_ci.pDynamicState = &dyn_state_ci;
9803 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9804 gp_ci.layout = pipeline_layout;
9805 gp_ci.renderPass = renderPass();
9806
9807 VkPipelineCacheCreateInfo pc_ci = {};
9808 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9809
9810 VkPipeline pipeline;
9811 VkPipelineCache pipelineCache;
9812
9813 err =
9814 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9815 ASSERT_VK_SUCCESS(err);
9816 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9817 &gp_ci, NULL, &pipeline);
9818
9819 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009820 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009821
9822 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9823 "Attempt to set lineWidth to 65536");
9824
9825 // Check too high (line width of 65536.0f).
9826 rs_ci.lineWidth = 65536.0f;
9827
9828 err =
9829 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9830 ASSERT_VK_SUCCESS(err);
9831 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9832 &gp_ci, NULL, &pipeline);
9833
9834 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009835 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009836
9837 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009838 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009839
9840 dyn_state_ci.dynamicStateCount = 3;
9841
9842 rs_ci.lineWidth = 1.0f;
9843
9844 err =
9845 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9846 ASSERT_VK_SUCCESS(err);
9847 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9848 &gp_ci, NULL, &pipeline);
9849 BeginCommandBuffer();
9850 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9851 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
9852
9853 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06009854 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06009855 m_errorMonitor->VerifyFound();
9856
9857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9858 "Attempt to set lineWidth to 65536");
9859
9860 // Check too high with dynamic setting.
9861 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
9862 m_errorMonitor->VerifyFound();
9863 EndCommandBuffer();
9864
9865 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9866 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9867 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9868 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009869 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009870}
9871
Karl Schultz6addd812016-02-02 17:17:23 -07009872TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009873 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009874 m_errorMonitor->SetDesiredFailureMsg(
9875 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009876 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009877
9878 ASSERT_NO_FATAL_FAILURE(InitState());
9879 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009880
Tony Barbourfe3351b2015-07-28 10:17:20 -06009881 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009882 // Don't care about RenderPass handle b/c error should be flagged before
9883 // that
9884 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
9885 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009886
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009887 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009888}
9889
Karl Schultz6addd812016-02-02 17:17:23 -07009890TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009891 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009892 m_errorMonitor->SetDesiredFailureMsg(
9893 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009894 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009895
9896 ASSERT_NO_FATAL_FAILURE(InitState());
9897 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009898
Tony Barbourfe3351b2015-07-28 10:17:20 -06009899 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009900 // Just create a dummy Renderpass that's non-NULL so we can get to the
9901 // proper error
Chris Forbes38ae7c42016-06-21 20:51:44 +12009902 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
Karl Schultz6addd812016-02-02 17:17:23 -07009903 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009904
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009905 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009906}
9907
Chris Forbes2eeabe32016-06-21 20:52:34 +12009908TEST_F(VkLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
9909 m_errorMonitor->ExpectSuccess();
9910
9911 ASSERT_NO_FATAL_FAILURE(InitState());
9912 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9913
9914 BeginCommandBuffer(); // framework implicitly begins the renderpass.
9915 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // end implicit.
9916
9917 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9918 VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9919 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9920 m_errorMonitor->VerifyNotFound();
9921 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9922 VK_SUBPASS_CONTENTS_INLINE);
9923 m_errorMonitor->VerifyNotFound();
9924 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9925 m_errorMonitor->VerifyNotFound();
9926
9927 m_commandBuffer->EndCommandBuffer();
9928 m_errorMonitor->VerifyNotFound();
9929}
9930
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009931TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
9932 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
9933 "the number of renderPass attachments that use loadOp"
9934 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
9935
9936 ASSERT_NO_FATAL_FAILURE(InitState());
9937 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9938
9939 // Create a renderPass with a single attachment that uses loadOp CLEAR
9940 VkAttachmentReference attach = {};
9941 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9942 VkSubpassDescription subpass = {};
9943 subpass.inputAttachmentCount = 1;
9944 subpass.pInputAttachments = &attach;
9945 VkRenderPassCreateInfo rpci = {};
9946 rpci.subpassCount = 1;
9947 rpci.pSubpasses = &subpass;
9948 rpci.attachmentCount = 1;
9949 VkAttachmentDescription attach_desc = {};
9950 attach_desc.format = VK_FORMAT_UNDEFINED;
9951 // Set loadOp to CLEAR
9952 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9953 rpci.pAttachments = &attach_desc;
9954 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9955 VkRenderPass rp;
9956 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9957
9958 VkCommandBufferInheritanceInfo hinfo = {};
9959 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9960 hinfo.renderPass = VK_NULL_HANDLE;
9961 hinfo.subpass = 0;
9962 hinfo.framebuffer = VK_NULL_HANDLE;
9963 hinfo.occlusionQueryEnable = VK_FALSE;
9964 hinfo.queryFlags = 0;
9965 hinfo.pipelineStatistics = 0;
9966 VkCommandBufferBeginInfo info = {};
9967 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9968 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9969 info.pInheritanceInfo = &hinfo;
9970
9971 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9972 VkRenderPassBeginInfo rp_begin = {};
9973 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9974 rp_begin.pNext = NULL;
9975 rp_begin.renderPass = renderPass();
9976 rp_begin.framebuffer = framebuffer();
9977 rp_begin.clearValueCount = 0; // Should be 1
9978
9979 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7f0416c2016-07-15 16:01:13 -06009980 " has a clearValueCount of 0 but "
9981 "there must be at least 1 entries in "
9982 "pClearValues array to account for ");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009983
9984 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
9985 VK_SUBPASS_CONTENTS_INLINE);
9986
9987 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06009988
9989 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009990}
9991
Cody Northrop3bb4d962016-05-09 16:15:57 -06009992TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
9993
9994 TEST_DESCRIPTION("End a command buffer with an active render pass");
9995
9996 m_errorMonitor->SetDesiredFailureMsg(
9997 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9998 "It is invalid to issue this call inside an active render pass");
9999
10000 ASSERT_NO_FATAL_FAILURE(InitState());
10001 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10002
10003 // The framework's BeginCommandBuffer calls CreateRenderPass
10004 BeginCommandBuffer();
10005
10006 // Call directly into vkEndCommandBuffer instead of the
10007 // the framework's EndCommandBuffer, which inserts a
10008 // vkEndRenderPass
10009 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
10010
10011 m_errorMonitor->VerifyFound();
10012
10013 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
10014 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
10015}
10016
Karl Schultz6addd812016-02-02 17:17:23 -070010017TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010018 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -070010019 m_errorMonitor->SetDesiredFailureMsg(
10020 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010021 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010022
10023 ASSERT_NO_FATAL_FAILURE(InitState());
10024 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010025
10026 // Renderpass is started here
10027 BeginCommandBuffer();
10028
10029 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010030 vk_testing::Buffer dstBuffer;
10031 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010032
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010033 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010034
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010035 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010036}
10037
Karl Schultz6addd812016-02-02 17:17:23 -070010038TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010039 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -070010040 m_errorMonitor->SetDesiredFailureMsg(
10041 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010042 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010043
10044 ASSERT_NO_FATAL_FAILURE(InitState());
10045 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010046
10047 // Renderpass is started here
10048 BeginCommandBuffer();
10049
10050 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010051 vk_testing::Buffer dstBuffer;
10052 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010053
Karl Schultz6addd812016-02-02 17:17:23 -070010054 VkDeviceSize dstOffset = 0;
10055 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -060010056 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010057
Karl Schultz6addd812016-02-02 17:17:23 -070010058 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
10059 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010060
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010061 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010062}
10063
Karl Schultz6addd812016-02-02 17:17:23 -070010064TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010065 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010066 m_errorMonitor->SetDesiredFailureMsg(
10067 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010068 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010069
10070 ASSERT_NO_FATAL_FAILURE(InitState());
10071 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010072
10073 // Renderpass is started here
10074 BeginCommandBuffer();
10075
Michael Lentine0a369f62016-02-03 16:51:46 -060010076 VkClearColorValue clear_color;
10077 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -070010078 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
10079 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
10080 const int32_t tex_width = 32;
10081 const int32_t tex_height = 32;
10082 VkImageCreateInfo image_create_info = {};
10083 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10084 image_create_info.pNext = NULL;
10085 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10086 image_create_info.format = tex_format;
10087 image_create_info.extent.width = tex_width;
10088 image_create_info.extent.height = tex_height;
10089 image_create_info.extent.depth = 1;
10090 image_create_info.mipLevels = 1;
10091 image_create_info.arrayLayers = 1;
10092 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10093 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
10094 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010095
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010096 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -070010097 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
10098 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010099
Karl Schultz6addd812016-02-02 17:17:23 -070010100 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
10101 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010102
Karl Schultz6addd812016-02-02 17:17:23 -070010103 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
10104 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010105
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010106 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010107}
10108
Karl Schultz6addd812016-02-02 17:17:23 -070010109TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010110 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010111 m_errorMonitor->SetDesiredFailureMsg(
10112 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010113 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010114
10115 ASSERT_NO_FATAL_FAILURE(InitState());
10116 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010117
10118 // Renderpass is started here
10119 BeginCommandBuffer();
10120
10121 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -070010122 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010123 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
10124 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10125 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
10126 image_create_info.extent.width = 64;
10127 image_create_info.extent.height = 64;
10128 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10129 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010130
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010131 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -070010132 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
10133 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010134
Karl Schultz6addd812016-02-02 17:17:23 -070010135 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
10136 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010137
Karl Schultz6addd812016-02-02 17:17:23 -070010138 vkCmdClearDepthStencilImage(
10139 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
10140 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
10141 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010142
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010143 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010144}
10145
Karl Schultz6addd812016-02-02 17:17:23 -070010146TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010147 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010148 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010149
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010150 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -060010151 "vkCmdClearAttachments(): This call "
Karl Schultz6addd812016-02-02 17:17:23 -070010152 "must be issued inside an active "
10153 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010154
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010155 ASSERT_NO_FATAL_FAILURE(InitState());
10156 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010157
10158 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010159 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010160 ASSERT_VK_SUCCESS(err);
10161
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010162 VkClearAttachment color_attachment;
10163 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10164 color_attachment.clearValue.color.float32[0] = 0;
10165 color_attachment.clearValue.color.float32[1] = 0;
10166 color_attachment.clearValue.color.float32[2] = 0;
10167 color_attachment.clearValue.color.float32[3] = 0;
10168 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010169 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
10170 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
10171 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010172
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010173 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010174}
10175
Karl Schultz9e66a292016-04-21 15:57:51 -060010176TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
10177 // Try to add a buffer memory barrier with no buffer.
10178 m_errorMonitor->SetDesiredFailureMsg(
10179 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10180 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
10181
10182 ASSERT_NO_FATAL_FAILURE(InitState());
10183 BeginCommandBuffer();
10184
10185 VkBufferMemoryBarrier buf_barrier = {};
10186 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
10187 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10188 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10189 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10190 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10191 buf_barrier.buffer = VK_NULL_HANDLE;
10192 buf_barrier.offset = 0;
10193 buf_barrier.size = VK_WHOLE_SIZE;
10194 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10195 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
10196 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
10197
10198 m_errorMonitor->VerifyFound();
10199}
10200
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010201TEST_F(VkLayerTest, InvalidBarriers) {
10202 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
10203
10204 m_errorMonitor->SetDesiredFailureMsg(
10205 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
10206
10207 ASSERT_NO_FATAL_FAILURE(InitState());
10208 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10209
10210 VkMemoryBarrier mem_barrier = {};
10211 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
10212 mem_barrier.pNext = NULL;
10213 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10214 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10215 BeginCommandBuffer();
10216 // BeginCommandBuffer() starts a render pass
10217 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10218 VK_PIPELINE_STAGE_HOST_BIT,
10219 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
10220 &mem_barrier, 0, nullptr, 0, nullptr);
10221 m_errorMonitor->VerifyFound();
10222
10223 m_errorMonitor->SetDesiredFailureMsg(
10224 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10225 "Image Layout cannot be transitioned to UNDEFINED");
10226 VkImageObj image(m_device);
10227 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
10228 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10229 ASSERT_TRUE(image.initialized());
10230 VkImageMemoryBarrier img_barrier = {};
10231 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10232 img_barrier.pNext = NULL;
10233 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10234 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10235 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10236 // New layout can't be UNDEFINED
10237 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
10238 img_barrier.image = image.handle();
10239 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10240 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10241 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10242 img_barrier.subresourceRange.baseArrayLayer = 0;
10243 img_barrier.subresourceRange.baseMipLevel = 0;
10244 img_barrier.subresourceRange.layerCount = 1;
10245 img_barrier.subresourceRange.levelCount = 1;
10246 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10247 VK_PIPELINE_STAGE_HOST_BIT,
10248 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10249 nullptr, 1, &img_barrier);
10250 m_errorMonitor->VerifyFound();
10251 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10252
10253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10254 "Subresource must have the sum of the "
10255 "baseArrayLayer");
10256 // baseArrayLayer + layerCount must be <= image's arrayLayers
10257 img_barrier.subresourceRange.baseArrayLayer = 1;
10258 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10259 VK_PIPELINE_STAGE_HOST_BIT,
10260 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10261 nullptr, 1, &img_barrier);
10262 m_errorMonitor->VerifyFound();
10263 img_barrier.subresourceRange.baseArrayLayer = 0;
10264
10265 m_errorMonitor->SetDesiredFailureMsg(
10266 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10267 "Subresource must have the sum of the baseMipLevel");
10268 // baseMipLevel + levelCount must be <= image's mipLevels
10269 img_barrier.subresourceRange.baseMipLevel = 1;
10270 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10271 VK_PIPELINE_STAGE_HOST_BIT,
10272 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10273 nullptr, 1, &img_barrier);
10274 m_errorMonitor->VerifyFound();
10275 img_barrier.subresourceRange.baseMipLevel = 0;
10276
10277 m_errorMonitor->SetDesiredFailureMsg(
10278 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10279 "Buffer Barriers cannot be used during a render pass");
10280 vk_testing::Buffer buffer;
10281 buffer.init(*m_device, 256);
10282 VkBufferMemoryBarrier buf_barrier = {};
10283 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
10284 buf_barrier.pNext = NULL;
10285 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10286 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10287 buf_barrier.buffer = buffer.handle();
10288 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10289 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10290 buf_barrier.offset = 0;
10291 buf_barrier.size = VK_WHOLE_SIZE;
10292 // Can't send buffer barrier during a render pass
10293 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10294 VK_PIPELINE_STAGE_HOST_BIT,
10295 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10296 &buf_barrier, 0, nullptr);
10297 m_errorMonitor->VerifyFound();
10298 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
10299
10300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10301 "which is not less than total size");
10302 buf_barrier.offset = 257;
10303 // Offset greater than total size
10304 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10305 VK_PIPELINE_STAGE_HOST_BIT,
10306 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10307 &buf_barrier, 0, nullptr);
10308 m_errorMonitor->VerifyFound();
10309 buf_barrier.offset = 0;
10310
10311 m_errorMonitor->SetDesiredFailureMsg(
10312 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
10313 buf_barrier.size = 257;
10314 // Size greater than total size
10315 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10316 VK_PIPELINE_STAGE_HOST_BIT,
10317 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10318 &buf_barrier, 0, nullptr);
10319 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010320
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010321 // Now exercise barrier aspect bit errors, first DS
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010322 m_errorMonitor->SetDesiredFailureMsg(
10323 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10324 "Image is a depth and stencil format and thus must "
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010325 "have either one or both of VK_IMAGE_ASPECT_DEPTH_BIT and "
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010326 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
10327 VkDepthStencilObj ds_image(m_device);
10328 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
10329 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010330 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10331 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010332 img_barrier.image = ds_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010333 // Use of COLOR aspect on DS image is error
10334 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010335 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10336 VK_PIPELINE_STAGE_HOST_BIT,
10337 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10338 nullptr, 1, &img_barrier);
10339 m_errorMonitor->VerifyFound();
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010340 // Now test depth-only
10341 VkFormatProperties format_props;
10342
10343 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(),
10344 VK_FORMAT_D16_UNORM, &format_props);
10345 if (format_props.optimalTilingFeatures &
10346 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
10347 m_errorMonitor->SetDesiredFailureMsg(
10348 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10349 "Image is a depth-only format and thus must "
10350 "have VK_IMAGE_ASPECT_DEPTH_BIT set.");
10351 VkDepthStencilObj d_image(m_device);
10352 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
10353 ASSERT_TRUE(d_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010354 img_barrier.oldLayout =
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010355 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -060010356 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010357 img_barrier.image = d_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010358 // Use of COLOR aspect on depth image is error
10359 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010360 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10361 VK_PIPELINE_STAGE_HOST_BIT,
10362 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
10363 0, nullptr, 1, &img_barrier);
10364 m_errorMonitor->VerifyFound();
10365 }
10366 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(),
10367 VK_FORMAT_S8_UINT, &format_props);
10368 if (format_props.optimalTilingFeatures &
10369 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
10370 // Now test stencil-only
10371 m_errorMonitor->SetDesiredFailureMsg(
10372 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10373 "Image is a stencil-only format and thus must "
10374 "have VK_IMAGE_ASPECT_STENCIL_BIT set.");
10375 VkDepthStencilObj s_image(m_device);
10376 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
10377 ASSERT_TRUE(s_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010378 img_barrier.oldLayout =
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010379 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -060010380 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010381 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010382 // Use of COLOR aspect on depth image is error
10383 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010384 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10385 VK_PIPELINE_STAGE_HOST_BIT,
10386 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
10387 0, nullptr, 1, &img_barrier);
10388 m_errorMonitor->VerifyFound();
10389 }
10390 // Finally test color
10391 m_errorMonitor->SetDesiredFailureMsg(
10392 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image is a color format and thus must "
10393 "have VK_IMAGE_ASPECT_COLOR_BIT set.");
10394 VkImageObj c_image(m_device);
10395 c_image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
10396 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10397 0);
10398 ASSERT_TRUE(c_image.initialized());
10399 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10400 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
10401 img_barrier.image = c_image.handle();
10402 // Set aspect to depth (non-color)
10403 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
10404 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10405 VK_PIPELINE_STAGE_HOST_BIT,
10406 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10407 nullptr, 1, &img_barrier);
10408 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010409}
10410
Karl Schultz6addd812016-02-02 17:17:23 -070010411TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010412 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010413 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010414
Karl Schultz6addd812016-02-02 17:17:23 -070010415 m_errorMonitor->SetDesiredFailureMsg(
10416 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010417 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
10418
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010419 ASSERT_NO_FATAL_FAILURE(InitState());
10420 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010421 uint32_t qfi = 0;
10422 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010423 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10424 buffCI.size = 1024;
10425 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10426 buffCI.queueFamilyIndexCount = 1;
10427 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010428
10429 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010430 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010431 ASSERT_VK_SUCCESS(err);
10432
10433 BeginCommandBuffer();
10434 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -070010435 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10436 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010437 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -070010438 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
10439 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010440
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010441 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010442
Chia-I Wuf7458c52015-10-26 21:10:41 +080010443 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010444}
10445
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010446TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
10447 // Create an out-of-range queueFamilyIndex
10448 m_errorMonitor->SetDesiredFailureMsg(
10449 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -060010450 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
10451 "of the indices specified when the device was created, via the "
10452 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010453
10454 ASSERT_NO_FATAL_FAILURE(InitState());
10455 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10456 VkBufferCreateInfo buffCI = {};
10457 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10458 buffCI.size = 1024;
10459 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10460 buffCI.queueFamilyIndexCount = 1;
10461 // Introduce failure by specifying invalid queue_family_index
10462 uint32_t qfi = 777;
10463 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -060010464 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010465
10466 VkBuffer ib;
10467 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
10468
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010469 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060010470 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010471}
10472
Karl Schultz6addd812016-02-02 17:17:23 -070010473TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010474 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands w/ a primary cmd buffer"
10475 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010476
Karl Schultz6addd812016-02-02 17:17:23 -070010477 m_errorMonitor->SetDesiredFailureMsg(
10478 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010479 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010480
10481 ASSERT_NO_FATAL_FAILURE(InitState());
10482 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010483
10484 BeginCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010485
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010486 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
10487 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010488
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010489 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010490}
10491
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010492TEST_F(VkLayerTest, DSUsageBitsErrors) {
10493 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
10494 "that do not have correct usage bits sets.");
10495 VkResult err;
10496
10497 ASSERT_NO_FATAL_FAILURE(InitState());
10498 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10499 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10500 ds_type_count[i].type = VkDescriptorType(i);
10501 ds_type_count[i].descriptorCount = 1;
10502 }
10503 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10504 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10505 ds_pool_ci.pNext = NULL;
10506 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10507 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10508 ds_pool_ci.pPoolSizes = ds_type_count;
10509
10510 VkDescriptorPool ds_pool;
10511 err =
10512 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10513 ASSERT_VK_SUCCESS(err);
10514
10515 // Create 10 layouts where each has a single descriptor of different type
10516 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] =
10517 {};
10518 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10519 dsl_binding[i].binding = 0;
10520 dsl_binding[i].descriptorType = VkDescriptorType(i);
10521 dsl_binding[i].descriptorCount = 1;
10522 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
10523 dsl_binding[i].pImmutableSamplers = NULL;
10524 }
10525
10526 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10527 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10528 ds_layout_ci.pNext = NULL;
10529 ds_layout_ci.bindingCount = 1;
10530 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
10531 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10532 ds_layout_ci.pBindings = dsl_binding + i;
10533 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
10534 NULL, ds_layouts + i);
10535 ASSERT_VK_SUCCESS(err);
10536 }
10537 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10538 VkDescriptorSetAllocateInfo alloc_info = {};
10539 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10540 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10541 alloc_info.descriptorPool = ds_pool;
10542 alloc_info.pSetLayouts = ds_layouts;
10543 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10544 descriptor_sets);
10545 ASSERT_VK_SUCCESS(err);
10546
10547 // Create a buffer & bufferView to be used for invalid updates
10548 VkBufferCreateInfo buff_ci = {};
10549 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10550 // This usage is not valid for any descriptor type
10551 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
10552 buff_ci.size = 256;
10553 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10554 VkBuffer buffer;
10555 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10556 ASSERT_VK_SUCCESS(err);
10557
10558 VkBufferViewCreateInfo buff_view_ci = {};
10559 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
10560 buff_view_ci.buffer = buffer;
10561 buff_view_ci.format = VK_FORMAT_R8_UNORM;
10562 buff_view_ci.range = VK_WHOLE_SIZE;
10563 VkBufferView buff_view;
10564 err =
10565 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
10566 ASSERT_VK_SUCCESS(err);
10567
10568 // Create an image to be used for invalid updates
10569 VkImageCreateInfo image_ci = {};
10570 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10571 image_ci.imageType = VK_IMAGE_TYPE_2D;
10572 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
10573 image_ci.extent.width = 64;
10574 image_ci.extent.height = 64;
10575 image_ci.extent.depth = 1;
10576 image_ci.mipLevels = 1;
10577 image_ci.arrayLayers = 1;
10578 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
10579 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10580 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10581 // This usage is not valid for any descriptor type
10582 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10583 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10584 VkImage image;
10585 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10586 ASSERT_VK_SUCCESS(err);
10587 // Bind memory to image
10588 VkMemoryRequirements mem_reqs;
10589 VkDeviceMemory image_mem;
10590 bool pass;
10591 VkMemoryAllocateInfo mem_alloc = {};
10592 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10593 mem_alloc.pNext = NULL;
10594 mem_alloc.allocationSize = 0;
10595 mem_alloc.memoryTypeIndex = 0;
10596 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10597 mem_alloc.allocationSize = mem_reqs.size;
10598 pass =
10599 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10600 ASSERT_TRUE(pass);
10601 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10602 ASSERT_VK_SUCCESS(err);
10603 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10604 ASSERT_VK_SUCCESS(err);
10605 // Now create view for image
10606 VkImageViewCreateInfo image_view_ci = {};
10607 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10608 image_view_ci.image = image;
10609 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
10610 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10611 image_view_ci.subresourceRange.layerCount = 1;
10612 image_view_ci.subresourceRange.baseArrayLayer = 0;
10613 image_view_ci.subresourceRange.levelCount = 1;
10614 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10615 VkImageView image_view;
10616 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10617 &image_view);
10618 ASSERT_VK_SUCCESS(err);
10619
10620 VkDescriptorBufferInfo buff_info = {};
10621 buff_info.buffer = buffer;
10622 VkDescriptorImageInfo img_info = {};
10623 img_info.imageView = image_view;
10624 VkWriteDescriptorSet descriptor_write = {};
10625 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10626 descriptor_write.dstBinding = 0;
10627 descriptor_write.descriptorCount = 1;
10628 descriptor_write.pTexelBufferView = &buff_view;
10629 descriptor_write.pBufferInfo = &buff_info;
10630 descriptor_write.pImageInfo = &img_info;
10631
10632 // These error messages align with VkDescriptorType struct
10633 const char *error_msgs[] = {
10634 "", // placeholder, no error for SAMPLER descriptor
10635 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
10636 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
10637 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
10638 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
10639 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
10640 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
10641 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
10642 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
10643 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
10644 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
10645 // Start loop at 1 as SAMPLER desc type has no usage bit error
10646 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10647 descriptor_write.descriptorType = VkDescriptorType(i);
10648 descriptor_write.dstSet = descriptor_sets[i];
10649 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10650 error_msgs[i]);
10651
10652 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
10653 NULL);
10654
10655 m_errorMonitor->VerifyFound();
10656 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
10657 }
10658 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
10659 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010660 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010661 vkDestroyImageView(m_device->device(), image_view, NULL);
10662 vkDestroyBuffer(m_device->device(), buffer, NULL);
10663 vkDestroyBufferView(m_device->device(), buff_view, NULL);
10664 vkFreeDescriptorSets(m_device->device(), ds_pool,
10665 VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
10666 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10667}
10668
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010669TEST_F(VkLayerTest, DSBufferInfoErrors) {
10670 TEST_DESCRIPTION(
10671 "Attempt to update buffer descriptor set that has incorrect "
10672 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
10673 "1. offset value greater than buffer size\n"
10674 "2. range value of 0\n"
10675 "3. range value greater than buffer (size - offset)");
10676 VkResult err;
10677
10678 ASSERT_NO_FATAL_FAILURE(InitState());
10679 VkDescriptorPoolSize ds_type_count = {};
10680 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10681 ds_type_count.descriptorCount = 1;
10682
10683 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10684 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10685 ds_pool_ci.pNext = NULL;
10686 ds_pool_ci.maxSets = 1;
10687 ds_pool_ci.poolSizeCount = 1;
10688 ds_pool_ci.pPoolSizes = &ds_type_count;
10689
10690 VkDescriptorPool ds_pool;
10691 err =
10692 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10693 ASSERT_VK_SUCCESS(err);
10694
10695 // Create layout with single uniform buffer descriptor
10696 VkDescriptorSetLayoutBinding dsl_binding = {};
10697 dsl_binding.binding = 0;
10698 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10699 dsl_binding.descriptorCount = 1;
10700 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10701 dsl_binding.pImmutableSamplers = NULL;
10702
10703 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10704 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10705 ds_layout_ci.pNext = NULL;
10706 ds_layout_ci.bindingCount = 1;
10707 ds_layout_ci.pBindings = &dsl_binding;
10708 VkDescriptorSetLayout ds_layout;
10709 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10710 &ds_layout);
10711 ASSERT_VK_SUCCESS(err);
10712
10713 VkDescriptorSet descriptor_set = {};
10714 VkDescriptorSetAllocateInfo alloc_info = {};
10715 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10716 alloc_info.descriptorSetCount = 1;
10717 alloc_info.descriptorPool = ds_pool;
10718 alloc_info.pSetLayouts = &ds_layout;
10719 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10720 &descriptor_set);
10721 ASSERT_VK_SUCCESS(err);
10722
10723 // Create a buffer to be used for invalid updates
10724 VkBufferCreateInfo buff_ci = {};
10725 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10726 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10727 buff_ci.size = 256;
10728 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10729 VkBuffer buffer;
10730 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10731 ASSERT_VK_SUCCESS(err);
10732 // Have to bind memory to buffer before descriptor update
10733 VkMemoryAllocateInfo mem_alloc = {};
10734 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10735 mem_alloc.pNext = NULL;
10736 mem_alloc.allocationSize = 256;
10737 mem_alloc.memoryTypeIndex = 0;
10738
10739 VkMemoryRequirements mem_reqs;
10740 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
10741 bool pass =
10742 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10743 if (!pass) {
10744 vkDestroyBuffer(m_device->device(), buffer, NULL);
10745 return;
10746 }
10747
10748 VkDeviceMemory mem;
10749 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
10750 ASSERT_VK_SUCCESS(err);
10751 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10752 ASSERT_VK_SUCCESS(err);
10753
10754 VkDescriptorBufferInfo buff_info = {};
10755 buff_info.buffer = buffer;
10756 // First make offset 1 larger than buffer size
10757 buff_info.offset = 257;
10758 buff_info.range = VK_WHOLE_SIZE;
10759 VkWriteDescriptorSet descriptor_write = {};
10760 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10761 descriptor_write.dstBinding = 0;
10762 descriptor_write.descriptorCount = 1;
10763 descriptor_write.pTexelBufferView = nullptr;
10764 descriptor_write.pBufferInfo = &buff_info;
10765 descriptor_write.pImageInfo = nullptr;
10766
10767 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10768 descriptor_write.dstSet = descriptor_set;
10769 m_errorMonitor->SetDesiredFailureMsg(
10770 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10771 " offset of 257 is greater than buffer ");
10772
10773 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10774
10775 m_errorMonitor->VerifyFound();
10776 // Now cause error due to range of 0
10777 buff_info.offset = 0;
10778 buff_info.range = 0;
10779 m_errorMonitor->SetDesiredFailureMsg(
10780 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10781 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
10782
10783 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10784
10785 m_errorMonitor->VerifyFound();
10786 // Now cause error due to range exceeding buffer size - offset
10787 buff_info.offset = 128;
10788 buff_info.range = 200;
10789 m_errorMonitor->SetDesiredFailureMsg(
10790 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10791 " range is 200 which is greater than buffer size ");
10792
10793 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10794
10795 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010796 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010797 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10798 vkDestroyBuffer(m_device->device(), buffer, NULL);
10799 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10800 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10801}
10802
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010803TEST_F(VkLayerTest, DSAspectBitsErrors) {
10804 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10805 // are set, but could expand this test to hit more cases.
10806 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
10807 "that do not have correct aspect bits sets.");
10808 VkResult err;
10809
10810 ASSERT_NO_FATAL_FAILURE(InitState());
10811 VkDescriptorPoolSize ds_type_count = {};
10812 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10813 ds_type_count.descriptorCount = 1;
10814
10815 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10816 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10817 ds_pool_ci.pNext = NULL;
10818 ds_pool_ci.maxSets = 5;
10819 ds_pool_ci.poolSizeCount = 1;
10820 ds_pool_ci.pPoolSizes = &ds_type_count;
10821
10822 VkDescriptorPool ds_pool;
10823 err =
10824 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10825 ASSERT_VK_SUCCESS(err);
10826
10827 VkDescriptorSetLayoutBinding dsl_binding = {};
10828 dsl_binding.binding = 0;
10829 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10830 dsl_binding.descriptorCount = 1;
10831 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10832 dsl_binding.pImmutableSamplers = NULL;
10833
10834 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10835 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10836 ds_layout_ci.pNext = NULL;
10837 ds_layout_ci.bindingCount = 1;
10838 ds_layout_ci.pBindings = &dsl_binding;
10839 VkDescriptorSetLayout ds_layout;
10840 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10841 &ds_layout);
10842 ASSERT_VK_SUCCESS(err);
10843
10844 VkDescriptorSet descriptor_set = {};
10845 VkDescriptorSetAllocateInfo alloc_info = {};
10846 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10847 alloc_info.descriptorSetCount = 1;
10848 alloc_info.descriptorPool = ds_pool;
10849 alloc_info.pSetLayouts = &ds_layout;
10850 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10851 &descriptor_set);
10852 ASSERT_VK_SUCCESS(err);
10853
10854 // Create an image to be used for invalid updates
10855 VkImageCreateInfo image_ci = {};
10856 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10857 image_ci.imageType = VK_IMAGE_TYPE_2D;
10858 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10859 image_ci.extent.width = 64;
10860 image_ci.extent.height = 64;
10861 image_ci.extent.depth = 1;
10862 image_ci.mipLevels = 1;
10863 image_ci.arrayLayers = 1;
10864 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
10865 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10866 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10867 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10868 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10869 VkImage image;
10870 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10871 ASSERT_VK_SUCCESS(err);
10872 // Bind memory to image
10873 VkMemoryRequirements mem_reqs;
10874 VkDeviceMemory image_mem;
10875 bool pass;
10876 VkMemoryAllocateInfo mem_alloc = {};
10877 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10878 mem_alloc.pNext = NULL;
10879 mem_alloc.allocationSize = 0;
10880 mem_alloc.memoryTypeIndex = 0;
10881 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10882 mem_alloc.allocationSize = mem_reqs.size;
10883 pass =
10884 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10885 ASSERT_TRUE(pass);
10886 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10887 ASSERT_VK_SUCCESS(err);
10888 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10889 ASSERT_VK_SUCCESS(err);
10890 // Now create view for image
10891 VkImageViewCreateInfo image_view_ci = {};
10892 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10893 image_view_ci.image = image;
10894 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10895 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10896 image_view_ci.subresourceRange.layerCount = 1;
10897 image_view_ci.subresourceRange.baseArrayLayer = 0;
10898 image_view_ci.subresourceRange.levelCount = 1;
10899 // Setting both depth & stencil aspect bits is illegal for descriptor
10900 image_view_ci.subresourceRange.aspectMask =
10901 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
10902
10903 VkImageView image_view;
10904 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10905 &image_view);
10906 ASSERT_VK_SUCCESS(err);
10907
10908 VkDescriptorImageInfo img_info = {};
10909 img_info.imageView = image_view;
10910 VkWriteDescriptorSet descriptor_write = {};
10911 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10912 descriptor_write.dstBinding = 0;
10913 descriptor_write.descriptorCount = 1;
10914 descriptor_write.pTexelBufferView = NULL;
10915 descriptor_write.pBufferInfo = NULL;
10916 descriptor_write.pImageInfo = &img_info;
10917 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10918 descriptor_write.dstSet = descriptor_set;
10919 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10920 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
10921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10922 error_msg);
10923
10924 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10925
10926 m_errorMonitor->VerifyFound();
10927 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10928 vkDestroyImage(m_device->device(), image, NULL);
10929 vkFreeMemory(m_device->device(), image_mem, NULL);
10930 vkDestroyImageView(m_device->device(), image_view, NULL);
10931 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10932 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10933}
10934
Karl Schultz6addd812016-02-02 17:17:23 -070010935TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010936 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010937 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010938
Karl Schultz6addd812016-02-02 17:17:23 -070010939 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010940 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10941 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10942 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010943
Tobin Ehlis3b780662015-05-28 12:11:26 -060010944 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010945 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010946 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010947 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10948 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010949
10950 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010951 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10952 ds_pool_ci.pNext = NULL;
10953 ds_pool_ci.maxSets = 1;
10954 ds_pool_ci.poolSizeCount = 1;
10955 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010956
Tobin Ehlis3b780662015-05-28 12:11:26 -060010957 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010958 err =
10959 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010960 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010961 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010962 dsl_binding.binding = 0;
10963 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10964 dsl_binding.descriptorCount = 1;
10965 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10966 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010967
Tony Barboureb254902015-07-15 12:50:33 -060010968 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010969 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10970 ds_layout_ci.pNext = NULL;
10971 ds_layout_ci.bindingCount = 1;
10972 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010973
Tobin Ehlis3b780662015-05-28 12:11:26 -060010974 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010975 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10976 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010977 ASSERT_VK_SUCCESS(err);
10978
10979 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010980 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010981 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010982 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010983 alloc_info.descriptorPool = ds_pool;
10984 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010985 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10986 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010987 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010988
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010989 VkSamplerCreateInfo sampler_ci = {};
10990 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10991 sampler_ci.pNext = NULL;
10992 sampler_ci.magFilter = VK_FILTER_NEAREST;
10993 sampler_ci.minFilter = VK_FILTER_NEAREST;
10994 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10995 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10996 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10997 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10998 sampler_ci.mipLodBias = 1.0;
10999 sampler_ci.anisotropyEnable = VK_FALSE;
11000 sampler_ci.maxAnisotropy = 1;
11001 sampler_ci.compareEnable = VK_FALSE;
11002 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11003 sampler_ci.minLod = 1.0;
11004 sampler_ci.maxLod = 1.0;
11005 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11006 sampler_ci.unnormalizedCoordinates = VK_FALSE;
11007 VkSampler sampler;
11008 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11009 ASSERT_VK_SUCCESS(err);
11010
11011 VkDescriptorImageInfo info = {};
11012 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011013
11014 VkWriteDescriptorSet descriptor_write;
11015 memset(&descriptor_write, 0, sizeof(descriptor_write));
11016 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011017 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011018 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011019 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011020 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011021 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011022
11023 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11024
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011025 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011026
Chia-I Wuf7458c52015-10-26 21:10:41 +080011027 vkDestroySampler(m_device->device(), sampler, NULL);
11028 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11029 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011030}
11031
Karl Schultz6addd812016-02-02 17:17:23 -070011032TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011033 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070011034 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011035
Karl Schultz6addd812016-02-02 17:17:23 -070011036 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011037 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11038 " binding #0 with 1 total descriptors but update of 1 descriptors "
11039 "starting at binding offset of 0 combined with update array element "
11040 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011041
Tobin Ehlis3b780662015-05-28 12:11:26 -060011042 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011043 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011044 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011045 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11046 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011047
11048 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011049 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11050 ds_pool_ci.pNext = NULL;
11051 ds_pool_ci.maxSets = 1;
11052 ds_pool_ci.poolSizeCount = 1;
11053 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011054
Tobin Ehlis3b780662015-05-28 12:11:26 -060011055 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011056 err =
11057 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011058 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011059
Tony Barboureb254902015-07-15 12:50:33 -060011060 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011061 dsl_binding.binding = 0;
11062 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11063 dsl_binding.descriptorCount = 1;
11064 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11065 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060011066
11067 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011068 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11069 ds_layout_ci.pNext = NULL;
11070 ds_layout_ci.bindingCount = 1;
11071 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011072
Tobin Ehlis3b780662015-05-28 12:11:26 -060011073 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011074 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11075 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011076 ASSERT_VK_SUCCESS(err);
11077
11078 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011079 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011080 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011081 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011082 alloc_info.descriptorPool = ds_pool;
11083 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011084 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11085 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011086 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011087
Tobin Ehlis30db8f82016-05-05 08:19:48 -060011088 // Correctly update descriptor to avoid "NOT_UPDATED" error
11089 VkDescriptorBufferInfo buff_info = {};
11090 buff_info.buffer =
11091 VkBuffer(0); // Don't care about buffer handle for this test
11092 buff_info.offset = 0;
11093 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011094
11095 VkWriteDescriptorSet descriptor_write;
11096 memset(&descriptor_write, 0, sizeof(descriptor_write));
11097 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011098 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011099 descriptor_write.dstArrayElement =
11100 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080011101 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011102 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11103 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011104
11105 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11106
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011107 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011108
Chia-I Wuf7458c52015-10-26 21:10:41 +080011109 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11110 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011111}
11112
Karl Schultz6addd812016-02-02 17:17:23 -070011113TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
11114 // Create layout w/ count of 1 and attempt update to that layout w/ binding
11115 // index 2
11116 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011117
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11119 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011120
Tobin Ehlis3b780662015-05-28 12:11:26 -060011121 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011122 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011123 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011124 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11125 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011126
11127 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011128 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11129 ds_pool_ci.pNext = NULL;
11130 ds_pool_ci.maxSets = 1;
11131 ds_pool_ci.poolSizeCount = 1;
11132 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011133
Tobin Ehlis3b780662015-05-28 12:11:26 -060011134 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011135 err =
11136 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011137 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011138
Tony Barboureb254902015-07-15 12:50:33 -060011139 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011140 dsl_binding.binding = 0;
11141 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11142 dsl_binding.descriptorCount = 1;
11143 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11144 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060011145
11146 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011147 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11148 ds_layout_ci.pNext = NULL;
11149 ds_layout_ci.bindingCount = 1;
11150 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011151 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011152 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11153 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011154 ASSERT_VK_SUCCESS(err);
11155
11156 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011157 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011158 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011159 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011160 alloc_info.descriptorPool = ds_pool;
11161 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011162 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11163 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011164 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011165
Tony Barboureb254902015-07-15 12:50:33 -060011166 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011167 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11168 sampler_ci.pNext = NULL;
11169 sampler_ci.magFilter = VK_FILTER_NEAREST;
11170 sampler_ci.minFilter = VK_FILTER_NEAREST;
11171 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11172 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11173 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11174 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11175 sampler_ci.mipLodBias = 1.0;
11176 sampler_ci.anisotropyEnable = VK_FALSE;
11177 sampler_ci.maxAnisotropy = 1;
11178 sampler_ci.compareEnable = VK_FALSE;
11179 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11180 sampler_ci.minLod = 1.0;
11181 sampler_ci.maxLod = 1.0;
11182 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11183 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060011184
Tobin Ehlis3b780662015-05-28 12:11:26 -060011185 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011186 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011187 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011188
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011189 VkDescriptorImageInfo info = {};
11190 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011191
11192 VkWriteDescriptorSet descriptor_write;
11193 memset(&descriptor_write, 0, sizeof(descriptor_write));
11194 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011195 descriptor_write.dstSet = descriptorSet;
11196 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011197 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011198 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011199 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011200 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011201
11202 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11203
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011204 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011205
Chia-I Wuf7458c52015-10-26 21:10:41 +080011206 vkDestroySampler(m_device->device(), sampler, NULL);
11207 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11208 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011209}
11210
Karl Schultz6addd812016-02-02 17:17:23 -070011211TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
11212 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
11213 // types
11214 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011215
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis660bcdc2016-05-17 10:39:46 -060011217 ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011218
Tobin Ehlis3b780662015-05-28 12:11:26 -060011219 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011220
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011221 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011222 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11223 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011224
11225 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011226 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11227 ds_pool_ci.pNext = NULL;
11228 ds_pool_ci.maxSets = 1;
11229 ds_pool_ci.poolSizeCount = 1;
11230 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011231
Tobin Ehlis3b780662015-05-28 12:11:26 -060011232 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011233 err =
11234 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011235 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060011236 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011237 dsl_binding.binding = 0;
11238 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11239 dsl_binding.descriptorCount = 1;
11240 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11241 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011242
Tony Barboureb254902015-07-15 12:50:33 -060011243 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011244 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11245 ds_layout_ci.pNext = NULL;
11246 ds_layout_ci.bindingCount = 1;
11247 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011248
Tobin Ehlis3b780662015-05-28 12:11:26 -060011249 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011250 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11251 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011252 ASSERT_VK_SUCCESS(err);
11253
11254 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011255 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011256 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011257 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011258 alloc_info.descriptorPool = ds_pool;
11259 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011260 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11261 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011262 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011263
Tony Barboureb254902015-07-15 12:50:33 -060011264 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011265 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11266 sampler_ci.pNext = NULL;
11267 sampler_ci.magFilter = VK_FILTER_NEAREST;
11268 sampler_ci.minFilter = VK_FILTER_NEAREST;
11269 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11270 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11271 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11272 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11273 sampler_ci.mipLodBias = 1.0;
11274 sampler_ci.anisotropyEnable = VK_FALSE;
11275 sampler_ci.maxAnisotropy = 1;
11276 sampler_ci.compareEnable = VK_FALSE;
11277 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11278 sampler_ci.minLod = 1.0;
11279 sampler_ci.maxLod = 1.0;
11280 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11281 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011282 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011283 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011284 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011285
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011286 VkDescriptorImageInfo info = {};
11287 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011288
11289 VkWriteDescriptorSet descriptor_write;
11290 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -070011291 descriptor_write.sType =
11292 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011293 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011294 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011295 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011296 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011297 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011298
11299 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11300
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011301 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011302
Chia-I Wuf7458c52015-10-26 21:10:41 +080011303 vkDestroySampler(m_device->device(), sampler, NULL);
11304 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11305 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011306}
11307
Karl Schultz6addd812016-02-02 17:17:23 -070011308TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011309 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070011310 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011311
Karl Schultz6addd812016-02-02 17:17:23 -070011312 m_errorMonitor->SetDesiredFailureMsg(
11313 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011314 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011315
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011316 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011317 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
11318 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011319 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011320 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11321 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011322
11323 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011324 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11325 ds_pool_ci.pNext = NULL;
11326 ds_pool_ci.maxSets = 1;
11327 ds_pool_ci.poolSizeCount = 1;
11328 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011329
11330 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011331 err =
11332 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011333 ASSERT_VK_SUCCESS(err);
11334
11335 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011336 dsl_binding.binding = 0;
11337 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11338 dsl_binding.descriptorCount = 1;
11339 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11340 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011341
11342 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011343 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11344 ds_layout_ci.pNext = NULL;
11345 ds_layout_ci.bindingCount = 1;
11346 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011347 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011348 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11349 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011350 ASSERT_VK_SUCCESS(err);
11351
11352 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011353 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011354 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011355 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011356 alloc_info.descriptorPool = ds_pool;
11357 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011358 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11359 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011360 ASSERT_VK_SUCCESS(err);
11361
Karl Schultz6addd812016-02-02 17:17:23 -070011362 VkSampler sampler =
11363 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011364
11365 VkDescriptorImageInfo descriptor_info;
11366 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11367 descriptor_info.sampler = sampler;
11368
11369 VkWriteDescriptorSet descriptor_write;
11370 memset(&descriptor_write, 0, sizeof(descriptor_write));
11371 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011372 descriptor_write.dstSet = descriptorSet;
11373 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011374 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011375 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11376 descriptor_write.pImageInfo = &descriptor_info;
11377
11378 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11379
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011380 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011381
Chia-I Wuf7458c52015-10-26 21:10:41 +080011382 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11383 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011384}
11385
Karl Schultz6addd812016-02-02 17:17:23 -070011386TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
11387 // Create a single combined Image/Sampler descriptor and send it an invalid
11388 // imageView
11389 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011390
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011391 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11392 "Attempted write update to combined "
11393 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -060011394 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011395
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011396 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011397 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011398 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11399 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011400
11401 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011402 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11403 ds_pool_ci.pNext = NULL;
11404 ds_pool_ci.maxSets = 1;
11405 ds_pool_ci.poolSizeCount = 1;
11406 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011407
11408 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011409 err =
11410 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011411 ASSERT_VK_SUCCESS(err);
11412
11413 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011414 dsl_binding.binding = 0;
11415 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11416 dsl_binding.descriptorCount = 1;
11417 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11418 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011419
11420 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011421 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11422 ds_layout_ci.pNext = NULL;
11423 ds_layout_ci.bindingCount = 1;
11424 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011425 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011426 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11427 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011428 ASSERT_VK_SUCCESS(err);
11429
11430 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011431 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011432 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011433 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011434 alloc_info.descriptorPool = ds_pool;
11435 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011436 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11437 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011438 ASSERT_VK_SUCCESS(err);
11439
11440 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011441 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11442 sampler_ci.pNext = NULL;
11443 sampler_ci.magFilter = VK_FILTER_NEAREST;
11444 sampler_ci.minFilter = VK_FILTER_NEAREST;
11445 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11446 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11447 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11448 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11449 sampler_ci.mipLodBias = 1.0;
11450 sampler_ci.anisotropyEnable = VK_FALSE;
11451 sampler_ci.maxAnisotropy = 1;
11452 sampler_ci.compareEnable = VK_FALSE;
11453 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11454 sampler_ci.minLod = 1.0;
11455 sampler_ci.maxLod = 1.0;
11456 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11457 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011458
11459 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011460 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011461 ASSERT_VK_SUCCESS(err);
11462
Karl Schultz6addd812016-02-02 17:17:23 -070011463 VkImageView view =
11464 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011465
11466 VkDescriptorImageInfo descriptor_info;
11467 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11468 descriptor_info.sampler = sampler;
11469 descriptor_info.imageView = view;
11470
11471 VkWriteDescriptorSet descriptor_write;
11472 memset(&descriptor_write, 0, sizeof(descriptor_write));
11473 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011474 descriptor_write.dstSet = descriptorSet;
11475 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011476 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011477 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11478 descriptor_write.pImageInfo = &descriptor_info;
11479
11480 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11481
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011482 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011483
Chia-I Wuf7458c52015-10-26 21:10:41 +080011484 vkDestroySampler(m_device->device(), sampler, NULL);
11485 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11486 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011487}
11488
Karl Schultz6addd812016-02-02 17:17:23 -070011489TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
11490 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
11491 // into the other
11492 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011493
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11495 " binding #1 with type "
11496 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
11497 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011498
Tobin Ehlis04356f92015-10-27 16:35:27 -060011499 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011500 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011501 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011502 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11503 ds_type_count[0].descriptorCount = 1;
11504 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
11505 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011506
11507 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011508 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11509 ds_pool_ci.pNext = NULL;
11510 ds_pool_ci.maxSets = 1;
11511 ds_pool_ci.poolSizeCount = 2;
11512 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011513
11514 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011515 err =
11516 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011517 ASSERT_VK_SUCCESS(err);
11518 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011519 dsl_binding[0].binding = 0;
11520 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11521 dsl_binding[0].descriptorCount = 1;
11522 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
11523 dsl_binding[0].pImmutableSamplers = NULL;
11524 dsl_binding[1].binding = 1;
11525 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11526 dsl_binding[1].descriptorCount = 1;
11527 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
11528 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011529
11530 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011531 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11532 ds_layout_ci.pNext = NULL;
11533 ds_layout_ci.bindingCount = 2;
11534 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011535
11536 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011537 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11538 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011539 ASSERT_VK_SUCCESS(err);
11540
11541 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011542 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011543 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011544 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011545 alloc_info.descriptorPool = ds_pool;
11546 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011547 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11548 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011549 ASSERT_VK_SUCCESS(err);
11550
11551 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011552 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11553 sampler_ci.pNext = NULL;
11554 sampler_ci.magFilter = VK_FILTER_NEAREST;
11555 sampler_ci.minFilter = VK_FILTER_NEAREST;
11556 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11557 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11558 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11559 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11560 sampler_ci.mipLodBias = 1.0;
11561 sampler_ci.anisotropyEnable = VK_FALSE;
11562 sampler_ci.maxAnisotropy = 1;
11563 sampler_ci.compareEnable = VK_FALSE;
11564 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11565 sampler_ci.minLod = 1.0;
11566 sampler_ci.maxLod = 1.0;
11567 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11568 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011569
11570 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011571 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011572 ASSERT_VK_SUCCESS(err);
11573
11574 VkDescriptorImageInfo info = {};
11575 info.sampler = sampler;
11576
11577 VkWriteDescriptorSet descriptor_write;
11578 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11579 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011580 descriptor_write.dstSet = descriptorSet;
11581 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011582 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011583 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11584 descriptor_write.pImageInfo = &info;
11585 // This write update should succeed
11586 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11587 // Now perform a copy update that fails due to type mismatch
11588 VkCopyDescriptorSet copy_ds_update;
11589 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11590 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11591 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -060011592 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011593 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011594 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +080011595 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011596 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11597
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011598 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011599 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070011600 m_errorMonitor->SetDesiredFailureMsg(
11601 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011602 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060011603 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11604 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11605 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011606 copy_ds_update.srcBinding =
11607 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011608 copy_ds_update.dstSet = descriptorSet;
11609 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -060011610 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011611 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11612
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011613 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011614
Tobin Ehlis04356f92015-10-27 16:35:27 -060011615 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070011616 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011617 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
11618 "update array offset of 0 and update of "
11619 "5 descriptors oversteps total number "
11620 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011621
Tobin Ehlis04356f92015-10-27 16:35:27 -060011622 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11623 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11624 copy_ds_update.srcSet = descriptorSet;
11625 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011626 copy_ds_update.dstSet = descriptorSet;
11627 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011628 copy_ds_update.descriptorCount =
11629 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011630 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11631
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011632 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011633
Chia-I Wuf7458c52015-10-26 21:10:41 +080011634 vkDestroySampler(m_device->device(), sampler, NULL);
11635 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11636 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011637}
11638
Karl Schultz6addd812016-02-02 17:17:23 -070011639TEST_F(VkLayerTest, NumSamplesMismatch) {
11640 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11641 // sampleCount
11642 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011643
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011644 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011645 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011646
Tobin Ehlis3b780662015-05-28 12:11:26 -060011647 ASSERT_NO_FATAL_FAILURE(InitState());
11648 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011649 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011650 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011651 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011652
11653 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011654 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11655 ds_pool_ci.pNext = NULL;
11656 ds_pool_ci.maxSets = 1;
11657 ds_pool_ci.poolSizeCount = 1;
11658 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011659
Tobin Ehlis3b780662015-05-28 12:11:26 -060011660 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011661 err =
11662 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011663 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011664
Tony Barboureb254902015-07-15 12:50:33 -060011665 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011666 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011667 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011668 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011669 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11670 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011671
Tony Barboureb254902015-07-15 12:50:33 -060011672 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11673 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11674 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011675 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011676 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011677
Tobin Ehlis3b780662015-05-28 12:11:26 -060011678 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011679 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11680 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011681 ASSERT_VK_SUCCESS(err);
11682
11683 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011684 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011685 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011686 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011687 alloc_info.descriptorPool = ds_pool;
11688 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011689 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11690 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011691 ASSERT_VK_SUCCESS(err);
11692
Tony Barboureb254902015-07-15 12:50:33 -060011693 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011694 pipe_ms_state_ci.sType =
11695 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11696 pipe_ms_state_ci.pNext = NULL;
11697 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11698 pipe_ms_state_ci.sampleShadingEnable = 0;
11699 pipe_ms_state_ci.minSampleShading = 1.0;
11700 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011701
Tony Barboureb254902015-07-15 12:50:33 -060011702 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011703 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11704 pipeline_layout_ci.pNext = NULL;
11705 pipeline_layout_ci.setLayoutCount = 1;
11706 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011707
11708 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011709 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11710 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011711 ASSERT_VK_SUCCESS(err);
11712
Karl Schultz6addd812016-02-02 17:17:23 -070011713 VkShaderObj vs(m_device, bindStateVertShaderText,
11714 VK_SHADER_STAGE_VERTEX_BIT, this);
11715 VkShaderObj fs(m_device, bindStateFragShaderText,
11716 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011717 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011718 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011719 VkPipelineObj pipe(m_device);
11720 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011721 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011722 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011723 pipe.SetMSAA(&pipe_ms_state_ci);
11724 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011725
Tony Barbourfe3351b2015-07-28 10:17:20 -060011726 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011727 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11728 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011729
Mark Young29927482016-05-04 14:38:51 -060011730 // Render triangle (the error should trigger on the attempt to draw).
11731 Draw(3, 1, 0, 0);
11732
11733 // Finalize recording of the command buffer
11734 EndCommandBuffer();
11735
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011736 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011737
Chia-I Wuf7458c52015-10-26 21:10:41 +080011738 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11739 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11740 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011741}
Mark Young29927482016-05-04 14:38:51 -060011742
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011743TEST_F(VkLayerTest, RenderPassIncompatible) {
11744 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
11745 "Initial case is drawing with an active renderpass that's "
11746 "not compatible with the bound PSO's creation renderpass");
11747 VkResult err;
11748
11749 ASSERT_NO_FATAL_FAILURE(InitState());
11750 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11751
11752 VkDescriptorSetLayoutBinding dsl_binding = {};
11753 dsl_binding.binding = 0;
11754 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11755 dsl_binding.descriptorCount = 1;
11756 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11757 dsl_binding.pImmutableSamplers = NULL;
11758
11759 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11760 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11761 ds_layout_ci.pNext = NULL;
11762 ds_layout_ci.bindingCount = 1;
11763 ds_layout_ci.pBindings = &dsl_binding;
11764
11765 VkDescriptorSetLayout ds_layout;
11766 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11767 &ds_layout);
11768 ASSERT_VK_SUCCESS(err);
11769
11770 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11771 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11772 pipeline_layout_ci.pNext = NULL;
11773 pipeline_layout_ci.setLayoutCount = 1;
11774 pipeline_layout_ci.pSetLayouts = &ds_layout;
11775
11776 VkPipelineLayout pipeline_layout;
11777 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11778 &pipeline_layout);
11779 ASSERT_VK_SUCCESS(err);
11780
11781 VkShaderObj vs(m_device, bindStateVertShaderText,
11782 VK_SHADER_STAGE_VERTEX_BIT, this);
11783 VkShaderObj fs(m_device, bindStateFragShaderText,
11784 VK_SHADER_STAGE_FRAGMENT_BIT,
11785 this); // We shouldn't need a fragment shader
11786 // but add it to be able to run on more devices
11787 // Create a renderpass that will be incompatible with default renderpass
11788 VkAttachmentReference attach = {};
11789 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11790 VkAttachmentReference color_att = {};
11791 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11792 VkSubpassDescription subpass = {};
11793 subpass.inputAttachmentCount = 1;
11794 subpass.pInputAttachments = &attach;
11795 subpass.colorAttachmentCount = 1;
11796 subpass.pColorAttachments = &color_att;
11797 VkRenderPassCreateInfo rpci = {};
11798 rpci.subpassCount = 1;
11799 rpci.pSubpasses = &subpass;
11800 rpci.attachmentCount = 1;
11801 VkAttachmentDescription attach_desc = {};
11802 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011803 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11804 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011805 rpci.pAttachments = &attach_desc;
11806 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11807 VkRenderPass rp;
11808 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11809 VkPipelineObj pipe(m_device);
11810 pipe.AddShader(&vs);
11811 pipe.AddShader(&fs);
11812 pipe.AddColorAttachment();
11813 VkViewport view_port = {};
11814 m_viewports.push_back(view_port);
11815 pipe.SetViewport(m_viewports);
11816 VkRect2D rect = {};
11817 m_scissors.push_back(rect);
11818 pipe.SetScissor(m_scissors);
11819 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11820
11821 VkCommandBufferInheritanceInfo cbii = {};
11822 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11823 cbii.renderPass = rp;
11824 cbii.subpass = 0;
11825 VkCommandBufferBeginInfo cbbi = {};
11826 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11827 cbbi.pInheritanceInfo = &cbii;
11828 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11829 VkRenderPassBeginInfo rpbi = {};
11830 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11831 rpbi.framebuffer = m_framebuffer;
11832 rpbi.renderPass = rp;
11833 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi,
11834 VK_SUBPASS_CONTENTS_INLINE);
11835 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11836 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11837
11838 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11839 " is incompatible w/ gfx pipeline ");
11840 // Render triangle (the error should trigger on the attempt to draw).
11841 Draw(3, 1, 0, 0);
11842
11843 // Finalize recording of the command buffer
11844 EndCommandBuffer();
11845
11846 m_errorMonitor->VerifyFound();
11847
11848 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11849 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11850 vkDestroyRenderPass(m_device->device(), rp, NULL);
11851}
11852
Mark Youngc89c6312016-03-31 16:03:20 -060011853TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11854 // Create Pipeline where the number of blend attachments doesn't match the
11855 // number of color attachments. In this case, we don't add any color
11856 // blend attachments even though we have a color attachment.
11857 VkResult err;
11858
11859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -060011860 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060011861
11862 ASSERT_NO_FATAL_FAILURE(InitState());
11863 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11864 VkDescriptorPoolSize ds_type_count = {};
11865 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11866 ds_type_count.descriptorCount = 1;
11867
11868 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11869 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11870 ds_pool_ci.pNext = NULL;
11871 ds_pool_ci.maxSets = 1;
11872 ds_pool_ci.poolSizeCount = 1;
11873 ds_pool_ci.pPoolSizes = &ds_type_count;
11874
11875 VkDescriptorPool ds_pool;
11876 err =
11877 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11878 ASSERT_VK_SUCCESS(err);
11879
11880 VkDescriptorSetLayoutBinding dsl_binding = {};
11881 dsl_binding.binding = 0;
11882 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11883 dsl_binding.descriptorCount = 1;
11884 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11885 dsl_binding.pImmutableSamplers = NULL;
11886
11887 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11888 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11889 ds_layout_ci.pNext = NULL;
11890 ds_layout_ci.bindingCount = 1;
11891 ds_layout_ci.pBindings = &dsl_binding;
11892
11893 VkDescriptorSetLayout ds_layout;
11894 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11895 &ds_layout);
11896 ASSERT_VK_SUCCESS(err);
11897
11898 VkDescriptorSet descriptorSet;
11899 VkDescriptorSetAllocateInfo alloc_info = {};
11900 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11901 alloc_info.descriptorSetCount = 1;
11902 alloc_info.descriptorPool = ds_pool;
11903 alloc_info.pSetLayouts = &ds_layout;
11904 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11905 &descriptorSet);
11906 ASSERT_VK_SUCCESS(err);
11907
11908 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11909 pipe_ms_state_ci.sType =
11910 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11911 pipe_ms_state_ci.pNext = NULL;
11912 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11913 pipe_ms_state_ci.sampleShadingEnable = 0;
11914 pipe_ms_state_ci.minSampleShading = 1.0;
11915 pipe_ms_state_ci.pSampleMask = NULL;
11916
11917 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11918 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11919 pipeline_layout_ci.pNext = NULL;
11920 pipeline_layout_ci.setLayoutCount = 1;
11921 pipeline_layout_ci.pSetLayouts = &ds_layout;
11922
11923 VkPipelineLayout pipeline_layout;
11924 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11925 &pipeline_layout);
11926 ASSERT_VK_SUCCESS(err);
11927
11928 VkShaderObj vs(m_device, bindStateVertShaderText,
11929 VK_SHADER_STAGE_VERTEX_BIT, this);
11930 VkShaderObj fs(m_device, bindStateFragShaderText,
11931 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011932 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -060011933 // but add it to be able to run on more devices
11934 VkPipelineObj pipe(m_device);
11935 pipe.AddShader(&vs);
11936 pipe.AddShader(&fs);
11937 pipe.SetMSAA(&pipe_ms_state_ci);
11938 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11939
11940 BeginCommandBuffer();
11941 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11942 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11943
Mark Young29927482016-05-04 14:38:51 -060011944 // Render triangle (the error should trigger on the attempt to draw).
11945 Draw(3, 1, 0, 0);
11946
11947 // Finalize recording of the command buffer
11948 EndCommandBuffer();
11949
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011950 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011951
11952 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11953 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11954 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11955}
Mark Young29927482016-05-04 14:38:51 -060011956
Mark Muellerd4914412016-06-13 17:52:06 -060011957TEST_F(VkLayerTest, MissingClearAttachment) {
11958 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
11959 "structure passed to vkCmdClearAttachments");
11960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11961 "vkCmdClearAttachments() attachment index 1 not found in attachment "
11962 "reference array of active subpass 0");
11963
11964 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11965 m_errorMonitor->VerifyFound();
11966}
11967
Karl Schultz6addd812016-02-02 17:17:23 -070011968TEST_F(VkLayerTest, ClearCmdNoDraw) {
11969 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
11970 // to issuing a Draw
11971 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011972
Karl Schultz6addd812016-02-02 17:17:23 -070011973 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -070011974 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011975 "vkCmdClearAttachments() issued on CB object ");
11976
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011977 ASSERT_NO_FATAL_FAILURE(InitState());
11978 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011979
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011980 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011981 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11982 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011983
11984 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011985 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11986 ds_pool_ci.pNext = NULL;
11987 ds_pool_ci.maxSets = 1;
11988 ds_pool_ci.poolSizeCount = 1;
11989 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011990
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011991 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011992 err =
11993 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011994 ASSERT_VK_SUCCESS(err);
11995
Tony Barboureb254902015-07-15 12:50:33 -060011996 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011997 dsl_binding.binding = 0;
11998 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11999 dsl_binding.descriptorCount = 1;
12000 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12001 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012002
Tony Barboureb254902015-07-15 12:50:33 -060012003 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012004 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12005 ds_layout_ci.pNext = NULL;
12006 ds_layout_ci.bindingCount = 1;
12007 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012008
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012009 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012010 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
12011 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012012 ASSERT_VK_SUCCESS(err);
12013
12014 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012015 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012016 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012017 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012018 alloc_info.descriptorPool = ds_pool;
12019 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012020 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
12021 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012022 ASSERT_VK_SUCCESS(err);
12023
Tony Barboureb254902015-07-15 12:50:33 -060012024 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012025 pipe_ms_state_ci.sType =
12026 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12027 pipe_ms_state_ci.pNext = NULL;
12028 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
12029 pipe_ms_state_ci.sampleShadingEnable = 0;
12030 pipe_ms_state_ci.minSampleShading = 1.0;
12031 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012032
Tony Barboureb254902015-07-15 12:50:33 -060012033 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012034 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12035 pipeline_layout_ci.pNext = NULL;
12036 pipeline_layout_ci.setLayoutCount = 1;
12037 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012038
12039 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012040 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
12041 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012042 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012043
Karl Schultz6addd812016-02-02 17:17:23 -070012044 VkShaderObj vs(m_device, bindStateVertShaderText,
12045 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060012046 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070012047 // on more devices
12048 VkShaderObj fs(m_device, bindStateFragShaderText,
12049 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012050
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012051 VkPipelineObj pipe(m_device);
12052 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012053 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012054 pipe.SetMSAA(&pipe_ms_state_ci);
12055 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012056
12057 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012058
Karl Schultz6addd812016-02-02 17:17:23 -070012059 // Main thing we care about for this test is that the VkImage obj we're
12060 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012061 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060012062 VkClearAttachment color_attachment;
12063 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12064 color_attachment.clearValue.color.float32[0] = 1.0;
12065 color_attachment.clearValue.color.float32[1] = 1.0;
12066 color_attachment.clearValue.color.float32[2] = 1.0;
12067 color_attachment.clearValue.color.float32[3] = 1.0;
12068 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070012069 VkClearRect clear_rect = {
12070 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012071
Karl Schultz6addd812016-02-02 17:17:23 -070012072 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
12073 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012074
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012075 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012076
Chia-I Wuf7458c52015-10-26 21:10:41 +080012077 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12078 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12079 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012080}
12081
Karl Schultz6addd812016-02-02 17:17:23 -070012082TEST_F(VkLayerTest, VtxBufferBadIndex) {
12083 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012084
Karl Schultz6addd812016-02-02 17:17:23 -070012085 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012086 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -070012087 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012088
Tobin Ehlis502480b2015-06-24 15:53:07 -060012089 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060012090 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060012091 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060012092
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012093 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012094 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12095 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012096
12097 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012098 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12099 ds_pool_ci.pNext = NULL;
12100 ds_pool_ci.maxSets = 1;
12101 ds_pool_ci.poolSizeCount = 1;
12102 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060012103
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060012104 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070012105 err =
12106 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012107 ASSERT_VK_SUCCESS(err);
12108
Tony Barboureb254902015-07-15 12:50:33 -060012109 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012110 dsl_binding.binding = 0;
12111 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12112 dsl_binding.descriptorCount = 1;
12113 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12114 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012115
Tony Barboureb254902015-07-15 12:50:33 -060012116 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012117 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12118 ds_layout_ci.pNext = NULL;
12119 ds_layout_ci.bindingCount = 1;
12120 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060012121
Tobin Ehlis502480b2015-06-24 15:53:07 -060012122 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012123 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
12124 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012125 ASSERT_VK_SUCCESS(err);
12126
12127 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012128 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012129 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012130 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012131 alloc_info.descriptorPool = ds_pool;
12132 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012133 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
12134 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012135 ASSERT_VK_SUCCESS(err);
12136
Tony Barboureb254902015-07-15 12:50:33 -060012137 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012138 pipe_ms_state_ci.sType =
12139 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12140 pipe_ms_state_ci.pNext = NULL;
12141 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12142 pipe_ms_state_ci.sampleShadingEnable = 0;
12143 pipe_ms_state_ci.minSampleShading = 1.0;
12144 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012145
Tony Barboureb254902015-07-15 12:50:33 -060012146 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012147 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12148 pipeline_layout_ci.pNext = NULL;
12149 pipeline_layout_ci.setLayoutCount = 1;
12150 pipeline_layout_ci.pSetLayouts = &ds_layout;
12151 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012152
Karl Schultz6addd812016-02-02 17:17:23 -070012153 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
12154 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012155 ASSERT_VK_SUCCESS(err);
12156
Karl Schultz6addd812016-02-02 17:17:23 -070012157 VkShaderObj vs(m_device, bindStateVertShaderText,
12158 VK_SHADER_STAGE_VERTEX_BIT, this);
12159 VkShaderObj fs(m_device, bindStateFragShaderText,
12160 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060012161 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070012162 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012163 VkPipelineObj pipe(m_device);
12164 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012165 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060012166 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012167 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060012168 pipe.SetViewport(m_viewports);
12169 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012170 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012171
12172 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070012173 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
12174 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060012175 // Don't care about actual data, just need to get to draw to flag error
12176 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -070012177 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
12178 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060012179 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060012180 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012181
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012182 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012183
Chia-I Wuf7458c52015-10-26 21:10:41 +080012184 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12185 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12186 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012187}
Mark Muellerdfe37552016-07-07 14:47:42 -060012188
Mark Mueller2ee294f2016-08-04 12:59:48 -060012189TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
12190 TEST_DESCRIPTION("Use an invalid count in a vkEnumeratePhysicalDevices call."
12191 "Use invalid Queue Family Index in vkCreateDevice");
12192
12193 const char *mismatch_count_message =
12194 "Call to vkEnumeratePhysicalDevices() "
12195 "w/ pPhysicalDeviceCount value ";
12196
12197 const char *invalid_queueFamilyIndex_message =
12198 "Invalid queue create request in vkCreateDevice(). Invalid "
12199 "queueFamilyIndex ";
12200
12201 const char *unavailable_feature_message =
12202 "While calling vkCreateDevice(), requesting feature #";
12203
12204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
12205 mismatch_count_message);
Mark Mueller880fce52016-08-17 15:23:23 -060012206 // The following test fails with recent NVidia drivers.
12207 // By the time core_validation is reached, the NVidia
12208 // driver has sanitized the invalid condition and core_validation
12209 // is not introduced to the failure condition. This is not the case
12210 // with AMD and Mesa drivers. Futher investigation is required
12211// uint32_t count = static_cast<uint32_t>(~0);
12212// VkPhysicalDevice physical_device;
12213// vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
12214// m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060012215
12216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12217 invalid_queueFamilyIndex_message);
12218 float queue_priority = 0.0;
12219
12220 VkDeviceQueueCreateInfo queue_create_info = {};
12221 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
12222 queue_create_info.queueCount = 1;
12223 queue_create_info.pQueuePriorities = &queue_priority;
12224 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
12225
12226 VkPhysicalDeviceFeatures features = m_device->phy().features();
12227 VkDevice testDevice;
12228 VkDeviceCreateInfo device_create_info = {};
12229 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
12230 device_create_info.queueCreateInfoCount = 1;
12231 device_create_info.pQueueCreateInfos = &queue_create_info;
12232 device_create_info.pEnabledFeatures = &features;
12233 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12234 m_errorMonitor->VerifyFound();
12235
12236 queue_create_info.queueFamilyIndex = 1;
12237
12238 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
12239 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
12240 for (unsigned i = 0; i < feature_count; i++) {
12241 if (VK_FALSE == feature_array[i]) {
12242 feature_array[i] = VK_TRUE;
12243 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12244 unavailable_feature_message);
12245 device_create_info.pEnabledFeatures = &features;
12246 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12247 m_errorMonitor->VerifyFound();
12248 break;
12249 }
12250 }
12251}
12252
12253TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
12254 TEST_DESCRIPTION("Use an invalid queue index in a vkCmdWaitEvents call."
12255 "End a command buffer with a query still in progress.");
12256
12257 const char *invalid_queue_index =
12258 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
12259 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
12260 "must be.";
12261
12262 const char *invalid_query =
12263 "Ending command buffer with in progress query: queryPool 0x";
12264
12265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12266 invalid_queue_index);
12267
12268 ASSERT_NO_FATAL_FAILURE(InitState());
12269
12270 VkEvent event;
12271 VkEventCreateInfo event_create_info{};
12272 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12273 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12274
12275
12276 VkQueue queue = VK_NULL_HANDLE;
12277 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
12278 0, &queue);
12279
12280 BeginCommandBuffer();
12281
12282 VkImageObj image(m_device);
12283 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
12284 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12285 ASSERT_TRUE(image.initialized());
12286 VkImageMemoryBarrier img_barrier = {};
12287 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12288 img_barrier.pNext = NULL;
12289 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
12290 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
12291 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12292 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12293 img_barrier.image = image.handle();
12294 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060012295
12296 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
12297 // that layer validation catches the case when it is not.
12298 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012299 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12300 img_barrier.subresourceRange.baseArrayLayer = 0;
12301 img_barrier.subresourceRange.baseMipLevel = 0;
12302 img_barrier.subresourceRange.layerCount = 1;
12303 img_barrier.subresourceRange.levelCount = 1;
12304 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event,
12305 VK_PIPELINE_STAGE_HOST_BIT,
12306 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
12307 nullptr, 1, &img_barrier);
12308 m_errorMonitor->VerifyFound();
12309
12310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12311 invalid_query);
12312
12313 VkQueryPool query_pool;
12314 VkQueryPoolCreateInfo query_pool_create_info = {};
12315 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12316 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
12317 query_pool_create_info.queryCount = 1;
12318 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
12319 &query_pool);
12320
12321 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/,
12322 1 /*queryCount*/);
12323 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
12324
12325 vkEndCommandBuffer(m_commandBuffer->handle());
12326 m_errorMonitor->VerifyFound();
12327
12328 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
12329 vkDestroyEvent(m_device->device(), event, nullptr);
12330}
12331
Mark Muellerdfe37552016-07-07 14:47:42 -060012332TEST_F(VkLayerTest, VertexBufferInvalid) {
12333 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
12334 "delete a buffer twice, use an invalid offset for each "
12335 "buffer type, and attempt to bind a null buffer");
12336
12337 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
12338 "using deleted buffer ";
12339 const char *double_destroy_message = "Cannot free buffer 0x";
12340 const char *invalid_offset_message = "vkBindBufferMemory(): "
12341 "memoryOffset is 0x";
12342 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
12343 "storage memoryOffset "
12344 "is 0x";
12345 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
12346 "texel memoryOffset "
12347 "is 0x";
12348 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
12349 "uniform memoryOffset "
12350 "is 0x";
12351 const char *bind_null_buffer_message = "In vkBindBufferMemory, attempting"
12352 " to Bind Obj(0x";
12353 const char *free_invalid_buffer_message = "Request to delete memory "
12354 "object 0x";
12355
12356 ASSERT_NO_FATAL_FAILURE(InitState());
12357 ASSERT_NO_FATAL_FAILURE(InitViewport());
12358 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12359
12360 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
12361 pipe_ms_state_ci.sType =
12362 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12363 pipe_ms_state_ci.pNext = NULL;
12364 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12365 pipe_ms_state_ci.sampleShadingEnable = 0;
12366 pipe_ms_state_ci.minSampleShading = 1.0;
12367 pipe_ms_state_ci.pSampleMask = nullptr;
12368
12369 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12370 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12371 VkPipelineLayout pipeline_layout;
12372
12373 VkResult err = vkCreatePipelineLayout(m_device->device(),
12374 &pipeline_layout_ci, nullptr,
12375 &pipeline_layout);
12376 ASSERT_VK_SUCCESS(err);
12377
12378 VkShaderObj vs(m_device, bindStateVertShaderText,
12379 VK_SHADER_STAGE_VERTEX_BIT, this);
12380 VkShaderObj fs(m_device, bindStateFragShaderText,
12381 VK_SHADER_STAGE_FRAGMENT_BIT,
12382 this);
12383 VkPipelineObj pipe(m_device);
12384 pipe.AddShader(&vs);
12385 pipe.AddShader(&fs);
12386 pipe.AddColorAttachment();
12387 pipe.SetMSAA(&pipe_ms_state_ci);
12388 pipe.SetViewport(m_viewports);
12389 pipe.SetScissor(m_scissors);
12390 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12391
12392 BeginCommandBuffer();
12393 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
12394 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12395
12396 {
12397 // Create and bind a vertex buffer in a reduced scope, which will cause
12398 // it to be deleted upon leaving this scope
12399 const float vbo_data[3] = {1.f, 0.f, 1.f};
12400 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data),
12401 3, vbo_data);
12402 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
12403 draw_verticies.AddVertexInputToPipe(pipe);
12404 }
12405
12406 Draw(1, 0, 0, 0);
12407
12408 EndCommandBuffer();
12409
12410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12411 deleted_buffer_in_command_buffer);
12412 QueueCommandBuffer(false);
12413 m_errorMonitor->VerifyFound();
12414
12415 {
12416 // Create and bind a vertex buffer in a reduced scope, and delete it
12417 // twice, the second through the destructor
12418 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12419 VkBufferTest::eDoubleDelete);
12420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12421 double_destroy_message);
12422 buffer_test.TestDoubleDestroy();
12423 }
12424 m_errorMonitor->VerifyFound();
12425
12426 if (VkBufferTest::
12427 GetTestConditionValid(m_device,
12428 VkBufferTest::eInvalidMemoryOffset)) {
12429 // Create and bind a memory buffer with an invalid offset.
12430 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12431 invalid_offset_message);
12432 VkBufferTest buffer_test(m_device,
12433 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
12434 VkBufferTest::eInvalidMemoryOffset);
12435 (void) buffer_test;
12436 m_errorMonitor->VerifyFound();
12437 }
12438
12439 if (VkBufferTest::
12440 GetTestConditionValid(m_device,
12441 VkBufferTest::eInvalidDeviceOffset,
12442 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
12443 // Create and bind a memory buffer with an invalid offset again,
12444 // but look for a texel buffer message.
12445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12446 invalid_texel_buffer_offset_message);
12447 VkBufferTest buffer_test(m_device,
12448 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
12449 VkBufferTest::eInvalidDeviceOffset);
12450 (void) buffer_test;
12451 m_errorMonitor->VerifyFound();
12452 }
12453
12454 if (VkBufferTest::
12455 GetTestConditionValid(m_device,
12456 VkBufferTest::eInvalidDeviceOffset,
12457 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
12458 // Create and bind a memory buffer with an invalid offset again, but
12459 // look for a uniform buffer message.
12460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12461 invalid_uniform_buffer_offset_message);
12462 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
12463 VkBufferTest::eInvalidDeviceOffset);
12464 (void) buffer_test;
12465 m_errorMonitor->VerifyFound();
12466 }
12467
12468 if (VkBufferTest::
12469 GetTestConditionValid(m_device,
12470 VkBufferTest::eInvalidDeviceOffset,
12471 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
12472 // Create and bind a memory buffer with an invalid offset again, but
12473 // look for a storage buffer message.
12474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12475 invalid_storage_buffer_offset_message);
12476 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12477 VkBufferTest::eInvalidDeviceOffset);
12478 (void) buffer_test;
12479 m_errorMonitor->VerifyFound();
12480 }
12481
12482 {
12483 // Attempt to bind a null buffer.
12484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12485 bind_null_buffer_message);
12486 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12487 VkBufferTest::eBindNullBuffer);
12488 (void) buffer_test;
12489 m_errorMonitor->VerifyFound();
12490 }
12491
12492 {
12493 // Attempt to use an invalid handle to delete a buffer.
12494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12495 free_invalid_buffer_message);
12496 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12497 VkBufferTest::eFreeInvalidHandle);
12498 (void) buffer_test;
12499 }
12500 m_errorMonitor->VerifyFound();
12501
12502 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12503}
12504
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012505// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
12506TEST_F(VkLayerTest, InvalidImageLayout) {
12507 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
12508 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
12509 "images in the wrong layout when they're copied or transitioned.");
12510 // 3 in ValidateCmdBufImageLayouts
12511 // * -1 Attempt to submit cmd buf w/ deleted image
12512 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
12513 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
12514 m_errorMonitor->SetDesiredFailureMsg(
12515 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12516 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12517
12518 ASSERT_NO_FATAL_FAILURE(InitState());
12519 // Create src & dst images to use for copy operations
12520 VkImage src_image;
12521 VkImage dst_image;
12522
12523 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
12524 const int32_t tex_width = 32;
12525 const int32_t tex_height = 32;
12526
12527 VkImageCreateInfo image_create_info = {};
12528 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12529 image_create_info.pNext = NULL;
12530 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12531 image_create_info.format = tex_format;
12532 image_create_info.extent.width = tex_width;
12533 image_create_info.extent.height = tex_height;
12534 image_create_info.extent.depth = 1;
12535 image_create_info.mipLevels = 1;
12536 image_create_info.arrayLayers = 4;
12537 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12538 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12539 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
12540 image_create_info.flags = 0;
12541
12542 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
12543 ASSERT_VK_SUCCESS(err);
12544 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
12545 ASSERT_VK_SUCCESS(err);
12546
12547 BeginCommandBuffer();
12548 VkImageCopy copyRegion;
12549 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12550 copyRegion.srcSubresource.mipLevel = 0;
12551 copyRegion.srcSubresource.baseArrayLayer = 0;
12552 copyRegion.srcSubresource.layerCount = 1;
12553 copyRegion.srcOffset.x = 0;
12554 copyRegion.srcOffset.y = 0;
12555 copyRegion.srcOffset.z = 0;
12556 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12557 copyRegion.dstSubresource.mipLevel = 0;
12558 copyRegion.dstSubresource.baseArrayLayer = 0;
12559 copyRegion.dstSubresource.layerCount = 1;
12560 copyRegion.dstOffset.x = 0;
12561 copyRegion.dstOffset.y = 0;
12562 copyRegion.dstOffset.z = 0;
12563 copyRegion.extent.width = 1;
12564 copyRegion.extent.height = 1;
12565 copyRegion.extent.depth = 1;
12566 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12567 m_errorMonitor->VerifyFound();
12568 // Now cause error due to src image layout changing
12569 m_errorMonitor->SetDesiredFailureMsg(
12570 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12571 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
12572 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12573 m_errorMonitor->VerifyFound();
12574 // Final src error is due to bad layout type
12575 m_errorMonitor->SetDesiredFailureMsg(
12576 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12577 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
12578 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12579 m_errorMonitor->VerifyFound();
12580 // Now verify same checks for dst
12581 m_errorMonitor->SetDesiredFailureMsg(
12582 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12583 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
12584 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12585 m_errorMonitor->VerifyFound();
12586 // Now cause error due to src image layout changing
12587 m_errorMonitor->SetDesiredFailureMsg(
12588 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12589 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
12590 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
12591 m_errorMonitor->VerifyFound();
12592 m_errorMonitor->SetDesiredFailureMsg(
12593 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12594 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
12595 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
12596 m_errorMonitor->VerifyFound();
12597 // Now cause error due to bad image layout transition in PipelineBarrier
12598 VkImageMemoryBarrier image_barrier[1] = {};
12599 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12600 image_barrier[0].image = src_image;
12601 image_barrier[0].subresourceRange.layerCount = 2;
12602 image_barrier[0].subresourceRange.levelCount = 2;
12603 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12604 m_errorMonitor->SetDesiredFailureMsg(
12605 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12606 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
12607 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
12608 m_errorMonitor->VerifyFound();
12609
12610 // Finally some layout errors at RenderPass create time
12611 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12612 VkAttachmentReference attach = {};
12613 // perf warning for GENERAL layout w/ non-DS input attachment
12614 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12615 VkSubpassDescription subpass = {};
12616 subpass.inputAttachmentCount = 1;
12617 subpass.pInputAttachments = &attach;
12618 VkRenderPassCreateInfo rpci = {};
12619 rpci.subpassCount = 1;
12620 rpci.pSubpasses = &subpass;
12621 rpci.attachmentCount = 1;
12622 VkAttachmentDescription attach_desc = {};
12623 attach_desc.format = VK_FORMAT_UNDEFINED;
12624 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012625 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012626 VkRenderPass rp;
12627 m_errorMonitor->SetDesiredFailureMsg(
12628 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12629 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
12630 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12631 m_errorMonitor->VerifyFound();
12632 // error w/ non-general layout
12633 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12634
12635 m_errorMonitor->SetDesiredFailureMsg(
12636 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12637 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12638 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12639 m_errorMonitor->VerifyFound();
12640 subpass.inputAttachmentCount = 0;
12641 subpass.colorAttachmentCount = 1;
12642 subpass.pColorAttachments = &attach;
12643 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12644 // perf warning for GENERAL layout on color attachment
12645 m_errorMonitor->SetDesiredFailureMsg(
12646 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12647 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
12648 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12649 m_errorMonitor->VerifyFound();
12650 // error w/ non-color opt or GENERAL layout for color attachment
12651 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12652 m_errorMonitor->SetDesiredFailureMsg(
12653 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12654 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12655 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12656 m_errorMonitor->VerifyFound();
12657 subpass.colorAttachmentCount = 0;
12658 subpass.pDepthStencilAttachment = &attach;
12659 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12660 // perf warning for GENERAL layout on DS attachment
12661 m_errorMonitor->SetDesiredFailureMsg(
12662 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Chris Forbesc5dd9bc2016-08-09 08:17:14 +120012663 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012664 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12665 m_errorMonitor->VerifyFound();
12666 // error w/ non-ds opt or GENERAL layout for color attachment
12667 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12668 m_errorMonitor->SetDesiredFailureMsg(
12669 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesc5dd9bc2016-08-09 08:17:14 +120012670 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012671 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12672 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012673 // For this error we need a valid renderpass so create default one
12674 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12675 attach.attachment = 0;
12676 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
12677 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12678 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12679 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12680 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12681 // Can't do a CLEAR load on READ_ONLY initialLayout
12682 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12683 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12684 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12685 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12686 " with invalid first layout "
12687 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
12688 "ONLY_OPTIMAL");
12689 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12690 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012691
12692 vkDestroyImage(m_device->device(), src_image, NULL);
12693 vkDestroyImage(m_device->device(), dst_image, NULL);
12694}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012695
12696TEST_F(VkLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
12697 TEST_DESCRIPTION("Positive test where we create a renderpass with an "
12698 "attachment that uses LOAD_OP_CLEAR, the first subpass "
12699 "has a valid layout, and a second subpass then uses a "
12700 "valid *READ_ONLY* layout.");
12701 m_errorMonitor->ExpectSuccess();
12702 ASSERT_NO_FATAL_FAILURE(InitState());
12703
12704 VkAttachmentReference attach[2] = {};
12705 attach[0].attachment = 0;
12706 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
12707 attach[1].attachment = 0;
12708 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12709 VkSubpassDescription subpasses[2] = {};
12710 // First subpass clears DS attach on load
12711 subpasses[0].pDepthStencilAttachment = &attach[0];
12712 // 2nd subpass reads in DS as input attachment
12713 subpasses[1].inputAttachmentCount = 1;
12714 subpasses[1].pInputAttachments = &attach[1];
12715 VkAttachmentDescription attach_desc = {};
12716 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
12717 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12718 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12719 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12720 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12721 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12722 attach_desc.initialLayout =
12723 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
12724 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12725 VkRenderPassCreateInfo rpci = {};
12726 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
12727 rpci.attachmentCount = 1;
12728 rpci.pAttachments = &attach_desc;
12729 rpci.subpassCount = 2;
12730 rpci.pSubpasses = subpasses;
12731
12732 // Now create RenderPass and verify no errors
12733 VkRenderPass rp;
12734 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12735 m_errorMonitor->VerifyNotFound();
12736
12737 vkDestroyRenderPass(m_device->device(), rp, NULL);
12738}
Tobin Ehlis4af23302016-07-19 10:50:30 -060012739
12740TEST_F(VkLayerTest, FramebufferIncompatible) {
12741 TEST_DESCRIPTION("Bind a secondary command buffer with with a framebuffer "
12742 "that does not match the framebuffer for the active "
12743 "renderpass.");
12744 ASSERT_NO_FATAL_FAILURE(InitState());
12745 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12746
12747 // A renderpass with one color attachment.
12748 VkAttachmentDescription attachment = {
12749 0,
12750 VK_FORMAT_B8G8R8A8_UNORM,
12751 VK_SAMPLE_COUNT_1_BIT,
12752 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12753 VK_ATTACHMENT_STORE_OP_STORE,
12754 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12755 VK_ATTACHMENT_STORE_OP_DONT_CARE,
12756 VK_IMAGE_LAYOUT_UNDEFINED,
12757 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
12758
12759 VkAttachmentReference att_ref = {0,
12760 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
12761
12762 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS,
12763 0, nullptr,
12764 1, &att_ref,
12765 nullptr, nullptr,
12766 0, nullptr};
12767
12768 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
12769 nullptr,
12770 0,
12771 1,
12772 &attachment,
12773 1,
12774 &subpass,
12775 0,
12776 nullptr};
12777
12778 VkRenderPass rp;
12779 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
12780 ASSERT_VK_SUCCESS(err);
12781
12782 // A compatible framebuffer.
12783 VkImageObj image(m_device);
12784 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM,
12785 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12786 ASSERT_TRUE(image.initialized());
12787
12788 VkImageViewCreateInfo ivci = {
12789 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
12790 nullptr,
12791 0,
12792 image.handle(),
12793 VK_IMAGE_VIEW_TYPE_2D,
12794 VK_FORMAT_B8G8R8A8_UNORM,
12795 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
12796 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
12797 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
12798 };
12799 VkImageView view;
12800 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
12801 ASSERT_VK_SUCCESS(err);
12802
12803 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
12804 nullptr,
12805 0,
12806 rp,
12807 1,
12808 &view,
12809 32,
12810 32,
12811 1};
12812 VkFramebuffer fb;
12813 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
12814 ASSERT_VK_SUCCESS(err);
12815
12816 VkCommandBufferAllocateInfo cbai = {};
12817 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12818 cbai.commandPool = m_commandPool;
12819 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12820 cbai.commandBufferCount = 1;
12821
12822 VkCommandBuffer sec_cb;
12823 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
12824 ASSERT_VK_SUCCESS(err);
12825 VkCommandBufferBeginInfo cbbi = {};
12826 VkCommandBufferInheritanceInfo cbii = {};
12827 cbii.renderPass = renderPass();
12828 cbii.framebuffer = fb;
12829 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12830 cbbi.pNext = NULL;
12831 cbbi.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
12832 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
12833 cbbi.pInheritanceInfo = &cbii;
12834 vkBeginCommandBuffer(sec_cb, &cbbi);
12835 vkEndCommandBuffer(sec_cb);
12836
12837 BeginCommandBuffer();
12838
12839 m_errorMonitor->SetDesiredFailureMsg(
12840 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12841 " that is not the same as the primaryCB's current active framebuffer ");
12842 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
12843 m_errorMonitor->VerifyFound();
12844 // Cleanup
12845 vkDestroyImageView(m_device->device(), view, NULL);
12846 vkDestroyRenderPass(m_device->device(), rp, NULL);
12847 vkDestroyFramebuffer(m_device->device(), fb, NULL);
12848}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012849
12850TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
12851 TEST_DESCRIPTION("If logicOp is available on the device, set it to an "
12852 "invalid value. If logicOp is not available, attempt to "
12853 "use it and verify that we see the correct error.");
12854 ASSERT_NO_FATAL_FAILURE(InitState());
12855 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12856
12857 auto features = m_device->phy().features();
12858 // Set the expected error depending on whether or not logicOp available
12859 if (VK_FALSE == features.logicOp) {
12860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12861 "If logic operations feature not "
12862 "enabled, logicOpEnable must be "
12863 "VK_FALSE");
12864 } else {
12865 m_errorMonitor->SetDesiredFailureMsg(
12866 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12867 ", logicOp must be a valid VkLogicOp value");
12868 }
12869 // Create a pipeline using logicOp
12870 VkResult err;
12871
12872 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12873 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12874
12875 VkPipelineLayout pipeline_layout;
12876 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
12877 &pipeline_layout);
12878 ASSERT_VK_SUCCESS(err);
12879
12880 VkPipelineViewportStateCreateInfo vp_state_ci = {};
12881 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
12882 vp_state_ci.viewportCount = 1;
12883 VkViewport vp = {}; // Just need dummy vp to point to
12884 vp_state_ci.pViewports = &vp;
12885 vp_state_ci.scissorCount = 1;
12886 VkRect2D scissors = {}; // Dummy scissors to point to
12887 vp_state_ci.pScissors = &scissors;
12888 // No dynamic state
12889 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
12890 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
12891
12892 VkPipelineShaderStageCreateInfo shaderStages[2];
12893 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
12894
12895 VkShaderObj vs(m_device, bindStateVertShaderText,
12896 VK_SHADER_STAGE_VERTEX_BIT, this);
12897 VkShaderObj fs(m_device, bindStateFragShaderText,
12898 VK_SHADER_STAGE_FRAGMENT_BIT,
12899 this);
12900 shaderStages[0] = vs.GetStageCreateInfo();
12901 shaderStages[1] = fs.GetStageCreateInfo();
12902
12903 VkPipelineVertexInputStateCreateInfo vi_ci = {};
12904 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
12905
12906 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
12907 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
12908 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
12909
12910 VkPipelineRasterizationStateCreateInfo rs_ci = {};
12911 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
12912
12913 VkPipelineColorBlendAttachmentState att = {};
12914 att.blendEnable = VK_FALSE;
12915 att.colorWriteMask = 0xf;
12916
12917 VkPipelineColorBlendStateCreateInfo cb_ci = {};
12918 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
12919 // Enable logicOp & set logicOp to value 1 beyond allowed entries
12920 cb_ci.logicOpEnable = VK_TRUE;
12921 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
12922 cb_ci.attachmentCount = 1;
12923 cb_ci.pAttachments = &att;
12924
12925 VkGraphicsPipelineCreateInfo gp_ci = {};
12926 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
12927 gp_ci.stageCount = 2;
12928 gp_ci.pStages = shaderStages;
12929 gp_ci.pVertexInputState = &vi_ci;
12930 gp_ci.pInputAssemblyState = &ia_ci;
12931 gp_ci.pViewportState = &vp_state_ci;
12932 gp_ci.pRasterizationState = &rs_ci;
12933 gp_ci.pColorBlendState = &cb_ci;
12934 gp_ci.pDynamicState = &dyn_state_ci;
12935 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
12936 gp_ci.layout = pipeline_layout;
12937 gp_ci.renderPass = renderPass();
12938
12939 VkPipelineCacheCreateInfo pc_ci = {};
12940 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
12941
12942 VkPipeline pipeline;
12943 VkPipelineCache pipelineCache;
12944 err =
12945 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
12946 ASSERT_VK_SUCCESS(err);
12947
12948 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
12949 &gp_ci, NULL, &pipeline);
12950 m_errorMonitor->VerifyFound();
12951 if (VK_SUCCESS == err) {
12952 vkDestroyPipeline(m_device->device(), pipeline, NULL);
12953 }
12954 m_errorMonitor->VerifyFound();
12955 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
12956 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12957}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012958#endif // DRAW_STATE_TESTS
12959
Tobin Ehlis0788f522015-05-26 16:11:58 -060012960#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060012961#if GTEST_IS_THREADSAFE
12962struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012963 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012964 VkEvent event;
12965 bool bailout;
12966};
12967
Karl Schultz6addd812016-02-02 17:17:23 -070012968extern "C" void *AddToCommandBuffer(void *arg) {
12969 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012970
Mike Stroyana6d14942016-07-13 15:10:05 -060012971 for (int i = 0; i < 80000; i++) {
Karl Schultz6addd812016-02-02 17:17:23 -070012972 vkCmdSetEvent(data->commandBuffer, data->event,
12973 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012974 if (data->bailout) {
12975 break;
12976 }
12977 }
12978 return NULL;
12979}
12980
Karl Schultz6addd812016-02-02 17:17:23 -070012981TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012982 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012983
Karl Schultz6addd812016-02-02 17:17:23 -070012984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12985 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012986
Mike Stroyanaccf7692015-05-12 16:00:45 -060012987 ASSERT_NO_FATAL_FAILURE(InitState());
12988 ASSERT_NO_FATAL_FAILURE(InitViewport());
12989 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12990
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012991 // Calls AllocateCommandBuffers
12992 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012993
12994 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012995 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012996
12997 VkEventCreateInfo event_info;
12998 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012999 VkResult err;
13000
13001 memset(&event_info, 0, sizeof(event_info));
13002 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13003
Chia-I Wuf7458c52015-10-26 21:10:41 +080013004 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013005 ASSERT_VK_SUCCESS(err);
13006
Mike Stroyanaccf7692015-05-12 16:00:45 -060013007 err = vkResetEvent(device(), event);
13008 ASSERT_VK_SUCCESS(err);
13009
13010 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013011 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013012 data.event = event;
13013 data.bailout = false;
13014 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013015
13016 // First do some correct operations using multiple threads.
13017 // Add many entries to command buffer from another thread.
13018 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13019 // Make non-conflicting calls from this thread at the same time.
13020 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013021 uint32_t count;
13022 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013023 }
13024 test_platform_thread_join(thread, NULL);
13025
13026 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013027 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013028 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013029 // Add many entries to command buffer from this thread at the same time.
13030 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013031
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013032 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013033 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013034
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013035 m_errorMonitor->SetBailout(NULL);
13036
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013037 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013038
Chia-I Wuf7458c52015-10-26 21:10:41 +080013039 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013040}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013041#endif // GTEST_IS_THREADSAFE
13042#endif // THREADING_TESTS
13043
Chris Forbes9f7ff632015-05-25 11:13:08 +120013044#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070013045TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013046 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
13047 "with an impossible code size");
13048
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013049 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013050 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013051
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013052 ASSERT_NO_FATAL_FAILURE(InitState());
13053 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13054
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013055 VkShaderModule module;
13056 VkShaderModuleCreateInfo moduleCreateInfo;
13057 struct icd_spv_header spv;
13058
13059 spv.magic = ICD_SPV_MAGIC;
13060 spv.version = ICD_SPV_VERSION;
13061 spv.gen_magic = 0;
13062
13063 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13064 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013065 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013066 moduleCreateInfo.codeSize = 4;
13067 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013068 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013069
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013070 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013071}
13072
Karl Schultz6addd812016-02-02 17:17:23 -070013073TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013074 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
13075 "with a bad magic number");
13076
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013078 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013079
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013080 ASSERT_NO_FATAL_FAILURE(InitState());
13081 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13082
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013083 VkShaderModule module;
13084 VkShaderModuleCreateInfo moduleCreateInfo;
13085 struct icd_spv_header spv;
13086
13087 spv.magic = ~ICD_SPV_MAGIC;
13088 spv.version = ICD_SPV_VERSION;
13089 spv.gen_magic = 0;
13090
13091 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13092 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013093 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013094 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13095 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013096 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013097
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013098 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013099}
13100
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013101#if 0
13102// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013103TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013105 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013106
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013107 ASSERT_NO_FATAL_FAILURE(InitState());
13108 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13109
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013110 VkShaderModule module;
13111 VkShaderModuleCreateInfo moduleCreateInfo;
13112 struct icd_spv_header spv;
13113
13114 spv.magic = ICD_SPV_MAGIC;
13115 spv.version = ~ICD_SPV_VERSION;
13116 spv.gen_magic = 0;
13117
13118 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13119 moduleCreateInfo.pNext = NULL;
13120
Karl Schultz6addd812016-02-02 17:17:23 -070013121 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013122 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13123 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013124 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013125
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013126 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013127}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013128#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013129
Karl Schultz6addd812016-02-02 17:17:23 -070013130TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013131 TEST_DESCRIPTION("Test that a warning is produced for a vertex output that "
13132 "is not consumed by the fragment stage");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013133 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013134 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013135
Chris Forbes9f7ff632015-05-25 11:13:08 +120013136 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013137 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013138
13139 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013140 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120013141 "\n"
13142 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070013143 "out gl_PerVertex {\n"
13144 " vec4 gl_Position;\n"
13145 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120013146 "void main(){\n"
13147 " gl_Position = vec4(1);\n"
13148 " x = 0;\n"
13149 "}\n";
13150 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013151 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120013152 "\n"
13153 "layout(location=0) out vec4 color;\n"
13154 "void main(){\n"
13155 " color = vec4(1);\n"
13156 "}\n";
13157
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013158 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13159 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013160
13161 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013162 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013163 pipe.AddShader(&vs);
13164 pipe.AddShader(&fs);
13165
Chris Forbes9f7ff632015-05-25 11:13:08 +120013166 VkDescriptorSetObj descriptorSet(m_device);
13167 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013168 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013169
Tony Barbour5781e8f2015-08-04 16:23:11 -060013170 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013171
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013172 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013173}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013174
Karl Schultz6addd812016-02-02 17:17:23 -070013175TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013176 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
13177 "which is not present in the outputs of the previous stage");
13178
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013180 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013181
Chris Forbes59cb88d2015-05-25 11:13:13 +120013182 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013183 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013184
13185 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013186 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120013187 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013188 "out gl_PerVertex {\n"
13189 " vec4 gl_Position;\n"
13190 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120013191 "void main(){\n"
13192 " gl_Position = vec4(1);\n"
13193 "}\n";
13194 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013195 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120013196 "\n"
13197 "layout(location=0) in float x;\n"
13198 "layout(location=0) out vec4 color;\n"
13199 "void main(){\n"
13200 " color = vec4(x);\n"
13201 "}\n";
13202
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013203 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13204 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120013205
13206 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013207 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120013208 pipe.AddShader(&vs);
13209 pipe.AddShader(&fs);
13210
Chris Forbes59cb88d2015-05-25 11:13:13 +120013211 VkDescriptorSetObj descriptorSet(m_device);
13212 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013213 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120013214
Tony Barbour5781e8f2015-08-04 16:23:11 -060013215 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013216
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013217 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120013218}
13219
Karl Schultz6addd812016-02-02 17:17:23 -070013220TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013221 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
13222 "within an interace block, which is not present in the outputs "
13223 "of the previous stage.");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013225 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013226
13227 ASSERT_NO_FATAL_FAILURE(InitState());
13228 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13229
13230 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013231 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013232 "\n"
13233 "out gl_PerVertex {\n"
13234 " vec4 gl_Position;\n"
13235 "};\n"
13236 "void main(){\n"
13237 " gl_Position = vec4(1);\n"
13238 "}\n";
13239 char const *fsSource =
13240 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013241 "\n"
13242 "in block { layout(location=0) float x; } ins;\n"
13243 "layout(location=0) out vec4 color;\n"
13244 "void main(){\n"
13245 " color = vec4(ins.x);\n"
13246 "}\n";
13247
13248 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13249 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13250
13251 VkPipelineObj pipe(m_device);
13252 pipe.AddColorAttachment();
13253 pipe.AddShader(&vs);
13254 pipe.AddShader(&fs);
13255
13256 VkDescriptorSetObj descriptorSet(m_device);
13257 descriptorSet.AppendDummy();
13258 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13259
13260 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13261
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013262 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013263}
13264
Karl Schultz6addd812016-02-02 17:17:23 -070013265TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013266 TEST_DESCRIPTION("Test that an error is produced for mismatched array sizes "
13267 "across the VS->FS interface");
Chris Forbes0036fd12016-01-26 14:19:49 +130013268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +130013269 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -070013270 "output arr[2] of float32' vs 'ptr to "
13271 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130013272
13273 ASSERT_NO_FATAL_FAILURE(InitState());
13274 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13275
13276 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013277 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130013278 "\n"
13279 "layout(location=0) out float x[2];\n"
13280 "out gl_PerVertex {\n"
13281 " vec4 gl_Position;\n"
13282 "};\n"
13283 "void main(){\n"
13284 " x[0] = 0; x[1] = 0;\n"
13285 " gl_Position = vec4(1);\n"
13286 "}\n";
13287 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013288 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130013289 "\n"
13290 "layout(location=0) in float x[3];\n"
13291 "layout(location=0) out vec4 color;\n"
13292 "void main(){\n"
13293 " color = vec4(x[0] + x[1] + x[2]);\n"
13294 "}\n";
13295
13296 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13297 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13298
13299 VkPipelineObj pipe(m_device);
13300 pipe.AddColorAttachment();
13301 pipe.AddShader(&vs);
13302 pipe.AddShader(&fs);
13303
13304 VkDescriptorSetObj descriptorSet(m_device);
13305 descriptorSet.AppendDummy();
13306 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13307
13308 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13309
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013310 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130013311}
13312
Karl Schultz6addd812016-02-02 17:17:23 -070013313TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013314 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
13315 "the VS->FS interface");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013317 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013318
Chris Forbesb56af562015-05-25 11:13:17 +120013319 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013320 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120013321
13322 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013323 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120013324 "\n"
13325 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070013326 "out gl_PerVertex {\n"
13327 " vec4 gl_Position;\n"
13328 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +120013329 "void main(){\n"
13330 " x = 0;\n"
13331 " gl_Position = vec4(1);\n"
13332 "}\n";
13333 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013334 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120013335 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013336 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +120013337 "layout(location=0) out vec4 color;\n"
13338 "void main(){\n"
13339 " color = vec4(x);\n"
13340 "}\n";
13341
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013342 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13343 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120013344
13345 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013346 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120013347 pipe.AddShader(&vs);
13348 pipe.AddShader(&fs);
13349
Chris Forbesb56af562015-05-25 11:13:17 +120013350 VkDescriptorSetObj descriptorSet(m_device);
13351 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013352 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120013353
Tony Barbour5781e8f2015-08-04 16:23:11 -060013354 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120013355
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013356 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120013357}
13358
Karl Schultz6addd812016-02-02 17:17:23 -070013359TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013360 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
13361 "the VS->FS interface, when the variable is contained within "
13362 "an interface block");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013363 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013364 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013365
13366 ASSERT_NO_FATAL_FAILURE(InitState());
13367 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13368
13369 char const *vsSource =
13370 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013371 "\n"
13372 "out block { layout(location=0) int x; } outs;\n"
13373 "out gl_PerVertex {\n"
13374 " vec4 gl_Position;\n"
13375 "};\n"
13376 "void main(){\n"
13377 " outs.x = 0;\n"
13378 " gl_Position = vec4(1);\n"
13379 "}\n";
13380 char const *fsSource =
13381 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013382 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013383 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +130013384 "layout(location=0) out vec4 color;\n"
13385 "void main(){\n"
13386 " color = vec4(ins.x);\n"
13387 "}\n";
13388
13389 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13390 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13391
13392 VkPipelineObj pipe(m_device);
13393 pipe.AddColorAttachment();
13394 pipe.AddShader(&vs);
13395 pipe.AddShader(&fs);
13396
13397 VkDescriptorSetObj descriptorSet(m_device);
13398 descriptorSet.AppendDummy();
13399 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13400
13401 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13402
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013403 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013404}
13405
13406TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013407 TEST_DESCRIPTION("Test that an error is produced for location mismatches across "
13408 "the VS->FS interface; This should manifest as a not-written/not-consumed "
13409 "pair, but flushes out broken walking of the interfaces");
Chris Forbese9928822016-02-17 14:44:52 +130013410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13411 "location 0.0 which is not written by vertex shader");
13412
13413 ASSERT_NO_FATAL_FAILURE(InitState());
13414 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13415
13416 char const *vsSource =
13417 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013418 "\n"
13419 "out block { layout(location=1) float x; } outs;\n"
13420 "out gl_PerVertex {\n"
13421 " vec4 gl_Position;\n"
13422 "};\n"
13423 "void main(){\n"
13424 " outs.x = 0;\n"
13425 " gl_Position = vec4(1);\n"
13426 "}\n";
13427 char const *fsSource =
13428 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013429 "\n"
13430 "in block { layout(location=0) float x; } ins;\n"
13431 "layout(location=0) out vec4 color;\n"
13432 "void main(){\n"
13433 " color = vec4(ins.x);\n"
13434 "}\n";
13435
13436 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13437 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13438
13439 VkPipelineObj pipe(m_device);
13440 pipe.AddColorAttachment();
13441 pipe.AddShader(&vs);
13442 pipe.AddShader(&fs);
13443
13444 VkDescriptorSetObj descriptorSet(m_device);
13445 descriptorSet.AppendDummy();
13446 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13447
13448 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13449
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013450 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013451}
13452
13453TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013454 TEST_DESCRIPTION("Test that an error is produced for component mismatches across the "
13455 "VS->FS interface. It's not enough to have the same set of locations in "
13456 "use; matching is defined in terms of spirv variables.");
Chris Forbese9928822016-02-17 14:44:52 +130013457 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13458 "location 0.1 which is not written by vertex shader");
13459
13460 ASSERT_NO_FATAL_FAILURE(InitState());
13461 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13462
13463 char const *vsSource =
13464 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013465 "\n"
13466 "out block { layout(location=0, component=0) float x; } outs;\n"
13467 "out gl_PerVertex {\n"
13468 " vec4 gl_Position;\n"
13469 "};\n"
13470 "void main(){\n"
13471 " outs.x = 0;\n"
13472 " gl_Position = vec4(1);\n"
13473 "}\n";
13474 char const *fsSource =
13475 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013476 "\n"
13477 "in block { layout(location=0, component=1) float x; } ins;\n"
13478 "layout(location=0) out vec4 color;\n"
13479 "void main(){\n"
13480 " color = vec4(ins.x);\n"
13481 "}\n";
13482
13483 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13484 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13485
13486 VkPipelineObj pipe(m_device);
13487 pipe.AddColorAttachment();
13488 pipe.AddShader(&vs);
13489 pipe.AddShader(&fs);
13490
13491 VkDescriptorSetObj descriptorSet(m_device);
13492 descriptorSet.AppendDummy();
13493 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13494
13495 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13496
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013497 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013498}
13499
Karl Schultz6addd812016-02-02 17:17:23 -070013500TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013501 TEST_DESCRIPTION("Test that a warning is produced for a vertex attribute which is "
13502 "not consumed by the vertex shader");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013504 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013505
Chris Forbesde136e02015-05-25 11:13:28 +120013506 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013507 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120013508
13509 VkVertexInputBindingDescription input_binding;
13510 memset(&input_binding, 0, sizeof(input_binding));
13511
13512 VkVertexInputAttributeDescription input_attrib;
13513 memset(&input_attrib, 0, sizeof(input_attrib));
13514 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13515
13516 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013517 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120013518 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013519 "out gl_PerVertex {\n"
13520 " vec4 gl_Position;\n"
13521 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +120013522 "void main(){\n"
13523 " gl_Position = vec4(1);\n"
13524 "}\n";
13525 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013526 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120013527 "\n"
13528 "layout(location=0) out vec4 color;\n"
13529 "void main(){\n"
13530 " color = vec4(1);\n"
13531 "}\n";
13532
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013533 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13534 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120013535
13536 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013537 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120013538 pipe.AddShader(&vs);
13539 pipe.AddShader(&fs);
13540
13541 pipe.AddVertexInputBindings(&input_binding, 1);
13542 pipe.AddVertexInputAttribs(&input_attrib, 1);
13543
Chris Forbesde136e02015-05-25 11:13:28 +120013544 VkDescriptorSetObj descriptorSet(m_device);
13545 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013546 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120013547
Tony Barbour5781e8f2015-08-04 16:23:11 -060013548 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120013549
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013550 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120013551}
13552
Karl Schultz6addd812016-02-02 17:17:23 -070013553TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013554 TEST_DESCRIPTION("Test that a warning is produced for a location mismatch on "
13555 "vertex attributes. This flushes out bad behavior in the interface walker");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013556 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013557 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +130013558
13559 ASSERT_NO_FATAL_FAILURE(InitState());
13560 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13561
13562 VkVertexInputBindingDescription input_binding;
13563 memset(&input_binding, 0, sizeof(input_binding));
13564
13565 VkVertexInputAttributeDescription input_attrib;
13566 memset(&input_attrib, 0, sizeof(input_attrib));
13567 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13568
13569 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013570 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130013571 "\n"
13572 "layout(location=1) in float x;\n"
13573 "out gl_PerVertex {\n"
13574 " vec4 gl_Position;\n"
13575 "};\n"
13576 "void main(){\n"
13577 " gl_Position = vec4(x);\n"
13578 "}\n";
13579 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013580 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130013581 "\n"
13582 "layout(location=0) out vec4 color;\n"
13583 "void main(){\n"
13584 " color = vec4(1);\n"
13585 "}\n";
13586
13587 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13588 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13589
13590 VkPipelineObj pipe(m_device);
13591 pipe.AddColorAttachment();
13592 pipe.AddShader(&vs);
13593 pipe.AddShader(&fs);
13594
13595 pipe.AddVertexInputBindings(&input_binding, 1);
13596 pipe.AddVertexInputAttribs(&input_attrib, 1);
13597
13598 VkDescriptorSetObj descriptorSet(m_device);
13599 descriptorSet.AppendDummy();
13600 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13601
13602 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13603
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013604 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130013605}
13606
Karl Schultz6addd812016-02-02 17:17:23 -070013607TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013608 TEST_DESCRIPTION("Test that an error is produced for a VS input which is not "
13609 "provided by a vertex attribute");
Karl Schultz6addd812016-02-02 17:17:23 -070013610 m_errorMonitor->SetDesiredFailureMsg(
13611 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013612 "VS consumes input at location 0 but not provided");
13613
Chris Forbes62e8e502015-05-25 11:13:29 +120013614 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013615 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120013616
13617 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013618 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120013619 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013620 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -070013621 "out gl_PerVertex {\n"
13622 " vec4 gl_Position;\n"
13623 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120013624 "void main(){\n"
13625 " gl_Position = x;\n"
13626 "}\n";
13627 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013628 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120013629 "\n"
13630 "layout(location=0) out vec4 color;\n"
13631 "void main(){\n"
13632 " color = vec4(1);\n"
13633 "}\n";
13634
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013635 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13636 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120013637
13638 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013639 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120013640 pipe.AddShader(&vs);
13641 pipe.AddShader(&fs);
13642
Chris Forbes62e8e502015-05-25 11:13:29 +120013643 VkDescriptorSetObj descriptorSet(m_device);
13644 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013645 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120013646
Tony Barbour5781e8f2015-08-04 16:23:11 -060013647 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120013648
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013649 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120013650}
13651
Karl Schultz6addd812016-02-02 17:17:23 -070013652TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013653 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the "
13654 "fundamental type (float/int/uint) of an attribute and the "
13655 "VS input that consumes it");
Karl Schultz6addd812016-02-02 17:17:23 -070013656 m_errorMonitor->SetDesiredFailureMsg(
13657 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013658 "location 0 does not match VS input type");
13659
Chris Forbesc97d98e2015-05-25 11:13:31 +120013660 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013661 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013662
13663 VkVertexInputBindingDescription input_binding;
13664 memset(&input_binding, 0, sizeof(input_binding));
13665
13666 VkVertexInputAttributeDescription input_attrib;
13667 memset(&input_attrib, 0, sizeof(input_attrib));
13668 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13669
13670 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013671 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120013672 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013673 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070013674 "out gl_PerVertex {\n"
13675 " vec4 gl_Position;\n"
13676 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120013677 "void main(){\n"
13678 " gl_Position = vec4(x);\n"
13679 "}\n";
13680 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013681 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120013682 "\n"
13683 "layout(location=0) out vec4 color;\n"
13684 "void main(){\n"
13685 " color = vec4(1);\n"
13686 "}\n";
13687
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013688 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13689 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013690
13691 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013692 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013693 pipe.AddShader(&vs);
13694 pipe.AddShader(&fs);
13695
13696 pipe.AddVertexInputBindings(&input_binding, 1);
13697 pipe.AddVertexInputAttribs(&input_attrib, 1);
13698
Chris Forbesc97d98e2015-05-25 11:13:31 +120013699 VkDescriptorSetObj descriptorSet(m_device);
13700 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013701 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013702
Tony Barbour5781e8f2015-08-04 16:23:11 -060013703 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013704
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013705 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013706}
13707
Chris Forbesc68b43c2016-04-06 11:18:47 +120013708TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013709 TEST_DESCRIPTION("Test that an error is produced for a pipeline containing multiple "
13710 "shaders for the same stage");
Chris Forbesc68b43c2016-04-06 11:18:47 +120013711 m_errorMonitor->SetDesiredFailureMsg(
13712 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13713 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
13714
13715 ASSERT_NO_FATAL_FAILURE(InitState());
13716 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13717
13718 char const *vsSource =
13719 "#version 450\n"
13720 "\n"
13721 "out gl_PerVertex {\n"
13722 " vec4 gl_Position;\n"
13723 "};\n"
13724 "void main(){\n"
13725 " gl_Position = vec4(1);\n"
13726 "}\n";
13727 char const *fsSource =
13728 "#version 450\n"
13729 "\n"
13730 "layout(location=0) out vec4 color;\n"
13731 "void main(){\n"
13732 " color = vec4(1);\n"
13733 "}\n";
13734
13735 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13736 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13737
13738 VkPipelineObj pipe(m_device);
13739 pipe.AddColorAttachment();
13740 pipe.AddShader(&vs);
13741 pipe.AddShader(&vs);
13742 pipe.AddShader(&fs);
13743
13744 VkDescriptorSetObj descriptorSet(m_device);
13745 descriptorSet.AppendDummy();
13746 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13747
13748 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13749
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013750 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120013751}
13752
Karl Schultz6addd812016-02-02 17:17:23 -070013753TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013754 TEST_DESCRIPTION("Test that pipeline validation accepts matrices passed "
13755 "as vertex attributes");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013756 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130013757
13758 ASSERT_NO_FATAL_FAILURE(InitState());
13759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13760
13761 VkVertexInputBindingDescription input_binding;
13762 memset(&input_binding, 0, sizeof(input_binding));
13763
13764 VkVertexInputAttributeDescription input_attribs[2];
13765 memset(input_attribs, 0, sizeof(input_attribs));
13766
13767 for (int i = 0; i < 2; i++) {
13768 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13769 input_attribs[i].location = i;
13770 }
13771
13772 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013773 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013774 "\n"
13775 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070013776 "out gl_PerVertex {\n"
13777 " vec4 gl_Position;\n"
13778 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013779 "void main(){\n"
13780 " gl_Position = x[0] + x[1];\n"
13781 "}\n";
13782 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013783 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013784 "\n"
13785 "layout(location=0) out vec4 color;\n"
13786 "void main(){\n"
13787 " color = vec4(1);\n"
13788 "}\n";
13789
13790 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13791 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13792
13793 VkPipelineObj pipe(m_device);
13794 pipe.AddColorAttachment();
13795 pipe.AddShader(&vs);
13796 pipe.AddShader(&fs);
13797
13798 pipe.AddVertexInputBindings(&input_binding, 1);
13799 pipe.AddVertexInputAttribs(input_attribs, 2);
13800
13801 VkDescriptorSetObj descriptorSet(m_device);
13802 descriptorSet.AppendDummy();
13803 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13804
13805 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13806
13807 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013808 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130013809}
13810
Chris Forbes2682b242015-11-24 11:13:14 +130013811TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
13812{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013813 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130013814
13815 ASSERT_NO_FATAL_FAILURE(InitState());
13816 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13817
13818 VkVertexInputBindingDescription input_binding;
13819 memset(&input_binding, 0, sizeof(input_binding));
13820
13821 VkVertexInputAttributeDescription input_attribs[2];
13822 memset(input_attribs, 0, sizeof(input_attribs));
13823
13824 for (int i = 0; i < 2; i++) {
13825 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13826 input_attribs[i].location = i;
13827 }
13828
13829 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013830 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013831 "\n"
13832 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -070013833 "out gl_PerVertex {\n"
13834 " vec4 gl_Position;\n"
13835 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013836 "void main(){\n"
13837 " gl_Position = x[0] + x[1];\n"
13838 "}\n";
13839 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013840 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013841 "\n"
13842 "layout(location=0) out vec4 color;\n"
13843 "void main(){\n"
13844 " color = vec4(1);\n"
13845 "}\n";
13846
13847 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13848 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13849
13850 VkPipelineObj pipe(m_device);
13851 pipe.AddColorAttachment();
13852 pipe.AddShader(&vs);
13853 pipe.AddShader(&fs);
13854
13855 pipe.AddVertexInputBindings(&input_binding, 1);
13856 pipe.AddVertexInputAttribs(input_attribs, 2);
13857
13858 VkDescriptorSetObj descriptorSet(m_device);
13859 descriptorSet.AppendDummy();
13860 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13861
13862 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13863
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013864 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130013865}
Chris Forbes2682b242015-11-24 11:13:14 +130013866
Chris Forbesbc290ce2016-07-06 12:01:49 +120013867TEST_F(VkLayerTest, CreatePipelineAttribComponents)
13868{
Chris Forbes1cc79542016-07-20 11:13:44 +120013869 TEST_DESCRIPTION("Test that pipeline validation accepts consuming a vertex attribute "
13870 "through multiple VS inputs, each consuming a different subset of the "
13871 "components.");
Chris Forbesbc290ce2016-07-06 12:01:49 +120013872 m_errorMonitor->ExpectSuccess();
13873
13874 ASSERT_NO_FATAL_FAILURE(InitState());
13875 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13876
13877 VkVertexInputBindingDescription input_binding;
13878 memset(&input_binding, 0, sizeof(input_binding));
13879
13880 VkVertexInputAttributeDescription input_attribs[3];
13881 memset(input_attribs, 0, sizeof(input_attribs));
13882
13883 for (int i = 0; i < 3; i++) {
13884 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13885 input_attribs[i].location = i;
13886 }
13887
13888 char const *vsSource =
13889 "#version 450\n"
13890 "\n"
13891 "layout(location=0) in vec4 x;\n"
13892 "layout(location=1) in vec3 y1;\n"
13893 "layout(location=1, component=3) in float y2;\n"
13894 "layout(location=2) in vec4 z;\n"
13895 "out gl_PerVertex {\n"
13896 " vec4 gl_Position;\n"
13897 "};\n"
13898 "void main(){\n"
13899 " gl_Position = x + vec4(y1, y2) + z;\n"
13900 "}\n";
13901 char const *fsSource =
13902 "#version 450\n"
13903 "\n"
13904 "layout(location=0) out vec4 color;\n"
13905 "void main(){\n"
13906 " color = vec4(1);\n"
13907 "}\n";
13908
13909 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13910 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13911
13912 VkPipelineObj pipe(m_device);
13913 pipe.AddColorAttachment();
13914 pipe.AddShader(&vs);
13915 pipe.AddShader(&fs);
13916
13917 pipe.AddVertexInputBindings(&input_binding, 1);
13918 pipe.AddVertexInputAttribs(input_attribs, 3);
13919
13920 VkDescriptorSetObj descriptorSet(m_device);
13921 descriptorSet.AppendDummy();
13922 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13923
13924 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13925
13926 m_errorMonitor->VerifyNotFound();
13927}
13928
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013929TEST_F(VkLayerTest, CreatePipelineSimplePositive)
13930{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013931 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013932
13933 ASSERT_NO_FATAL_FAILURE(InitState());
13934 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13935
13936 char const *vsSource =
13937 "#version 450\n"
13938 "out gl_PerVertex {\n"
13939 " vec4 gl_Position;\n"
13940 "};\n"
13941 "void main(){\n"
13942 " gl_Position = vec4(0);\n"
13943 "}\n";
13944 char const *fsSource =
13945 "#version 450\n"
13946 "\n"
13947 "layout(location=0) out vec4 color;\n"
13948 "void main(){\n"
13949 " color = vec4(1);\n"
13950 "}\n";
13951
13952 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13953 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13954
13955 VkPipelineObj pipe(m_device);
13956 pipe.AddColorAttachment();
13957 pipe.AddShader(&vs);
13958 pipe.AddShader(&fs);
13959
13960 VkDescriptorSetObj descriptorSet(m_device);
13961 descriptorSet.AppendDummy();
13962 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13963
13964 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13965
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013966 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013967}
13968
Chris Forbes912c9192016-04-05 17:50:35 +120013969TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
13970{
Chris Forbes1cc79542016-07-20 11:13:44 +120013971 TEST_DESCRIPTION("Test that pipeline validation accepts the relaxed type matching rules "
13972 "set out in 14.1.3: fundamental type must match, and producer side must "
13973 "have at least as many components");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013974 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +120013975
13976 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
13977
13978 ASSERT_NO_FATAL_FAILURE(InitState());
13979 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13980
13981 char const *vsSource =
13982 "#version 450\n"
13983 "out gl_PerVertex {\n"
13984 " vec4 gl_Position;\n"
13985 "};\n"
13986 "layout(location=0) out vec3 x;\n"
13987 "layout(location=1) out ivec3 y;\n"
13988 "layout(location=2) out vec3 z;\n"
13989 "void main(){\n"
13990 " gl_Position = vec4(0);\n"
13991 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
13992 "}\n";
13993 char const *fsSource =
13994 "#version 450\n"
13995 "\n"
13996 "layout(location=0) out vec4 color;\n"
13997 "layout(location=0) in float x;\n"
13998 "layout(location=1) flat in int y;\n"
13999 "layout(location=2) in vec2 z;\n"
14000 "void main(){\n"
14001 " color = vec4(1 + x + y + z.x);\n"
14002 "}\n";
14003
14004 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14005 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14006
14007 VkPipelineObj pipe(m_device);
14008 pipe.AddColorAttachment();
14009 pipe.AddShader(&vs);
14010 pipe.AddShader(&fs);
14011
14012 VkDescriptorSetObj descriptorSet(m_device);
14013 descriptorSet.AppendDummy();
14014 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14015
Mike Stroyan255e9582016-06-24 09:49:32 -060014016 VkResult err = VK_SUCCESS;
14017 err =
14018 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14019 ASSERT_VK_SUCCESS(err);
14020
Chris Forbes912c9192016-04-05 17:50:35 +120014021
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014022 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +120014023}
14024
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014025TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
14026{
Chris Forbes1cc79542016-07-20 11:13:44 +120014027 TEST_DESCRIPTION("Test that pipeline validation accepts per-vertex variables "
14028 "passed between the TCS and TES stages");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014029 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014030
14031 ASSERT_NO_FATAL_FAILURE(InitState());
14032 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14033
Chris Forbesc1e852d2016-04-04 19:26:42 +120014034 if (!m_device->phy().features().tessellationShader) {
14035 printf("Device does not support tessellation shaders; skipped.\n");
14036 return;
14037 }
14038
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014039 char const *vsSource =
14040 "#version 450\n"
14041 "void main(){}\n";
14042 char const *tcsSource =
14043 "#version 450\n"
14044 "layout(location=0) out int x[];\n"
14045 "layout(vertices=3) out;\n"
14046 "void main(){\n"
14047 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14048 " gl_TessLevelInner[0] = 1;\n"
14049 " x[gl_InvocationID] = gl_InvocationID;\n"
14050 "}\n";
14051 char const *tesSource =
14052 "#version 450\n"
14053 "layout(triangles, equal_spacing, cw) in;\n"
14054 "layout(location=0) in int x[];\n"
14055 "out gl_PerVertex { vec4 gl_Position; };\n"
14056 "void main(){\n"
14057 " gl_Position.xyz = gl_TessCoord;\n"
14058 " gl_Position.w = x[0] + x[1] + x[2];\n"
14059 "}\n";
14060 char const *fsSource =
14061 "#version 450\n"
14062 "layout(location=0) out vec4 color;\n"
14063 "void main(){\n"
14064 " color = vec4(1);\n"
14065 "}\n";
14066
14067 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14068 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14069 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14070 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14071
14072 VkPipelineInputAssemblyStateCreateInfo iasci{
14073 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
14074 nullptr,
14075 0,
14076 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
14077 VK_FALSE};
14078
Chris Forbesb4cacb62016-04-04 19:15:00 +120014079 VkPipelineTessellationStateCreateInfo tsci{
14080 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
14081 nullptr,
14082 0,
14083 3};
14084
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014085 VkPipelineObj pipe(m_device);
14086 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +120014087 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014088 pipe.AddColorAttachment();
14089 pipe.AddShader(&vs);
14090 pipe.AddShader(&tcs);
14091 pipe.AddShader(&tes);
14092 pipe.AddShader(&fs);
14093
14094 VkDescriptorSetObj descriptorSet(m_device);
14095 descriptorSet.AppendDummy();
14096 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14097
14098 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14099
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014100 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014101}
14102
Chris Forbesa0ab8152016-04-20 13:34:27 +120014103TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
14104{
Chris Forbes1cc79542016-07-20 11:13:44 +120014105 TEST_DESCRIPTION("Test that pipeline validation accepts a user-defined "
14106 "interface block passed into the geometry shader. This "
14107 "is interesting because the 'extra' array level is not "
14108 "present on the member type, but on the block instance.");
Chris Forbesa0ab8152016-04-20 13:34:27 +120014109 m_errorMonitor->ExpectSuccess();
14110
14111 ASSERT_NO_FATAL_FAILURE(InitState());
14112 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14113
14114 if (!m_device->phy().features().geometryShader) {
14115 printf("Device does not support geometry shaders; skipped.\n");
14116 return;
14117 }
14118
14119 char const *vsSource =
14120 "#version 450\n"
14121 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
14122 "void main(){\n"
14123 " vs_out.x = vec4(1);\n"
14124 "}\n";
14125 char const *gsSource =
14126 "#version 450\n"
14127 "layout(triangles) in;\n"
14128 "layout(triangle_strip, max_vertices=3) out;\n"
14129 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
14130 "out gl_PerVertex { vec4 gl_Position; };\n"
14131 "void main() {\n"
14132 " gl_Position = gs_in[0].x;\n"
14133 " EmitVertex();\n"
14134 "}\n";
14135 char const *fsSource =
14136 "#version 450\n"
14137 "layout(location=0) out vec4 color;\n"
14138 "void main(){\n"
14139 " color = vec4(1);\n"
14140 "}\n";
14141
14142 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14143 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
14144 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14145
14146 VkPipelineObj pipe(m_device);
14147 pipe.AddColorAttachment();
14148 pipe.AddShader(&vs);
14149 pipe.AddShader(&gs);
14150 pipe.AddShader(&fs);
14151
14152 VkDescriptorSetObj descriptorSet(m_device);
14153 descriptorSet.AppendDummy();
14154 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14155
14156 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14157
14158 m_errorMonitor->VerifyNotFound();
14159}
14160
Chris Forbesa0193bc2016-04-04 19:19:47 +120014161TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
14162{
Chris Forbes1cc79542016-07-20 11:13:44 +120014163 TEST_DESCRIPTION("Test that an error is produced for a variable output from "
14164 "the TCS without the patch decoration, but consumed in the TES "
14165 "with the decoration.");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14167 "is per-vertex in tessellation control shader stage "
14168 "but per-patch in tessellation evaluation shader stage");
14169
14170 ASSERT_NO_FATAL_FAILURE(InitState());
14171 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14172
Chris Forbesc1e852d2016-04-04 19:26:42 +120014173 if (!m_device->phy().features().tessellationShader) {
14174 printf("Device does not support tessellation shaders; skipped.\n");
14175 return;
14176 }
14177
Chris Forbesa0193bc2016-04-04 19:19:47 +120014178 char const *vsSource =
14179 "#version 450\n"
14180 "void main(){}\n";
14181 char const *tcsSource =
14182 "#version 450\n"
14183 "layout(location=0) out int x[];\n"
14184 "layout(vertices=3) out;\n"
14185 "void main(){\n"
14186 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14187 " gl_TessLevelInner[0] = 1;\n"
14188 " x[gl_InvocationID] = gl_InvocationID;\n"
14189 "}\n";
14190 char const *tesSource =
14191 "#version 450\n"
14192 "layout(triangles, equal_spacing, cw) in;\n"
14193 "layout(location=0) patch in int x;\n"
14194 "out gl_PerVertex { vec4 gl_Position; };\n"
14195 "void main(){\n"
14196 " gl_Position.xyz = gl_TessCoord;\n"
14197 " gl_Position.w = x;\n"
14198 "}\n";
14199 char const *fsSource =
14200 "#version 450\n"
14201 "layout(location=0) out vec4 color;\n"
14202 "void main(){\n"
14203 " color = vec4(1);\n"
14204 "}\n";
14205
14206 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14207 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14208 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14209 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14210
14211 VkPipelineInputAssemblyStateCreateInfo iasci{
14212 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
14213 nullptr,
14214 0,
14215 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
14216 VK_FALSE};
14217
14218 VkPipelineTessellationStateCreateInfo tsci{
14219 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
14220 nullptr,
14221 0,
14222 3};
14223
14224 VkPipelineObj pipe(m_device);
14225 pipe.SetInputAssembly(&iasci);
14226 pipe.SetTessellation(&tsci);
14227 pipe.AddColorAttachment();
14228 pipe.AddShader(&vs);
14229 pipe.AddShader(&tcs);
14230 pipe.AddShader(&tes);
14231 pipe.AddShader(&fs);
14232
14233 VkDescriptorSetObj descriptorSet(m_device);
14234 descriptorSet.AppendDummy();
14235 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14236
14237 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14238
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014239 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014240}
14241
Karl Schultz6addd812016-02-02 17:17:23 -070014242TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014243 TEST_DESCRIPTION("Test that an error is produced for a vertex attribute setup where multiple "
14244 "bindings provide the same location");
Karl Schultz6addd812016-02-02 17:17:23 -070014245 m_errorMonitor->SetDesiredFailureMsg(
14246 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014247 "Duplicate vertex input binding descriptions for binding 0");
14248
Chris Forbes280ba2c2015-06-12 11:16:41 +120014249 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014250 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014251
14252 /* Two binding descriptions for binding 0 */
14253 VkVertexInputBindingDescription input_bindings[2];
14254 memset(input_bindings, 0, sizeof(input_bindings));
14255
14256 VkVertexInputAttributeDescription input_attrib;
14257 memset(&input_attrib, 0, sizeof(input_attrib));
14258 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14259
14260 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014261 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120014262 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070014263 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070014264 "out gl_PerVertex {\n"
14265 " vec4 gl_Position;\n"
14266 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120014267 "void main(){\n"
14268 " gl_Position = vec4(x);\n"
14269 "}\n";
14270 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014271 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120014272 "\n"
14273 "layout(location=0) out vec4 color;\n"
14274 "void main(){\n"
14275 " color = vec4(1);\n"
14276 "}\n";
14277
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014278 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14279 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014280
14281 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014282 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014283 pipe.AddShader(&vs);
14284 pipe.AddShader(&fs);
14285
14286 pipe.AddVertexInputBindings(input_bindings, 2);
14287 pipe.AddVertexInputAttribs(&input_attrib, 1);
14288
Chris Forbes280ba2c2015-06-12 11:16:41 +120014289 VkDescriptorSetObj descriptorSet(m_device);
14290 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014291 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014292
Tony Barbour5781e8f2015-08-04 16:23:11 -060014293 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014294
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014295 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014296}
Chris Forbes8f68b562015-05-25 11:13:32 +120014297
Chris Forbes35efec72016-04-21 14:32:08 +120014298TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014299 TEST_DESCRIPTION("Test that pipeline validation accepts basic use of 64bit vertex "
14300 "attributes. This is interesting because they consume multiple "
14301 "locations.");
Chris Forbes35efec72016-04-21 14:32:08 +120014302 m_errorMonitor->ExpectSuccess();
14303
14304 ASSERT_NO_FATAL_FAILURE(InitState());
14305 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14306
Chris Forbes91cf3a82016-06-28 17:51:35 +120014307 if (!m_device->phy().features().shaderFloat64) {
Chris Forbes35efec72016-04-21 14:32:08 +120014308 printf("Device does not support 64bit vertex attributes; skipped.\n");
14309 return;
14310 }
14311
14312 VkVertexInputBindingDescription input_bindings[1];
14313 memset(input_bindings, 0, sizeof(input_bindings));
14314
14315 VkVertexInputAttributeDescription input_attribs[4];
14316 memset(input_attribs, 0, sizeof(input_attribs));
14317 input_attribs[0].location = 0;
14318 input_attribs[0].offset = 0;
14319 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14320 input_attribs[1].location = 2;
14321 input_attribs[1].offset = 32;
14322 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14323 input_attribs[2].location = 4;
14324 input_attribs[2].offset = 64;
14325 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14326 input_attribs[3].location = 6;
14327 input_attribs[3].offset = 96;
14328 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14329
14330 char const *vsSource =
14331 "#version 450\n"
14332 "\n"
14333 "layout(location=0) in dmat4 x;\n"
14334 "out gl_PerVertex {\n"
14335 " vec4 gl_Position;\n"
14336 "};\n"
14337 "void main(){\n"
14338 " gl_Position = vec4(x[0][0]);\n"
14339 "}\n";
14340 char const *fsSource =
14341 "#version 450\n"
14342 "\n"
14343 "layout(location=0) out vec4 color;\n"
14344 "void main(){\n"
14345 " color = vec4(1);\n"
14346 "}\n";
14347
14348 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14349 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14350
14351 VkPipelineObj pipe(m_device);
14352 pipe.AddColorAttachment();
14353 pipe.AddShader(&vs);
14354 pipe.AddShader(&fs);
14355
14356 pipe.AddVertexInputBindings(input_bindings, 1);
14357 pipe.AddVertexInputAttribs(input_attribs, 4);
14358
14359 VkDescriptorSetObj descriptorSet(m_device);
14360 descriptorSet.AppendDummy();
14361 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14362
14363 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14364
14365 m_errorMonitor->VerifyNotFound();
14366}
14367
Karl Schultz6addd812016-02-02 17:17:23 -070014368TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014369 TEST_DESCRIPTION("Test that an error is produced for a FS which does not "
14370 "provide an output for one of the pipeline's color attachments");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014372 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014373
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014374 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014375
14376 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014377 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014378 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014379 "out gl_PerVertex {\n"
14380 " vec4 gl_Position;\n"
14381 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014382 "void main(){\n"
14383 " gl_Position = vec4(1);\n"
14384 "}\n";
14385 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014386 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014387 "\n"
14388 "void main(){\n"
14389 "}\n";
14390
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014391 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14392 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014393
14394 VkPipelineObj pipe(m_device);
14395 pipe.AddShader(&vs);
14396 pipe.AddShader(&fs);
14397
Chia-I Wu08accc62015-07-07 11:50:03 +080014398 /* set up CB 0, not written */
14399 pipe.AddColorAttachment();
14400 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014401
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014402 VkDescriptorSetObj descriptorSet(m_device);
14403 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014404 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014405
Tony Barbour5781e8f2015-08-04 16:23:11 -060014406 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014407
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014408 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014409}
14410
Karl Schultz6addd812016-02-02 17:17:23 -070014411TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014412 TEST_DESCRIPTION("Test that a warning is produced for a FS which provides a spurious "
14413 "output with no matching attachment");
Karl Schultz6addd812016-02-02 17:17:23 -070014414 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070014415 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014416 "FS writes to output location 1 with no matching attachment");
14417
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014418 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014419
14420 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014421 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014422 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014423 "out gl_PerVertex {\n"
14424 " vec4 gl_Position;\n"
14425 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014426 "void main(){\n"
14427 " gl_Position = vec4(1);\n"
14428 "}\n";
14429 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014430 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014431 "\n"
14432 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -070014433 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014434 "void main(){\n"
14435 " x = vec4(1);\n"
14436 " y = vec4(1);\n"
14437 "}\n";
14438
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014439 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14440 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014441
14442 VkPipelineObj pipe(m_device);
14443 pipe.AddShader(&vs);
14444 pipe.AddShader(&fs);
14445
Chia-I Wu08accc62015-07-07 11:50:03 +080014446 /* set up CB 0, not written */
14447 pipe.AddColorAttachment();
14448 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014449 /* FS writes CB 1, but we don't configure it */
14450
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014451 VkDescriptorSetObj descriptorSet(m_device);
14452 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014453 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014454
Tony Barbour5781e8f2015-08-04 16:23:11 -060014455 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014456
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014457 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014458}
14459
Karl Schultz6addd812016-02-02 17:17:23 -070014460TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014461 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the fundamental "
14462 "type of an FS output variable, and the format of the corresponding attachment");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014464 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014465
Chris Forbesa36d69e2015-05-25 11:13:44 +120014466 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014467
14468 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014469 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120014470 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014471 "out gl_PerVertex {\n"
14472 " vec4 gl_Position;\n"
14473 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120014474 "void main(){\n"
14475 " gl_Position = vec4(1);\n"
14476 "}\n";
14477 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014478 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120014479 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070014480 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +120014481 "void main(){\n"
14482 " x = ivec4(1);\n"
14483 "}\n";
14484
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014485 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14486 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014487
14488 VkPipelineObj pipe(m_device);
14489 pipe.AddShader(&vs);
14490 pipe.AddShader(&fs);
14491
Chia-I Wu08accc62015-07-07 11:50:03 +080014492 /* set up CB 0; type is UNORM by default */
14493 pipe.AddColorAttachment();
14494 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014495
Chris Forbesa36d69e2015-05-25 11:13:44 +120014496 VkDescriptorSetObj descriptorSet(m_device);
14497 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014498 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014499
Tony Barbour5781e8f2015-08-04 16:23:11 -060014500 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014501
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014502 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014503}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014504
Karl Schultz6addd812016-02-02 17:17:23 -070014505TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014506 TEST_DESCRIPTION("Test that an error is produced for a shader consuming a uniform "
14507 "block which has no corresponding binding in the pipeline layout");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014508 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014509 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014510
Chris Forbes556c76c2015-08-14 12:04:59 +120014511 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120014512
14513 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014514 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120014515 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014516 "out gl_PerVertex {\n"
14517 " vec4 gl_Position;\n"
14518 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120014519 "void main(){\n"
14520 " gl_Position = vec4(1);\n"
14521 "}\n";
14522 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014523 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120014524 "\n"
14525 "layout(location=0) out vec4 x;\n"
14526 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
14527 "void main(){\n"
14528 " x = vec4(bar.y);\n"
14529 "}\n";
14530
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014531 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14532 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120014533
Chris Forbes556c76c2015-08-14 12:04:59 +120014534 VkPipelineObj pipe(m_device);
14535 pipe.AddShader(&vs);
14536 pipe.AddShader(&fs);
14537
14538 /* set up CB 0; type is UNORM by default */
14539 pipe.AddColorAttachment();
14540 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14541
14542 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014543 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120014544
14545 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14546
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014547 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120014548}
14549
Chris Forbes5c59e902016-02-26 16:56:09 +130014550TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014551 TEST_DESCRIPTION("Test that an error is produced for a shader consuming push constants "
14552 "which are not provided in the pipeline layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130014553 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14554 "not declared in layout");
14555
14556 ASSERT_NO_FATAL_FAILURE(InitState());
14557
14558 char const *vsSource =
14559 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130014560 "\n"
14561 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14562 "out gl_PerVertex {\n"
14563 " vec4 gl_Position;\n"
14564 "};\n"
14565 "void main(){\n"
14566 " gl_Position = vec4(consts.x);\n"
14567 "}\n";
14568 char const *fsSource =
14569 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130014570 "\n"
14571 "layout(location=0) out vec4 x;\n"
14572 "void main(){\n"
14573 " x = vec4(1);\n"
14574 "}\n";
14575
14576 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14577 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14578
14579 VkPipelineObj pipe(m_device);
14580 pipe.AddShader(&vs);
14581 pipe.AddShader(&fs);
14582
14583 /* set up CB 0; type is UNORM by default */
14584 pipe.AddColorAttachment();
14585 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14586
14587 VkDescriptorSetObj descriptorSet(m_device);
14588 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14589
14590 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14591
14592 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014593 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130014594}
14595
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014596TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014597 TEST_DESCRIPTION("Test that an error is produced for a compute pipeline consuming a "
14598 "descriptor which is not provided in the pipeline layout");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014599 m_errorMonitor->SetDesiredFailureMsg(
14600 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14601 "Shader uses descriptor slot 0.0");
14602
14603 ASSERT_NO_FATAL_FAILURE(InitState());
14604
14605 char const *csSource =
14606 "#version 450\n"
14607 "\n"
14608 "layout(local_size_x=1) in;\n"
14609 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14610 "void main(){\n"
14611 " x = vec4(1);\n"
14612 "}\n";
14613
14614 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14615
14616 VkDescriptorSetObj descriptorSet(m_device);
14617 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14618
14619 VkComputePipelineCreateInfo cpci = {
14620 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14621 nullptr, 0, {
14622 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14623 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14624 cs.handle(), "main", nullptr
14625 },
14626 descriptorSet.GetPipelineLayout(),
14627 VK_NULL_HANDLE, -1
14628 };
14629
14630 VkPipeline pipe;
14631 VkResult err = vkCreateComputePipelines(
14632 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14633
14634 m_errorMonitor->VerifyFound();
14635
14636 if (err == VK_SUCCESS) {
14637 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14638 }
14639}
14640
14641TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014642 TEST_DESCRIPTION("Test that pipeline validation accepts a compute pipeline which declares a "
14643 "descriptor-backed resource which is not provided, but the shader does not "
14644 "statically use it. This is interesting because it requires compute pipelines "
14645 "to have a proper descriptor use walk, which they didn't for some time.");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014646 m_errorMonitor->ExpectSuccess();
14647
14648 ASSERT_NO_FATAL_FAILURE(InitState());
14649
14650 char const *csSource =
14651 "#version 450\n"
14652 "\n"
14653 "layout(local_size_x=1) in;\n"
14654 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14655 "void main(){\n"
14656 " // x is not used.\n"
14657 "}\n";
14658
14659 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14660
14661 VkDescriptorSetObj descriptorSet(m_device);
14662 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14663
14664 VkComputePipelineCreateInfo cpci = {
14665 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14666 nullptr, 0, {
14667 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14668 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14669 cs.handle(), "main", nullptr
14670 },
14671 descriptorSet.GetPipelineLayout(),
14672 VK_NULL_HANDLE, -1
14673 };
14674
14675 VkPipeline pipe;
14676 VkResult err = vkCreateComputePipelines(
14677 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14678
14679 m_errorMonitor->VerifyNotFound();
14680
14681 if (err == VK_SUCCESS) {
14682 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14683 }
14684}
14685
Chris Forbes22a9b092016-07-19 14:34:05 +120014686TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014687 TEST_DESCRIPTION("Test that an error is produced for a pipeline consuming a "
14688 "descriptor-backed resource of a mismatched type");
Chris Forbes22a9b092016-07-19 14:34:05 +120014689 m_errorMonitor->SetDesiredFailureMsg(
14690 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14691 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
14692
14693 ASSERT_NO_FATAL_FAILURE(InitState());
14694
14695 VkDescriptorSetLayoutBinding binding = {
14696 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14697 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14698 };
14699 VkDescriptorSetLayoutCreateInfo dslci = {
14700 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14701 0, 1, &binding
14702 };
14703 VkDescriptorSetLayout dsl;
14704 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14705 nullptr, &dsl);
14706 ASSERT_VK_SUCCESS(err);
14707
14708 VkPipelineLayoutCreateInfo plci = {
14709 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14710 0, 1, &dsl, 0, nullptr
14711 };
14712 VkPipelineLayout pl;
14713 err = vkCreatePipelineLayout(m_device->device(), &plci,
14714 nullptr, &pl);
14715 ASSERT_VK_SUCCESS(err);
14716
14717 char const *csSource =
14718 "#version 450\n"
14719 "\n"
14720 "layout(local_size_x=1) in;\n"
14721 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14722 "void main() {\n"
14723 " x.x = 1.0f;\n"
14724 "}\n";
14725 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14726
14727 VkComputePipelineCreateInfo cpci = {
14728 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14729 0, {
14730 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14731 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14732 cs.handle(), "main", nullptr
14733 },
14734 pl, VK_NULL_HANDLE, -1
14735 };
14736
14737 VkPipeline pipe;
14738 err = vkCreateComputePipelines(
14739 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14740
14741 m_errorMonitor->VerifyFound();
14742
14743 if (err == VK_SUCCESS) {
14744 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14745 }
14746
14747 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14748 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14749}
14750
Chris Forbese10a51f2016-07-19 14:42:51 +120014751TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014752 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
14753 "sampler portion of a combined image + sampler");
Chris Forbese10a51f2016-07-19 14:42:51 +120014754 m_errorMonitor->ExpectSuccess();
14755
14756 ASSERT_NO_FATAL_FAILURE(InitState());
14757
14758 VkDescriptorSetLayoutBinding bindings[] = {
14759 {
14760 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14761 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14762 },
14763 {
14764 1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
14765 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14766 },
14767 {
14768 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
14769 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14770 },
14771 };
14772 VkDescriptorSetLayoutCreateInfo dslci = {
14773 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14774 0, 3, bindings
14775 };
14776 VkDescriptorSetLayout dsl;
14777 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14778 nullptr, &dsl);
14779 ASSERT_VK_SUCCESS(err);
14780
14781 VkPipelineLayoutCreateInfo plci = {
14782 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14783 0, 1, &dsl, 0, nullptr
14784 };
14785 VkPipelineLayout pl;
14786 err = vkCreatePipelineLayout(m_device->device(), &plci,
14787 nullptr, &pl);
14788 ASSERT_VK_SUCCESS(err);
14789
14790 char const *csSource =
14791 "#version 450\n"
14792 "\n"
14793 "layout(local_size_x=1) in;\n"
14794 "layout(set=0, binding=0) uniform sampler s;\n"
14795 "layout(set=0, binding=1) uniform texture2D t;\n"
14796 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
14797 "void main() {\n"
14798 " x = texture(sampler2D(t, s), vec2(0));\n"
14799 "}\n";
14800 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14801
14802 VkComputePipelineCreateInfo cpci = {
14803 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14804 0, {
14805 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14806 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14807 cs.handle(), "main", nullptr
14808 },
14809 pl, VK_NULL_HANDLE, -1
14810 };
14811
14812 VkPipeline pipe;
14813 err = vkCreateComputePipelines(
14814 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14815
14816 m_errorMonitor->VerifyNotFound();
14817
14818 if (err == VK_SUCCESS) {
14819 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14820 }
14821
14822 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14823 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14824}
14825
Chris Forbes91c3b2a2016-07-19 14:46:38 +120014826TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014827 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
14828 "image portion of a combined image + sampler");
Chris Forbes91c3b2a2016-07-19 14:46:38 +120014829 m_errorMonitor->ExpectSuccess();
14830
14831 ASSERT_NO_FATAL_FAILURE(InitState());
14832
14833 VkDescriptorSetLayoutBinding bindings[] = {
14834 {
14835 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14836 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14837 },
14838 {
14839 1, VK_DESCRIPTOR_TYPE_SAMPLER,
14840 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14841 },
14842 {
14843 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
14844 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14845 },
14846 };
14847 VkDescriptorSetLayoutCreateInfo dslci = {
14848 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14849 0, 3, bindings
14850 };
14851 VkDescriptorSetLayout dsl;
14852 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14853 nullptr, &dsl);
14854 ASSERT_VK_SUCCESS(err);
14855
14856 VkPipelineLayoutCreateInfo plci = {
14857 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14858 0, 1, &dsl, 0, nullptr
14859 };
14860 VkPipelineLayout pl;
14861 err = vkCreatePipelineLayout(m_device->device(), &plci,
14862 nullptr, &pl);
14863 ASSERT_VK_SUCCESS(err);
14864
14865 char const *csSource =
14866 "#version 450\n"
14867 "\n"
14868 "layout(local_size_x=1) in;\n"
14869 "layout(set=0, binding=0) uniform texture2D t;\n"
14870 "layout(set=0, binding=1) uniform sampler s;\n"
14871 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
14872 "void main() {\n"
14873 " x = texture(sampler2D(t, s), vec2(0));\n"
14874 "}\n";
14875 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14876
14877 VkComputePipelineCreateInfo cpci = {
14878 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14879 0, {
14880 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14881 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14882 cs.handle(), "main", nullptr
14883 },
14884 pl, VK_NULL_HANDLE, -1
14885 };
14886
14887 VkPipeline pipe;
14888 err = vkCreateComputePipelines(
14889 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14890
14891 m_errorMonitor->VerifyNotFound();
14892
14893 if (err == VK_SUCCESS) {
14894 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14895 }
14896
14897 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14898 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14899}
14900
Chris Forbes6a4991a2016-07-19 15:07:32 +120014901TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014902 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming "
14903 "both the sampler and the image of a combined image+sampler "
14904 "but via separate variables");
Chris Forbes6a4991a2016-07-19 15:07:32 +120014905 m_errorMonitor->ExpectSuccess();
14906
14907 ASSERT_NO_FATAL_FAILURE(InitState());
14908
14909 VkDescriptorSetLayoutBinding bindings[] = {
14910 {
14911 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14912 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14913 },
14914 {
14915 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
14916 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14917 },
14918 };
14919 VkDescriptorSetLayoutCreateInfo dslci = {
14920 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14921 0, 2, bindings
14922 };
14923 VkDescriptorSetLayout dsl;
14924 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14925 nullptr, &dsl);
14926 ASSERT_VK_SUCCESS(err);
14927
14928 VkPipelineLayoutCreateInfo plci = {
14929 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14930 0, 1, &dsl, 0, nullptr
14931 };
14932 VkPipelineLayout pl;
14933 err = vkCreatePipelineLayout(m_device->device(), &plci,
14934 nullptr, &pl);
14935 ASSERT_VK_SUCCESS(err);
14936
14937 char const *csSource =
14938 "#version 450\n"
14939 "\n"
14940 "layout(local_size_x=1) in;\n"
14941 "layout(set=0, binding=0) uniform texture2D t;\n"
14942 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
14943 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
14944 "void main() {\n"
14945 " x = texture(sampler2D(t, s), vec2(0));\n"
14946 "}\n";
14947 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14948
14949 VkComputePipelineCreateInfo cpci = {
14950 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14951 0, {
14952 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14953 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14954 cs.handle(), "main", nullptr
14955 },
14956 pl, VK_NULL_HANDLE, -1
14957 };
14958
14959 VkPipeline pipe;
14960 err = vkCreateComputePipelines(
14961 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14962
14963 m_errorMonitor->VerifyNotFound();
14964
14965 if (err == VK_SUCCESS) {
14966 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14967 }
14968
14969 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14970 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14971}
14972
Chris Forbes50020592016-07-27 13:52:41 +120014973TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
14974 TEST_DESCRIPTION("Test that an error is produced when an image view type "
14975 "does not match the dimensionality declared in the shader");
14976
14977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14978 "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
14979
14980 ASSERT_NO_FATAL_FAILURE(InitState());
14981 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14982
14983 char const *vsSource =
14984 "#version 450\n"
14985 "\n"
14986 "out gl_PerVertex { vec4 gl_Position; };\n"
14987 "void main() { gl_Position = vec4(0); }\n";
14988 char const *fsSource =
14989 "#version 450\n"
14990 "\n"
14991 "layout(set=0, binding=0) uniform sampler3D s;\n"
14992 "layout(location=0) out vec4 color;\n"
14993 "void main() {\n"
14994 " color = texture(s, vec3(0));\n"
14995 "}\n";
14996 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14997 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14998
14999 VkPipelineObj pipe(m_device);
15000 pipe.AddShader(&vs);
15001 pipe.AddShader(&fs);
15002 pipe.AddColorAttachment();
15003
15004 VkTextureObj texture(m_device, nullptr);
15005 VkSamplerObj sampler(m_device);
15006
15007 VkDescriptorSetObj descriptorSet(m_device);
15008 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15009 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15010
15011 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15012 ASSERT_VK_SUCCESS(err);
15013
15014 BeginCommandBuffer();
15015
15016 m_commandBuffer->BindPipeline(pipe);
15017 m_commandBuffer->BindDescriptorSet(descriptorSet);
15018
15019 VkViewport viewport = { 0, 0, 16, 16, 0, 1 };
15020 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
15021 VkRect2D scissor = { { 0, 0 }, { 16, 16 } };
15022 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15023
15024 // error produced here.
15025 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15026
15027 m_errorMonitor->VerifyFound();
15028
15029 EndCommandBuffer();
15030}
15031
Chris Forbes5533bfc2016-07-27 14:12:34 +120015032TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
15033 TEST_DESCRIPTION("Test that an error is produced when a multisampled images "
15034 "are consumed via singlesample images types in the shader, or vice versa.");
15035
15036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15037 "requires bound image to have multiple samples");
15038
15039 ASSERT_NO_FATAL_FAILURE(InitState());
15040 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15041
15042 char const *vsSource =
15043 "#version 450\n"
15044 "\n"
15045 "out gl_PerVertex { vec4 gl_Position; };\n"
15046 "void main() { gl_Position = vec4(0); }\n";
15047 char const *fsSource =
15048 "#version 450\n"
15049 "\n"
15050 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15051 "layout(location=0) out vec4 color;\n"
15052 "void main() {\n"
15053 " color = texelFetch(s, ivec2(0), 0);\n"
15054 "}\n";
15055 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15056 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15057
15058 VkPipelineObj pipe(m_device);
15059 pipe.AddShader(&vs);
15060 pipe.AddShader(&fs);
15061 pipe.AddColorAttachment();
15062
15063 VkTextureObj texture(m_device, nullptr);
15064 VkSamplerObj sampler(m_device);
15065
15066 VkDescriptorSetObj descriptorSet(m_device);
15067 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15068 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15069
15070 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15071 ASSERT_VK_SUCCESS(err);
15072
15073 BeginCommandBuffer();
15074
15075 m_commandBuffer->BindPipeline(pipe);
15076 m_commandBuffer->BindDescriptorSet(descriptorSet);
15077
15078 VkViewport viewport = { 0, 0, 16, 16, 0, 1 };
15079 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
15080 VkRect2D scissor = { { 0, 0 }, { 16, 16 } };
15081 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15082
15083 // error produced here.
15084 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15085
15086 m_errorMonitor->VerifyFound();
15087
15088 EndCommandBuffer();
15089}
15090
Mark Lobodzinski209b5292015-09-17 09:44:05 -060015091#endif // SHADER_CHECKER_TESTS
15092
15093#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060015094TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -070015095 m_errorMonitor->SetDesiredFailureMsg(
15096 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015097 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015098
15099 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015100
15101 // Create an image
15102 VkImage image;
15103
Karl Schultz6addd812016-02-02 17:17:23 -070015104 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15105 const int32_t tex_width = 32;
15106 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015107
15108 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015109 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15110 image_create_info.pNext = NULL;
15111 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15112 image_create_info.format = tex_format;
15113 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015114 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070015115 image_create_info.extent.depth = 1;
15116 image_create_info.mipLevels = 1;
15117 image_create_info.arrayLayers = 1;
15118 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15119 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15120 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15121 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015122
15123 // Introduce error by sending down a bogus width extent
15124 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080015125 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015126
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015127 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015128}
15129
Mark Youngc48c4c12016-04-11 14:26:49 -060015130TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
15131 m_errorMonitor->SetDesiredFailureMsg(
15132 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15133 "CreateImage extents is 0 for at least one required dimension");
15134
15135 ASSERT_NO_FATAL_FAILURE(InitState());
15136
15137 // Create an image
15138 VkImage image;
15139
15140 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15141 const int32_t tex_width = 32;
15142 const int32_t tex_height = 32;
15143
15144 VkImageCreateInfo image_create_info = {};
15145 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15146 image_create_info.pNext = NULL;
15147 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15148 image_create_info.format = tex_format;
15149 image_create_info.extent.width = tex_width;
15150 image_create_info.extent.height = tex_height;
15151 image_create_info.extent.depth = 1;
15152 image_create_info.mipLevels = 1;
15153 image_create_info.arrayLayers = 1;
15154 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15155 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15156 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15157 image_create_info.flags = 0;
15158
15159 // Introduce error by sending down a bogus width extent
15160 image_create_info.extent.width = 0;
15161 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15162
15163 m_errorMonitor->VerifyFound();
15164}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060015165#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120015166
Tobin Ehliscde08892015-09-22 10:11:37 -060015167#if IMAGE_TESTS
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015168TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
15169 TEST_DESCRIPTION("Create a render pass with an attachment description "
15170 "format set to VK_FORMAT_UNDEFINED");
15171
15172 ASSERT_NO_FATAL_FAILURE(InitState());
15173 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15174
15175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15176 "format is VK_FORMAT_UNDEFINED");
15177
15178 VkAttachmentReference color_attach = {};
15179 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15180 color_attach.attachment = 0;
15181 VkSubpassDescription subpass = {};
15182 subpass.colorAttachmentCount = 1;
15183 subpass.pColorAttachments = &color_attach;
15184
15185 VkRenderPassCreateInfo rpci = {};
15186 rpci.subpassCount = 1;
15187 rpci.pSubpasses = &subpass;
15188 rpci.attachmentCount = 1;
15189 VkAttachmentDescription attach_desc = {};
15190 attach_desc.format = VK_FORMAT_UNDEFINED;
15191 rpci.pAttachments = &attach_desc;
15192 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15193 VkRenderPass rp;
15194 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15195
15196 m_errorMonitor->VerifyFound();
15197
15198 if (result == VK_SUCCESS) {
15199 vkDestroyRenderPass(m_device->device(), rp, NULL);
15200 }
15201}
15202
Karl Schultz6addd812016-02-02 17:17:23 -070015203TEST_F(VkLayerTest, InvalidImageView) {
15204 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060015205
Karl Schultz6addd812016-02-02 17:17:23 -070015206 m_errorMonitor->SetDesiredFailureMsg(
15207 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015208 "vkCreateImageView called with baseMipLevel 10 ");
15209
Tobin Ehliscde08892015-09-22 10:11:37 -060015210 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060015211
Mike Stroyana3082432015-09-25 13:39:21 -060015212 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015213 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060015214
Karl Schultz6addd812016-02-02 17:17:23 -070015215 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15216 const int32_t tex_width = 32;
15217 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015218
15219 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015220 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15221 image_create_info.pNext = NULL;
15222 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15223 image_create_info.format = tex_format;
15224 image_create_info.extent.width = tex_width;
15225 image_create_info.extent.height = tex_height;
15226 image_create_info.extent.depth = 1;
15227 image_create_info.mipLevels = 1;
15228 image_create_info.arrayLayers = 1;
15229 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15230 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15231 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15232 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015233
Chia-I Wuf7458c52015-10-26 21:10:41 +080015234 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015235 ASSERT_VK_SUCCESS(err);
15236
15237 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015238 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15239 image_view_create_info.image = image;
15240 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15241 image_view_create_info.format = tex_format;
15242 image_view_create_info.subresourceRange.layerCount = 1;
15243 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
15244 image_view_create_info.subresourceRange.levelCount = 1;
15245 image_view_create_info.subresourceRange.aspectMask =
15246 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015247
15248 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070015249 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
15250 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060015251
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015252 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060015253 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015254}
Mike Stroyana3082432015-09-25 13:39:21 -060015255
Mark Youngd339ba32016-05-30 13:28:35 -060015256TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15257 VkResult err;
15258
15259 m_errorMonitor->SetDesiredFailureMsg(
15260 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -060015261 "used without first calling vkBindImageMemory");
Mark Youngd339ba32016-05-30 13:28:35 -060015262
15263 ASSERT_NO_FATAL_FAILURE(InitState());
15264
15265 // Create an image and try to create a view with no memory backing the image
15266 VkImage image;
15267
15268 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15269 const int32_t tex_width = 32;
15270 const int32_t tex_height = 32;
15271
15272 VkImageCreateInfo image_create_info = {};
15273 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15274 image_create_info.pNext = NULL;
15275 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15276 image_create_info.format = tex_format;
15277 image_create_info.extent.width = tex_width;
15278 image_create_info.extent.height = tex_height;
15279 image_create_info.extent.depth = 1;
15280 image_create_info.mipLevels = 1;
15281 image_create_info.arrayLayers = 1;
15282 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15283 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15284 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15285 image_create_info.flags = 0;
15286
15287 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15288 ASSERT_VK_SUCCESS(err);
15289
15290 VkImageViewCreateInfo image_view_create_info = {};
15291 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15292 image_view_create_info.image = image;
15293 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15294 image_view_create_info.format = tex_format;
15295 image_view_create_info.subresourceRange.layerCount = 1;
15296 image_view_create_info.subresourceRange.baseMipLevel = 0;
15297 image_view_create_info.subresourceRange.levelCount = 1;
15298 image_view_create_info.subresourceRange.aspectMask =
15299 VK_IMAGE_ASPECT_COLOR_BIT;
15300
15301 VkImageView view;
15302 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
15303 &view);
15304
15305 m_errorMonitor->VerifyFound();
15306 vkDestroyImage(m_device->device(), image, NULL);
15307 // If last error is success, it still created the view, so delete it.
15308 if (err == VK_SUCCESS) {
15309 vkDestroyImageView(m_device->device(), view, NULL);
15310 }
15311
15312}
15313
Karl Schultz6addd812016-02-02 17:17:23 -070015314TEST_F(VkLayerTest, InvalidImageViewAspect) {
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015315 TEST_DESCRIPTION(
15316 "Create an image and try to create a view with an invalid aspectMask");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070015317 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070015318 "vkCreateImageView: Color image "
15319 "formats must have ONLY the "
15320 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015321
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015322 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015323
Karl Schultz6addd812016-02-02 17:17:23 -070015324 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015325 VkImageObj image(m_device);
15326 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT,
15327 VK_IMAGE_TILING_LINEAR, 0);
15328 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015329
15330 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015331 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015332 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015333 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15334 image_view_create_info.format = tex_format;
15335 image_view_create_info.subresourceRange.baseMipLevel = 0;
15336 image_view_create_info.subresourceRange.levelCount = 1;
15337 // Cause an error by setting an invalid image aspect
15338 image_view_create_info.subresourceRange.aspectMask =
15339 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015340
15341 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015342 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015343
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015344 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015345}
15346
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015347TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015348 VkResult err;
15349 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015350
Karl Schultz6addd812016-02-02 17:17:23 -070015351 m_errorMonitor->SetDesiredFailureMsg(
15352 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015353 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015354
Mike Stroyana3082432015-09-25 13:39:21 -060015355 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015356
15357 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015358 VkImage srcImage;
15359 VkImage dstImage;
15360 VkDeviceMemory srcMem;
15361 VkDeviceMemory destMem;
15362 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015363
15364 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015365 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15366 image_create_info.pNext = NULL;
15367 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15368 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15369 image_create_info.extent.width = 32;
15370 image_create_info.extent.height = 32;
15371 image_create_info.extent.depth = 1;
15372 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015373 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015374 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15375 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15376 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15377 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015378
Karl Schultz6addd812016-02-02 17:17:23 -070015379 err =
15380 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015381 ASSERT_VK_SUCCESS(err);
15382
Karl Schultz6addd812016-02-02 17:17:23 -070015383 err =
15384 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015385 ASSERT_VK_SUCCESS(err);
15386
15387 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015388 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015389 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15390 memAlloc.pNext = NULL;
15391 memAlloc.allocationSize = 0;
15392 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015393
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015394 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015395 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015396 pass =
15397 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015398 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015399 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015400 ASSERT_VK_SUCCESS(err);
15401
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015402 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015403 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015404 pass =
15405 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015406 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015407 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015408 ASSERT_VK_SUCCESS(err);
15409
15410 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15411 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015412 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015413 ASSERT_VK_SUCCESS(err);
15414
15415 BeginCommandBuffer();
15416 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015417 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015418 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015419 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015420 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015421 copyRegion.srcOffset.x = 0;
15422 copyRegion.srcOffset.y = 0;
15423 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015424 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015425 copyRegion.dstSubresource.mipLevel = 0;
15426 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015427 // Introduce failure by forcing the dst layerCount to differ from src
15428 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015429 copyRegion.dstOffset.x = 0;
15430 copyRegion.dstOffset.y = 0;
15431 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015432 copyRegion.extent.width = 1;
15433 copyRegion.extent.height = 1;
15434 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015435 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15436 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015437 EndCommandBuffer();
15438
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015439 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015440
Chia-I Wuf7458c52015-10-26 21:10:41 +080015441 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015442 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015443 vkFreeMemory(m_device->device(), srcMem, NULL);
15444 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015445}
15446
Tony Barbourd6673642016-05-05 14:46:39 -060015447TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
15448
15449 TEST_DESCRIPTION("Creating images with unsuported formats ");
15450
15451 ASSERT_NO_FATAL_FAILURE(InitState());
15452 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15453 VkImageObj image(m_device);
15454 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
15455 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
15456 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15457 VK_IMAGE_TILING_OPTIMAL, 0);
15458 ASSERT_TRUE(image.initialized());
15459
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015460 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
15461 VkImageCreateInfo image_create_info;
15462 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15463 image_create_info.pNext = NULL;
15464 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15465 image_create_info.format = VK_FORMAT_UNDEFINED;
15466 image_create_info.extent.width = 32;
15467 image_create_info.extent.height = 32;
15468 image_create_info.extent.depth = 1;
15469 image_create_info.mipLevels = 1;
15470 image_create_info.arrayLayers = 1;
15471 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15472 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15473 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15474 image_create_info.flags = 0;
15475
15476 m_errorMonitor->SetDesiredFailureMsg(
15477 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15478 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
15479
15480 VkImage localImage;
15481 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
15482 m_errorMonitor->VerifyFound();
15483
Tony Barbourd6673642016-05-05 14:46:39 -060015484 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015485 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060015486 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15487 VkFormat format = static_cast<VkFormat>(f);
15488 VkFormatProperties fProps = m_device->format_properties(format);
15489 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
15490 fProps.optimalTilingFeatures == 0) {
15491 unsupported = format;
15492 break;
15493 }
15494 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015495
Tony Barbourd6673642016-05-05 14:46:39 -060015496 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015497 image_create_info.format = unsupported;
Tony Barbourd6673642016-05-05 14:46:39 -060015498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015499 "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015500
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015501 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060015502 m_errorMonitor->VerifyFound();
15503 }
15504}
15505
15506TEST_F(VkLayerTest, ImageLayerViewTests) {
15507 VkResult ret;
15508 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15509
15510 ASSERT_NO_FATAL_FAILURE(InitState());
15511
15512 VkImageObj image(m_device);
15513 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
15514 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
15515 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15516 VK_IMAGE_TILING_OPTIMAL, 0);
15517 ASSERT_TRUE(image.initialized());
15518
15519 VkImageView imgView;
15520 VkImageViewCreateInfo imgViewInfo = {};
15521 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15522 imgViewInfo.image = image.handle();
15523 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15524 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15525 imgViewInfo.subresourceRange.layerCount = 1;
15526 imgViewInfo.subresourceRange.baseMipLevel = 0;
15527 imgViewInfo.subresourceRange.levelCount = 1;
15528 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15529
15530 m_errorMonitor->SetDesiredFailureMsg(
15531 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15532 "vkCreateImageView called with baseMipLevel");
15533 // View can't have baseMipLevel >= image's mipLevels - Expect
15534 // VIEW_CREATE_ERROR
15535 imgViewInfo.subresourceRange.baseMipLevel = 1;
15536 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15537 m_errorMonitor->VerifyFound();
15538 imgViewInfo.subresourceRange.baseMipLevel = 0;
15539
15540 m_errorMonitor->SetDesiredFailureMsg(
15541 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15542 "vkCreateImageView called with baseArrayLayer");
15543 // View can't have baseArrayLayer >= image's arraySize - Expect
15544 // VIEW_CREATE_ERROR
15545 imgViewInfo.subresourceRange.baseArrayLayer = 1;
15546 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15547 m_errorMonitor->VerifyFound();
15548 imgViewInfo.subresourceRange.baseArrayLayer = 0;
15549
15550 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15551 "vkCreateImageView called with 0 in "
15552 "pCreateInfo->subresourceRange."
15553 "levelCount");
15554 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
15555 imgViewInfo.subresourceRange.levelCount = 0;
15556 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15557 m_errorMonitor->VerifyFound();
15558 imgViewInfo.subresourceRange.levelCount = 1;
15559
15560 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15561 "vkCreateImageView called with 0 in "
15562 "pCreateInfo->subresourceRange."
15563 "layerCount");
15564 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
15565 imgViewInfo.subresourceRange.layerCount = 0;
15566 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15567 m_errorMonitor->VerifyFound();
15568 imgViewInfo.subresourceRange.layerCount = 1;
15569
15570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15571 "but both must be color formats");
15572 // Can't use depth format for view into color image - Expect INVALID_FORMAT
15573 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
15574 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15575 m_errorMonitor->VerifyFound();
15576 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15577
15578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15579 "Formats MUST be IDENTICAL unless "
15580 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
15581 "was set on image creation.");
15582 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
15583 // VIEW_CREATE_ERROR
15584 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
15585 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15586 m_errorMonitor->VerifyFound();
15587 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15588
15589 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15590 "can support ImageViews with "
15591 "differing formats but they must be "
15592 "in the same compatibility class.");
15593 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
15594 // VIEW_CREATE_ERROR
15595 VkImageCreateInfo mutImgInfo = image.create_info();
15596 VkImage mutImage;
15597 mutImgInfo.format = VK_FORMAT_R8_UINT;
15598 assert(
15599 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
15600 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
15601 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
15602 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15603 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
15604 ASSERT_VK_SUCCESS(ret);
15605 imgViewInfo.image = mutImage;
15606 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15607 m_errorMonitor->VerifyFound();
15608 imgViewInfo.image = image.handle();
15609 vkDestroyImage(m_device->handle(), mutImage, NULL);
15610}
15611
15612TEST_F(VkLayerTest, MiscImageLayerTests) {
15613
15614 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
15615
15616 ASSERT_NO_FATAL_FAILURE(InitState());
15617
15618 VkImageObj image(m_device);
15619 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
15620 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
15621 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15622 VK_IMAGE_TILING_OPTIMAL, 0);
15623 ASSERT_TRUE(image.initialized());
15624
15625 m_errorMonitor->SetDesiredFailureMsg(
15626 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15627 "number of layers in image subresource is zero");
15628 vk_testing::Buffer buffer;
15629 VkMemoryPropertyFlags reqs = 0;
15630 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
15631 VkBufferImageCopy region = {};
15632 region.bufferRowLength = 128;
15633 region.bufferImageHeight = 128;
15634 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15635 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
15636 region.imageSubresource.layerCount = 0;
15637 region.imageExtent.height = 4;
15638 region.imageExtent.width = 4;
15639 region.imageExtent.depth = 1;
15640 m_commandBuffer->BeginCommandBuffer();
15641 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
15642 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
15643 1, &region);
15644 m_errorMonitor->VerifyFound();
15645 region.imageSubresource.layerCount = 1;
15646
15647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15648 "aspectMasks for each region must "
15649 "specify only COLOR or DEPTH or "
15650 "STENCIL");
15651 // Expect MISMATCHED_IMAGE_ASPECT
15652 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
15653 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
15654 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
15655 1, &region);
15656 m_errorMonitor->VerifyFound();
15657 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15658
15659 m_errorMonitor->SetDesiredFailureMsg(
15660 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15661 "If the format of srcImage is a depth, stencil, depth stencil or "
15662 "integer-based format then filter must be VK_FILTER_NEAREST");
15663 // Expect INVALID_FILTER
15664 VkImageObj intImage1(m_device);
15665 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
15666 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
15667 0);
15668 VkImageObj intImage2(m_device);
15669 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
15670 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
15671 0);
15672 VkImageBlit blitRegion = {};
15673 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15674 blitRegion.srcSubresource.baseArrayLayer = 0;
15675 blitRegion.srcSubresource.layerCount = 1;
15676 blitRegion.srcSubresource.mipLevel = 0;
15677 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15678 blitRegion.dstSubresource.baseArrayLayer = 0;
15679 blitRegion.dstSubresource.layerCount = 1;
15680 blitRegion.dstSubresource.mipLevel = 0;
15681
15682 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
15683 intImage1.layout(), intImage2.handle(), intImage2.layout(),
15684 16, &blitRegion, VK_FILTER_LINEAR);
15685 m_errorMonitor->VerifyFound();
15686
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060015687 // Look for NULL-blit warning
15688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
15689 "Offsets specify a zero-volume area.");
15690 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
15691 intImage1.layout(), intImage2.handle(), intImage2.layout(),
15692 1, &blitRegion, VK_FILTER_LINEAR);
15693 m_errorMonitor->VerifyFound();
15694
Tony Barbourd6673642016-05-05 14:46:39 -060015695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15696 "called with 0 in ppMemoryBarriers");
15697 VkImageMemoryBarrier img_barrier;
15698 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
15699 img_barrier.pNext = NULL;
15700 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
15701 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
15702 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15703 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15704 img_barrier.image = image.handle();
15705 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15706 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15707 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15708 img_barrier.subresourceRange.baseArrayLayer = 0;
15709 img_barrier.subresourceRange.baseMipLevel = 0;
15710 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
15711 img_barrier.subresourceRange.layerCount = 0;
15712 img_barrier.subresourceRange.levelCount = 1;
15713 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
15714 VK_PIPELINE_STAGE_HOST_BIT,
15715 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
15716 nullptr, 1, &img_barrier);
15717 m_errorMonitor->VerifyFound();
15718 img_barrier.subresourceRange.layerCount = 1;
15719}
15720
15721TEST_F(VkLayerTest, ImageFormatLimits) {
15722
15723 TEST_DESCRIPTION("Exceed the limits of image format ");
15724
15725 m_errorMonitor->SetDesiredFailureMsg(
15726 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15727 "CreateImage extents exceed allowable limits for format");
15728 VkImageCreateInfo image_create_info = {};
15729 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15730 image_create_info.pNext = NULL;
15731 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15732 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15733 image_create_info.extent.width = 32;
15734 image_create_info.extent.height = 32;
15735 image_create_info.extent.depth = 1;
15736 image_create_info.mipLevels = 1;
15737 image_create_info.arrayLayers = 1;
15738 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15739 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15740 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15741 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15742 image_create_info.flags = 0;
15743
15744 VkImage nullImg;
15745 VkImageFormatProperties imgFmtProps;
15746 vkGetPhysicalDeviceImageFormatProperties(
15747 gpu(), image_create_info.format, image_create_info.imageType,
15748 image_create_info.tiling, image_create_info.usage,
15749 image_create_info.flags, &imgFmtProps);
15750 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
15751 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15752 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15753 m_errorMonitor->VerifyFound();
15754 image_create_info.extent.depth = 1;
15755
15756 m_errorMonitor->SetDesiredFailureMsg(
15757 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15758 "exceeds allowable maximum supported by format of");
15759 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
15760 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15761 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15762 m_errorMonitor->VerifyFound();
15763 image_create_info.mipLevels = 1;
15764
15765 m_errorMonitor->SetDesiredFailureMsg(
15766 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15767 "exceeds allowable maximum supported by format of");
15768 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
15769 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15770 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15771 m_errorMonitor->VerifyFound();
15772 image_create_info.arrayLayers = 1;
15773
15774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15775 "is not supported by format");
15776 int samples = imgFmtProps.sampleCounts >> 1;
15777 image_create_info.samples = (VkSampleCountFlagBits)samples;
15778 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15779 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15780 m_errorMonitor->VerifyFound();
15781 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15782
15783 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15784 "pCreateInfo->initialLayout, must be "
15785 "VK_IMAGE_LAYOUT_UNDEFINED or "
15786 "VK_IMAGE_LAYOUT_PREINITIALIZED");
15787 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15788 // Expect INVALID_LAYOUT
15789 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15790 m_errorMonitor->VerifyFound();
15791 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15792}
15793
Karl Schultz6addd812016-02-02 17:17:23 -070015794TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060015795 VkResult err;
15796 bool pass;
15797
15798 // Create color images with different format sizes and try to copy between them
15799 m_errorMonitor->SetDesiredFailureMsg(
15800 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15801 "vkCmdCopyImage called with unmatched source and dest image format sizes");
15802
15803 ASSERT_NO_FATAL_FAILURE(InitState());
15804
15805 // Create two images of different types and try to copy between them
15806 VkImage srcImage;
15807 VkImage dstImage;
15808 VkDeviceMemory srcMem;
15809 VkDeviceMemory destMem;
15810 VkMemoryRequirements memReqs;
15811
15812 VkImageCreateInfo image_create_info = {};
15813 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15814 image_create_info.pNext = NULL;
15815 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15816 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15817 image_create_info.extent.width = 32;
15818 image_create_info.extent.height = 32;
15819 image_create_info.extent.depth = 1;
15820 image_create_info.mipLevels = 1;
15821 image_create_info.arrayLayers = 1;
15822 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15823 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15824 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15825 image_create_info.flags = 0;
15826
15827 err =
15828 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
15829 ASSERT_VK_SUCCESS(err);
15830
15831 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15832 // Introduce failure by creating second image with a different-sized format.
15833 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
15834
15835 err =
15836 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
15837 ASSERT_VK_SUCCESS(err);
15838
15839 // Allocate memory
15840 VkMemoryAllocateInfo memAlloc = {};
15841 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15842 memAlloc.pNext = NULL;
15843 memAlloc.allocationSize = 0;
15844 memAlloc.memoryTypeIndex = 0;
15845
15846 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
15847 memAlloc.allocationSize = memReqs.size;
15848 pass =
15849 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
15850 ASSERT_TRUE(pass);
15851 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
15852 ASSERT_VK_SUCCESS(err);
15853
15854 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
15855 memAlloc.allocationSize = memReqs.size;
15856 pass =
15857 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
15858 ASSERT_TRUE(pass);
15859 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
15860 ASSERT_VK_SUCCESS(err);
15861
15862 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15863 ASSERT_VK_SUCCESS(err);
15864 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
15865 ASSERT_VK_SUCCESS(err);
15866
15867 BeginCommandBuffer();
15868 VkImageCopy copyRegion;
15869 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15870 copyRegion.srcSubresource.mipLevel = 0;
15871 copyRegion.srcSubresource.baseArrayLayer = 0;
15872 copyRegion.srcSubresource.layerCount = 0;
15873 copyRegion.srcOffset.x = 0;
15874 copyRegion.srcOffset.y = 0;
15875 copyRegion.srcOffset.z = 0;
15876 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15877 copyRegion.dstSubresource.mipLevel = 0;
15878 copyRegion.dstSubresource.baseArrayLayer = 0;
15879 copyRegion.dstSubresource.layerCount = 0;
15880 copyRegion.dstOffset.x = 0;
15881 copyRegion.dstOffset.y = 0;
15882 copyRegion.dstOffset.z = 0;
15883 copyRegion.extent.width = 1;
15884 copyRegion.extent.height = 1;
15885 copyRegion.extent.depth = 1;
15886 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15887 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
15888 EndCommandBuffer();
15889
15890 m_errorMonitor->VerifyFound();
15891
15892 vkDestroyImage(m_device->device(), srcImage, NULL);
15893 vkDestroyImage(m_device->device(), dstImage, NULL);
15894 vkFreeMemory(m_device->device(), srcMem, NULL);
15895 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015896}
15897
Karl Schultz6addd812016-02-02 17:17:23 -070015898TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
15899 VkResult err;
15900 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015901
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015902 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015903 m_errorMonitor->SetDesiredFailureMsg(
15904 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015905 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015906
Mike Stroyana3082432015-09-25 13:39:21 -060015907 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015908
15909 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015910 VkImage srcImage;
15911 VkImage dstImage;
15912 VkDeviceMemory srcMem;
15913 VkDeviceMemory destMem;
15914 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015915
15916 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015917 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15918 image_create_info.pNext = NULL;
15919 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15920 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15921 image_create_info.extent.width = 32;
15922 image_create_info.extent.height = 32;
15923 image_create_info.extent.depth = 1;
15924 image_create_info.mipLevels = 1;
15925 image_create_info.arrayLayers = 1;
15926 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15927 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15928 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15929 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015930
Karl Schultz6addd812016-02-02 17:17:23 -070015931 err =
15932 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015933 ASSERT_VK_SUCCESS(err);
15934
Karl Schultzbdb75952016-04-19 11:36:49 -060015935 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15936
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015937 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070015938 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015939 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
15940 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015941
Karl Schultz6addd812016-02-02 17:17:23 -070015942 err =
15943 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015944 ASSERT_VK_SUCCESS(err);
15945
15946 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015947 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015948 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15949 memAlloc.pNext = NULL;
15950 memAlloc.allocationSize = 0;
15951 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015952
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015953 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015954 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015955 pass =
15956 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015957 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015958 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015959 ASSERT_VK_SUCCESS(err);
15960
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015961 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015962 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015963 pass =
15964 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015965 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015966 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015967 ASSERT_VK_SUCCESS(err);
15968
15969 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15970 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015971 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015972 ASSERT_VK_SUCCESS(err);
15973
15974 BeginCommandBuffer();
15975 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015976 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015977 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015978 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015979 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015980 copyRegion.srcOffset.x = 0;
15981 copyRegion.srcOffset.y = 0;
15982 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015983 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015984 copyRegion.dstSubresource.mipLevel = 0;
15985 copyRegion.dstSubresource.baseArrayLayer = 0;
15986 copyRegion.dstSubresource.layerCount = 0;
15987 copyRegion.dstOffset.x = 0;
15988 copyRegion.dstOffset.y = 0;
15989 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015990 copyRegion.extent.width = 1;
15991 copyRegion.extent.height = 1;
15992 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015993 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15994 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015995 EndCommandBuffer();
15996
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015997 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015998
Chia-I Wuf7458c52015-10-26 21:10:41 +080015999 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016000 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016001 vkFreeMemory(m_device->device(), srcMem, NULL);
16002 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016003}
16004
Karl Schultz6addd812016-02-02 17:17:23 -070016005TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
16006 VkResult err;
16007 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016008
Karl Schultz6addd812016-02-02 17:17:23 -070016009 m_errorMonitor->SetDesiredFailureMsg(
16010 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016011 "vkCmdResolveImage called with source sample count less than 2.");
16012
Mike Stroyana3082432015-09-25 13:39:21 -060016013 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016014
16015 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070016016 VkImage srcImage;
16017 VkImage dstImage;
16018 VkDeviceMemory srcMem;
16019 VkDeviceMemory destMem;
16020 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016021
16022 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016023 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16024 image_create_info.pNext = NULL;
16025 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16026 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16027 image_create_info.extent.width = 32;
16028 image_create_info.extent.height = 1;
16029 image_create_info.extent.depth = 1;
16030 image_create_info.mipLevels = 1;
16031 image_create_info.arrayLayers = 1;
16032 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16033 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16034 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16035 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016036
Karl Schultz6addd812016-02-02 17:17:23 -070016037 err =
16038 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016039 ASSERT_VK_SUCCESS(err);
16040
Karl Schultz6addd812016-02-02 17:17:23 -070016041 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016042
Karl Schultz6addd812016-02-02 17:17:23 -070016043 err =
16044 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016045 ASSERT_VK_SUCCESS(err);
16046
16047 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016048 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016049 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16050 memAlloc.pNext = NULL;
16051 memAlloc.allocationSize = 0;
16052 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016053
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016054 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016055 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016056 pass =
16057 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016058 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016059 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016060 ASSERT_VK_SUCCESS(err);
16061
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016062 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016063 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016064 pass =
16065 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016066 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016067 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016068 ASSERT_VK_SUCCESS(err);
16069
16070 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16071 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016072 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016073 ASSERT_VK_SUCCESS(err);
16074
16075 BeginCommandBuffer();
16076 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016077 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16078 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016079 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016080 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016081 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016082 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016083 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016084 resolveRegion.srcOffset.x = 0;
16085 resolveRegion.srcOffset.y = 0;
16086 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016087 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016088 resolveRegion.dstSubresource.mipLevel = 0;
16089 resolveRegion.dstSubresource.baseArrayLayer = 0;
16090 resolveRegion.dstSubresource.layerCount = 0;
16091 resolveRegion.dstOffset.x = 0;
16092 resolveRegion.dstOffset.y = 0;
16093 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016094 resolveRegion.extent.width = 1;
16095 resolveRegion.extent.height = 1;
16096 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016097 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16098 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016099 EndCommandBuffer();
16100
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016101 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016102
Chia-I Wuf7458c52015-10-26 21:10:41 +080016103 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016104 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016105 vkFreeMemory(m_device->device(), srcMem, NULL);
16106 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016107}
16108
Karl Schultz6addd812016-02-02 17:17:23 -070016109TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
16110 VkResult err;
16111 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016112
Karl Schultz6addd812016-02-02 17:17:23 -070016113 m_errorMonitor->SetDesiredFailureMsg(
16114 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016115 "vkCmdResolveImage called with dest sample count greater than 1.");
16116
Mike Stroyana3082432015-09-25 13:39:21 -060016117 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016118
Chris Forbesa7530692016-05-08 12:35:39 +120016119 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070016120 VkImage srcImage;
16121 VkImage dstImage;
16122 VkDeviceMemory srcMem;
16123 VkDeviceMemory destMem;
16124 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016125
16126 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016127 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16128 image_create_info.pNext = NULL;
16129 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16130 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16131 image_create_info.extent.width = 32;
16132 image_create_info.extent.height = 1;
16133 image_create_info.extent.depth = 1;
16134 image_create_info.mipLevels = 1;
16135 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120016136 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016137 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16138 // Note: Some implementations expect color attachment usage for any
16139 // multisample surface
16140 image_create_info.usage =
16141 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16142 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016143
Karl Schultz6addd812016-02-02 17:17:23 -070016144 err =
16145 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016146 ASSERT_VK_SUCCESS(err);
16147
Karl Schultz6addd812016-02-02 17:17:23 -070016148 // Note: Some implementations expect color attachment usage for any
16149 // multisample surface
16150 image_create_info.usage =
16151 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016152
Karl Schultz6addd812016-02-02 17:17:23 -070016153 err =
16154 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016155 ASSERT_VK_SUCCESS(err);
16156
16157 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016158 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016159 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16160 memAlloc.pNext = NULL;
16161 memAlloc.allocationSize = 0;
16162 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016163
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016164 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016165 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016166 pass =
16167 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016168 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016169 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016170 ASSERT_VK_SUCCESS(err);
16171
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016172 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016173 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016174 pass =
16175 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016176 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016177 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016178 ASSERT_VK_SUCCESS(err);
16179
16180 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16181 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016182 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016183 ASSERT_VK_SUCCESS(err);
16184
16185 BeginCommandBuffer();
16186 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016187 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16188 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016189 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016190 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016191 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016192 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016193 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016194 resolveRegion.srcOffset.x = 0;
16195 resolveRegion.srcOffset.y = 0;
16196 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016197 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016198 resolveRegion.dstSubresource.mipLevel = 0;
16199 resolveRegion.dstSubresource.baseArrayLayer = 0;
16200 resolveRegion.dstSubresource.layerCount = 0;
16201 resolveRegion.dstOffset.x = 0;
16202 resolveRegion.dstOffset.y = 0;
16203 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016204 resolveRegion.extent.width = 1;
16205 resolveRegion.extent.height = 1;
16206 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016207 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16208 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016209 EndCommandBuffer();
16210
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016211 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016212
Chia-I Wuf7458c52015-10-26 21:10:41 +080016213 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016214 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016215 vkFreeMemory(m_device->device(), srcMem, NULL);
16216 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016217}
16218
Karl Schultz6addd812016-02-02 17:17:23 -070016219TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
16220 VkResult err;
16221 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016222
Karl Schultz6addd812016-02-02 17:17:23 -070016223 m_errorMonitor->SetDesiredFailureMsg(
16224 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016225 "vkCmdResolveImage called with unmatched source and dest formats.");
16226
Mike Stroyana3082432015-09-25 13:39:21 -060016227 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016228
16229 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016230 VkImage srcImage;
16231 VkImage dstImage;
16232 VkDeviceMemory srcMem;
16233 VkDeviceMemory destMem;
16234 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016235
16236 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016237 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16238 image_create_info.pNext = NULL;
16239 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16240 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16241 image_create_info.extent.width = 32;
16242 image_create_info.extent.height = 1;
16243 image_create_info.extent.depth = 1;
16244 image_create_info.mipLevels = 1;
16245 image_create_info.arrayLayers = 1;
16246 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
16247 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16248 // Note: Some implementations expect color attachment usage for any
16249 // multisample surface
16250 image_create_info.usage =
16251 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16252 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016253
Karl Schultz6addd812016-02-02 17:17:23 -070016254 err =
16255 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016256 ASSERT_VK_SUCCESS(err);
16257
Karl Schultz6addd812016-02-02 17:17:23 -070016258 // Set format to something other than source image
16259 image_create_info.format = VK_FORMAT_R32_SFLOAT;
16260 // Note: Some implementations expect color attachment usage for any
16261 // multisample surface
16262 image_create_info.usage =
16263 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16264 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016265
Karl Schultz6addd812016-02-02 17:17:23 -070016266 err =
16267 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016268 ASSERT_VK_SUCCESS(err);
16269
16270 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016271 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016272 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16273 memAlloc.pNext = NULL;
16274 memAlloc.allocationSize = 0;
16275 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016276
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016277 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016278 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016279 pass =
16280 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016281 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016282 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016283 ASSERT_VK_SUCCESS(err);
16284
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016285 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016286 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016287 pass =
16288 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016289 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016290 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016291 ASSERT_VK_SUCCESS(err);
16292
16293 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16294 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016295 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016296 ASSERT_VK_SUCCESS(err);
16297
16298 BeginCommandBuffer();
16299 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016300 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16301 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016302 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016303 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016304 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016305 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016306 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016307 resolveRegion.srcOffset.x = 0;
16308 resolveRegion.srcOffset.y = 0;
16309 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016310 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016311 resolveRegion.dstSubresource.mipLevel = 0;
16312 resolveRegion.dstSubresource.baseArrayLayer = 0;
16313 resolveRegion.dstSubresource.layerCount = 0;
16314 resolveRegion.dstOffset.x = 0;
16315 resolveRegion.dstOffset.y = 0;
16316 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016317 resolveRegion.extent.width = 1;
16318 resolveRegion.extent.height = 1;
16319 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016320 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16321 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016322 EndCommandBuffer();
16323
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016324 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016325
Chia-I Wuf7458c52015-10-26 21:10:41 +080016326 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016327 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016328 vkFreeMemory(m_device->device(), srcMem, NULL);
16329 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016330}
16331
Karl Schultz6addd812016-02-02 17:17:23 -070016332TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
16333 VkResult err;
16334 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016335
Karl Schultz6addd812016-02-02 17:17:23 -070016336 m_errorMonitor->SetDesiredFailureMsg(
16337 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016338 "vkCmdResolveImage called with unmatched source and dest image types.");
16339
Mike Stroyana3082432015-09-25 13:39:21 -060016340 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016341
16342 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016343 VkImage srcImage;
16344 VkImage dstImage;
16345 VkDeviceMemory srcMem;
16346 VkDeviceMemory destMem;
16347 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016348
16349 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016350 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16351 image_create_info.pNext = NULL;
16352 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16353 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16354 image_create_info.extent.width = 32;
16355 image_create_info.extent.height = 1;
16356 image_create_info.extent.depth = 1;
16357 image_create_info.mipLevels = 1;
16358 image_create_info.arrayLayers = 1;
16359 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
16360 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16361 // Note: Some implementations expect color attachment usage for any
16362 // multisample surface
16363 image_create_info.usage =
16364 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16365 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016366
Karl Schultz6addd812016-02-02 17:17:23 -070016367 err =
16368 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016369 ASSERT_VK_SUCCESS(err);
16370
Karl Schultz6addd812016-02-02 17:17:23 -070016371 image_create_info.imageType = VK_IMAGE_TYPE_1D;
16372 // Note: Some implementations expect color attachment usage for any
16373 // multisample surface
16374 image_create_info.usage =
16375 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16376 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016377
Karl Schultz6addd812016-02-02 17:17:23 -070016378 err =
16379 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016380 ASSERT_VK_SUCCESS(err);
16381
16382 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016383 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016384 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16385 memAlloc.pNext = NULL;
16386 memAlloc.allocationSize = 0;
16387 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016388
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016389 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016390 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016391 pass =
16392 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016393 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016394 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016395 ASSERT_VK_SUCCESS(err);
16396
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016397 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016398 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016399 pass =
16400 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016401 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016402 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016403 ASSERT_VK_SUCCESS(err);
16404
16405 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16406 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016407 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016408 ASSERT_VK_SUCCESS(err);
16409
16410 BeginCommandBuffer();
16411 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016412 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16413 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016414 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016415 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016416 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016417 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016418 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016419 resolveRegion.srcOffset.x = 0;
16420 resolveRegion.srcOffset.y = 0;
16421 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016422 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016423 resolveRegion.dstSubresource.mipLevel = 0;
16424 resolveRegion.dstSubresource.baseArrayLayer = 0;
16425 resolveRegion.dstSubresource.layerCount = 0;
16426 resolveRegion.dstOffset.x = 0;
16427 resolveRegion.dstOffset.y = 0;
16428 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016429 resolveRegion.extent.width = 1;
16430 resolveRegion.extent.height = 1;
16431 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016432 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16433 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016434 EndCommandBuffer();
16435
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016436 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016437
Chia-I Wuf7458c52015-10-26 21:10:41 +080016438 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016439 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016440 vkFreeMemory(m_device->device(), srcMem, NULL);
16441 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016442}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016443
Karl Schultz6addd812016-02-02 17:17:23 -070016444TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016445 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070016446 // to using a DS format, then cause it to hit error due to COLOR_BIT not
16447 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016448 // The image format check comes 2nd in validation so we trigger it first,
16449 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070016450 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016451
Karl Schultz6addd812016-02-02 17:17:23 -070016452 m_errorMonitor->SetDesiredFailureMsg(
16453 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016454 "Combination depth/stencil image formats can have only the ");
16455
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016456 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016457
Chia-I Wu1b99bb22015-10-27 19:25:11 +080016458 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016459 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16460 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016461
16462 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016463 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16464 ds_pool_ci.pNext = NULL;
16465 ds_pool_ci.maxSets = 1;
16466 ds_pool_ci.poolSizeCount = 1;
16467 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016468
16469 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070016470 err =
16471 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016472 ASSERT_VK_SUCCESS(err);
16473
16474 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016475 dsl_binding.binding = 0;
16476 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16477 dsl_binding.descriptorCount = 1;
16478 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16479 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016480
16481 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016482 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16483 ds_layout_ci.pNext = NULL;
16484 ds_layout_ci.bindingCount = 1;
16485 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016486 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070016487 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
16488 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016489 ASSERT_VK_SUCCESS(err);
16490
16491 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016492 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080016493 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070016494 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016495 alloc_info.descriptorPool = ds_pool;
16496 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070016497 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
16498 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016499 ASSERT_VK_SUCCESS(err);
16500
Karl Schultz6addd812016-02-02 17:17:23 -070016501 VkImage image_bad;
16502 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016503 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060016504 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016505 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070016506 const int32_t tex_width = 32;
16507 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016508
16509 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016510 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16511 image_create_info.pNext = NULL;
16512 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16513 image_create_info.format = tex_format_bad;
16514 image_create_info.extent.width = tex_width;
16515 image_create_info.extent.height = tex_height;
16516 image_create_info.extent.depth = 1;
16517 image_create_info.mipLevels = 1;
16518 image_create_info.arrayLayers = 1;
16519 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16520 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16521 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
16522 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
16523 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016524
Karl Schultz6addd812016-02-02 17:17:23 -070016525 err =
16526 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016527 ASSERT_VK_SUCCESS(err);
16528 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070016529 image_create_info.usage =
16530 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16531 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
16532 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016533 ASSERT_VK_SUCCESS(err);
16534
16535 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016536 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16537 image_view_create_info.image = image_bad;
16538 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16539 image_view_create_info.format = tex_format_bad;
16540 image_view_create_info.subresourceRange.baseArrayLayer = 0;
16541 image_view_create_info.subresourceRange.baseMipLevel = 0;
16542 image_view_create_info.subresourceRange.layerCount = 1;
16543 image_view_create_info.subresourceRange.levelCount = 1;
16544 image_view_create_info.subresourceRange.aspectMask =
16545 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016546
16547 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070016548 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
16549 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016550
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016551 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016552
Chia-I Wuf7458c52015-10-26 21:10:41 +080016553 vkDestroyImage(m_device->device(), image_bad, NULL);
16554 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016555 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16556 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016557}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016558
16559TEST_F(VkLayerTest, ClearImageErrors) {
16560 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
16561 "ClearDepthStencilImage with a color image.");
16562
16563 ASSERT_NO_FATAL_FAILURE(InitState());
16564 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16565
16566 // Renderpass is started here so end it as Clear cmds can't be in renderpass
16567 BeginCommandBuffer();
16568 m_commandBuffer->EndRenderPass();
16569
16570 // Color image
16571 VkClearColorValue clear_color;
16572 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
16573 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
16574 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
16575 const int32_t img_width = 32;
16576 const int32_t img_height = 32;
16577 VkImageCreateInfo image_create_info = {};
16578 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16579 image_create_info.pNext = NULL;
16580 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16581 image_create_info.format = color_format;
16582 image_create_info.extent.width = img_width;
16583 image_create_info.extent.height = img_height;
16584 image_create_info.extent.depth = 1;
16585 image_create_info.mipLevels = 1;
16586 image_create_info.arrayLayers = 1;
16587 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16588 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16589 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16590
16591 vk_testing::Image color_image;
16592 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info,
16593 reqs);
16594
16595 const VkImageSubresourceRange color_range =
16596 vk_testing::Image::subresource_range(image_create_info,
16597 VK_IMAGE_ASPECT_COLOR_BIT);
16598
16599 // Depth/Stencil image
16600 VkClearDepthStencilValue clear_value = {0};
16601 reqs = 0; // don't need HOST_VISIBLE DS image
16602 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
16603 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
16604 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
16605 ds_image_create_info.extent.width = 64;
16606 ds_image_create_info.extent.height = 64;
16607 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16608 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
16609
16610 vk_testing::Image ds_image;
16611 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info,
16612 reqs);
16613
16614 const VkImageSubresourceRange ds_range =
16615 vk_testing::Image::subresource_range(ds_image_create_info,
16616 VK_IMAGE_ASPECT_DEPTH_BIT);
16617
16618 m_errorMonitor->SetDesiredFailureMsg(
16619 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16620 "vkCmdClearColorImage called with depth/stencil image.");
16621
16622 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
16623 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
16624 &color_range);
16625
16626 m_errorMonitor->VerifyFound();
16627
Tony Barbour26434b92016-06-02 09:43:50 -060016628 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16629 "vkCmdClearColorImage called with "
16630 "image created without "
16631 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
16632
16633 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
16634 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
16635 &color_range);
16636
16637 m_errorMonitor->VerifyFound();
16638
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016639 // Call CmdClearDepthStencilImage with color image
16640 m_errorMonitor->SetDesiredFailureMsg(
16641 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16642 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
16643
16644 vkCmdClearDepthStencilImage(
16645 m_commandBuffer->GetBufferHandle(), color_image.handle(),
16646 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
16647 &ds_range);
16648
16649 m_errorMonitor->VerifyFound();
16650}
Tobin Ehliscde08892015-09-22 10:11:37 -060016651#endif // IMAGE_TESTS
16652
Cody Northrop1242dfd2016-07-13 17:24:59 -060016653#if defined(ANDROID) && defined(VALIDATION_APK)
16654static bool initialized = false;
16655static bool active = false;
16656
16657// Convert Intents to argv
16658// Ported from Hologram sample, only difference is flexible key
16659std::vector<std::string> get_args(android_app &app, const char* intent_extra_data_key)
16660{
16661 std::vector<std::string> args;
16662 JavaVM &vm = *app.activity->vm;
16663 JNIEnv *p_env;
16664 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK)
16665 return args;
16666
16667 JNIEnv &env = *p_env;
16668 jobject activity = app.activity->clazz;
16669 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity),
16670 "getIntent", "()Landroid/content/Intent;");
16671 jobject intent = env.CallObjectMethod(activity, get_intent_method);
16672 jmethodID get_string_extra_method = env.GetMethodID(env.GetObjectClass(intent),
16673 "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
16674 jvalue get_string_extra_args;
16675 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
16676 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent,
16677 get_string_extra_method, &get_string_extra_args));
16678
16679 std::string args_str;
16680 if (extra_str) {
16681 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
16682 args_str = extra_utf;
16683 env.ReleaseStringUTFChars(extra_str, extra_utf);
16684 env.DeleteLocalRef(extra_str);
16685 }
16686
16687 env.DeleteLocalRef(get_string_extra_args.l);
16688 env.DeleteLocalRef(intent);
16689 vm.DetachCurrentThread();
16690
16691 // split args_str
16692 std::stringstream ss(args_str);
16693 std::string arg;
16694 while (std::getline(ss, arg, ' ')) {
16695 if (!arg.empty())
16696 args.push_back(arg);
16697 }
16698
16699 return args;
16700}
16701
16702
16703static int32_t processInput(struct android_app* app, AInputEvent* event) {
16704 return 0;
16705}
16706
16707static void processCommand(struct android_app* app, int32_t cmd) {
16708 switch(cmd) {
16709 case APP_CMD_INIT_WINDOW: {
16710 if (app->window) {
16711 initialized = true;
16712 }
16713 break;
16714 }
16715 case APP_CMD_GAINED_FOCUS: {
16716 active = true;
16717 break;
16718 }
16719 case APP_CMD_LOST_FOCUS: {
16720 active = false;
16721 break;
16722 }
16723 }
16724}
16725
16726void android_main(struct android_app *app)
16727{
16728 app_dummy();
16729
16730 const char* appTag = "VulkanLayerValidationTests";
16731
16732 int vulkanSupport = InitVulkan();
16733 if (vulkanSupport == 0) {
16734 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
16735 return;
16736 }
16737
16738 app->onAppCmd = processCommand;
16739 app->onInputEvent = processInput;
16740
16741 while(1) {
16742 int events;
16743 struct android_poll_source* source;
16744 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void**)&source) >= 0) {
16745 if (source) {
16746 source->process(app, source);
16747 }
16748
16749 if (app->destroyRequested != 0) {
16750 VkTestFramework::Finish();
16751 return;
16752 }
16753 }
16754
16755 if (initialized && active) {
16756 // Use the following key to send arguments to gtest, i.e.
16757 // --es args "--gtest_filter=-VkLayerTest.foo"
16758 const char key[] = "args";
16759 std::vector<std::string> args = get_args(*app, key);
16760
16761 std::string filter = "";
16762 if (args.size() > 0) {
16763 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
16764 filter += args[0];
16765 } else {
16766 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
16767 }
16768
16769 int argc = 2;
16770 char *argv[] = { (char*)"foo", (char*)filter.c_str() };
16771 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
16772
16773 // Route output to files until we can override the gtest output
16774 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
16775 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
16776
16777 ::testing::InitGoogleTest(&argc, argv);
16778 VkTestFramework::InitArgs(&argc, argv);
16779 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
16780
16781 int result = RUN_ALL_TESTS();
16782
16783 if (result != 0) {
16784 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
16785 } else {
16786 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
16787 }
16788
16789 VkTestFramework::Finish();
16790
16791 fclose(stdout);
16792 fclose(stderr);
16793
16794 ANativeActivity_finish(app->activity);
16795
16796 return;
16797 }
16798 }
16799}
16800#endif
16801
Tony Barbour300a6082015-04-07 13:44:53 -060016802int main(int argc, char **argv) {
16803 int result;
16804
Cody Northrop8e54a402016-03-08 22:25:52 -070016805#ifdef ANDROID
16806 int vulkanSupport = InitVulkan();
16807 if (vulkanSupport == 0)
16808 return 1;
16809#endif
16810
Tony Barbour300a6082015-04-07 13:44:53 -060016811 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060016812 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060016813
16814 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
16815
16816 result = RUN_ALL_TESTS();
16817
Tony Barbour6918cd52015-04-09 12:58:51 -060016818 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060016819 return result;
16820}