blob: 45709a8e9e73e0698a53e1a79630758c715aeef8 [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
Tony Barbour6514a6b2016-08-12 09:37:19 -06003331 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003332 VkCommandPool command_pool_one;
3333 VkCommandPool command_pool_two;
3334
3335 VkCommandPoolCreateInfo pool_create_info{};
3336 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3337 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3338 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3339
3340 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3341 &command_pool_one);
3342
3343 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3344 &command_pool_two);
3345
3346 VkCommandBuffer command_buffer[9];
3347 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3348 command_buffer_allocate_info.sType =
3349 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3350 command_buffer_allocate_info.commandPool = command_pool_one;
3351 command_buffer_allocate_info.commandBufferCount = 9;
3352 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3353 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3354 command_buffer);
3355
3356 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
3357 &command_buffer[3]);
3358
3359 m_errorMonitor->VerifyFound();
3360
3361 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
3362 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
3363}
3364
3365TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
3366 VkResult err;
3367
3368 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
3369 "attempt to delete them from another.");
3370
3371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3372 "FreeDescriptorSets is attempting to free descriptorSet");
3373
3374 ASSERT_NO_FATAL_FAILURE(InitState());
3375 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3376
3377 VkDescriptorPoolSize ds_type_count = {};
3378 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3379 ds_type_count.descriptorCount = 1;
3380
3381 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3382 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3383 ds_pool_ci.pNext = NULL;
3384 ds_pool_ci.flags = 0;
3385 ds_pool_ci.maxSets = 1;
3386 ds_pool_ci.poolSizeCount = 1;
3387 ds_pool_ci.pPoolSizes = &ds_type_count;
3388
3389 VkDescriptorPool ds_pool_one;
3390 err =
3391 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
3392 ASSERT_VK_SUCCESS(err);
3393
3394 // Create a second descriptor pool
3395 VkDescriptorPool ds_pool_two;
3396 err =
3397 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
3398 ASSERT_VK_SUCCESS(err);
3399
3400 VkDescriptorSetLayoutBinding dsl_binding = {};
3401 dsl_binding.binding = 0;
3402 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3403 dsl_binding.descriptorCount = 1;
3404 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3405 dsl_binding.pImmutableSamplers = NULL;
3406
3407 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3408 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3409 ds_layout_ci.pNext = NULL;
3410 ds_layout_ci.bindingCount = 1;
3411 ds_layout_ci.pBindings = &dsl_binding;
3412
3413 VkDescriptorSetLayout ds_layout;
3414 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3415 &ds_layout);
3416 ASSERT_VK_SUCCESS(err);
3417
3418 VkDescriptorSet descriptorSet;
3419 VkDescriptorSetAllocateInfo alloc_info = {};
3420 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3421 alloc_info.descriptorSetCount = 1;
3422 alloc_info.descriptorPool = ds_pool_one;
3423 alloc_info.pSetLayouts = &ds_layout;
3424 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3425 &descriptorSet);
3426 ASSERT_VK_SUCCESS(err);
3427
3428 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
3429
3430 m_errorMonitor->VerifyFound();
3431
3432 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3433 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
3434 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
3435}
3436
3437TEST_F(VkLayerTest, CreateUnknownObject) {
3438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003439 "Invalid Image Object ");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003440
3441 TEST_DESCRIPTION(
3442 "Pass an invalid image object handle into a Vulkan API call.");
3443
3444 ASSERT_NO_FATAL_FAILURE(InitState());
3445
3446 // Pass bogus handle into GetImageMemoryRequirements
3447 VkMemoryRequirements mem_reqs;
3448 uint64_t fakeImageHandle = 0xCADECADE;
3449 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
3450
3451 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
3452
3453 m_errorMonitor->VerifyFound();
3454}
3455
Karl Schultz6addd812016-02-02 17:17:23 -07003456TEST_F(VkLayerTest, PipelineNotBound) {
3457 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003458
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003459 TEST_DESCRIPTION(
3460 "Pass in an invalid pipeline object handle into a Vulkan API call.");
3461
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003463 "Invalid Pipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003464
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003465 ASSERT_NO_FATAL_FAILURE(InitState());
3466 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003467
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003468 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003469 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3470 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003471
3472 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003473 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3474 ds_pool_ci.pNext = NULL;
3475 ds_pool_ci.maxSets = 1;
3476 ds_pool_ci.poolSizeCount = 1;
3477 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003478
3479 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003480 err =
3481 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003482 ASSERT_VK_SUCCESS(err);
3483
3484 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003485 dsl_binding.binding = 0;
3486 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3487 dsl_binding.descriptorCount = 1;
3488 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3489 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003490
3491 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003492 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3493 ds_layout_ci.pNext = NULL;
3494 ds_layout_ci.bindingCount = 1;
3495 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003496
3497 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003498 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3499 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003500 ASSERT_VK_SUCCESS(err);
3501
3502 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003503 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003504 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003505 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003506 alloc_info.descriptorPool = ds_pool;
3507 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003508 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3509 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003510 ASSERT_VK_SUCCESS(err);
3511
3512 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003513 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3514 pipeline_layout_ci.pNext = NULL;
3515 pipeline_layout_ci.setLayoutCount = 1;
3516 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003517
3518 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003519 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3520 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003521 ASSERT_VK_SUCCESS(err);
3522
Mark Youngad779052016-01-06 14:26:04 -07003523 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003524
3525 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003526 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3527 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003528
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003529 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003530
Chia-I Wuf7458c52015-10-26 21:10:41 +08003531 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3532 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3533 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003534}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003535
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003536TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
3537 VkResult err;
3538
3539 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
3540 "during bind[Buffer|Image]Memory time");
3541
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003542 ASSERT_NO_FATAL_FAILURE(InitState());
3543
3544 // Create an image, allocate memory, set a bad typeIndex and then try to
3545 // bind it
3546 VkImage image;
3547 VkDeviceMemory mem;
3548 VkMemoryRequirements mem_reqs;
3549 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3550 const int32_t tex_width = 32;
3551 const int32_t tex_height = 32;
3552
3553 VkImageCreateInfo image_create_info = {};
3554 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3555 image_create_info.pNext = NULL;
3556 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3557 image_create_info.format = tex_format;
3558 image_create_info.extent.width = tex_width;
3559 image_create_info.extent.height = tex_height;
3560 image_create_info.extent.depth = 1;
3561 image_create_info.mipLevels = 1;
3562 image_create_info.arrayLayers = 1;
3563 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3564 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3565 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3566 image_create_info.flags = 0;
3567
3568 VkMemoryAllocateInfo mem_alloc = {};
3569 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3570 mem_alloc.pNext = NULL;
3571 mem_alloc.allocationSize = 0;
3572 mem_alloc.memoryTypeIndex = 0;
3573
3574 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3575 ASSERT_VK_SUCCESS(err);
3576
3577 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
3578 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003579
3580 // Introduce Failure, select invalid TypeIndex
3581 VkPhysicalDeviceMemoryProperties memory_info;
3582
3583 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
3584 unsigned int i;
3585 for (i = 0; i < memory_info.memoryTypeCount; i++) {
3586 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
3587 mem_alloc.memoryTypeIndex = i;
3588 break;
3589 }
3590 }
3591 if (i >= memory_info.memoryTypeCount) {
3592 printf("No invalid memory type index could be found; skipped.\n");
3593 vkDestroyImage(m_device->device(), image, NULL);
3594 return;
3595 }
3596
3597 m_errorMonitor->SetDesiredFailureMsg(
3598 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3599 "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003600
3601 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3602 ASSERT_VK_SUCCESS(err);
3603
3604 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3605 (void)err;
3606
3607 m_errorMonitor->VerifyFound();
3608
3609 vkDestroyImage(m_device->device(), image, NULL);
3610 vkFreeMemory(m_device->device(), mem, NULL);
3611}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003612
Karl Schultz6addd812016-02-02 17:17:23 -07003613TEST_F(VkLayerTest, BindInvalidMemory) {
3614 VkResult err;
3615 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003616
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003618 "Invalid Device Memory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003619
Tobin Ehlisec598302015-09-15 15:02:17 -06003620 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003621
3622 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07003623 VkImage image;
3624 VkDeviceMemory mem;
3625 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003626
Karl Schultz6addd812016-02-02 17:17:23 -07003627 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3628 const int32_t tex_width = 32;
3629 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003630
3631 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003632 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3633 image_create_info.pNext = NULL;
3634 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3635 image_create_info.format = tex_format;
3636 image_create_info.extent.width = tex_width;
3637 image_create_info.extent.height = tex_height;
3638 image_create_info.extent.depth = 1;
3639 image_create_info.mipLevels = 1;
3640 image_create_info.arrayLayers = 1;
3641 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3642 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3643 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3644 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003645
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003646 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003647 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3648 mem_alloc.pNext = NULL;
3649 mem_alloc.allocationSize = 0;
3650 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003651
Chia-I Wuf7458c52015-10-26 21:10:41 +08003652 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003653 ASSERT_VK_SUCCESS(err);
3654
Karl Schultz6addd812016-02-02 17:17:23 -07003655 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003656
3657 mem_alloc.allocationSize = mem_reqs.size;
3658
Karl Schultz6addd812016-02-02 17:17:23 -07003659 pass =
3660 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003661 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003662
3663 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003664 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003665 ASSERT_VK_SUCCESS(err);
3666
3667 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003668 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003669
3670 // Try to bind free memory that has been freed
3671 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3672 // This may very well return an error.
3673 (void)err;
3674
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003675 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003676
Chia-I Wuf7458c52015-10-26 21:10:41 +08003677 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003678}
3679
Karl Schultz6addd812016-02-02 17:17:23 -07003680TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
3681 VkResult err;
3682 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003683
Karl Schultz6addd812016-02-02 17:17:23 -07003684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003685 "Invalid Image Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003686
Tobin Ehlisec598302015-09-15 15:02:17 -06003687 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003688
Karl Schultz6addd812016-02-02 17:17:23 -07003689 // Create an image object, allocate memory, destroy the object and then try
3690 // to bind it
3691 VkImage image;
3692 VkDeviceMemory mem;
3693 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003694
Karl Schultz6addd812016-02-02 17:17:23 -07003695 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3696 const int32_t tex_width = 32;
3697 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003698
3699 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003700 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3701 image_create_info.pNext = NULL;
3702 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3703 image_create_info.format = tex_format;
3704 image_create_info.extent.width = tex_width;
3705 image_create_info.extent.height = tex_height;
3706 image_create_info.extent.depth = 1;
3707 image_create_info.mipLevels = 1;
3708 image_create_info.arrayLayers = 1;
3709 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3710 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3711 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3712 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003713
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003714 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003715 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3716 mem_alloc.pNext = NULL;
3717 mem_alloc.allocationSize = 0;
3718 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003719
Chia-I Wuf7458c52015-10-26 21:10:41 +08003720 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003721 ASSERT_VK_SUCCESS(err);
3722
Karl Schultz6addd812016-02-02 17:17:23 -07003723 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003724
3725 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003726 pass =
3727 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003728 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003729
3730 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003731 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003732 ASSERT_VK_SUCCESS(err);
3733
3734 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003735 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003736 ASSERT_VK_SUCCESS(err);
3737
3738 // Now Try to bind memory to this destroyed object
3739 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3740 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003741 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003742
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003743 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003744
Chia-I Wuf7458c52015-10-26 21:10:41 +08003745 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003746}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003747
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003748#endif // OBJ_TRACKER_TESTS
3749
Tobin Ehlis0788f522015-05-26 16:11:58 -06003750#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003751
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003752TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003753 TEST_DESCRIPTION("Submit command buffer created using one queue family and "
3754 "attempt to submit them on a queue created in a different "
3755 "queue family.");
3756
Tony Barbour6514a6b2016-08-12 09:37:19 -06003757 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003758 // This test is meaningless unless we have multiple queue families
3759 auto queue_family_properties = m_device->phy().queue_properties();
3760 if (queue_family_properties.size() < 2) {
3761 return;
3762 }
3763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3764 " is being submitted on queue ");
3765 // Get safe index of another queue family
3766 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
3767 ASSERT_NO_FATAL_FAILURE(InitState());
3768 // Create a second queue using a different queue family
3769 VkQueue other_queue;
3770 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3771
3772 // Record an empty cmd buffer
3773 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3774 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3775 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3776 vkEndCommandBuffer(m_commandBuffer->handle());
3777
3778 // And submit on the wrong queue
3779 VkSubmitInfo submit_info = {};
3780 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3781 submit_info.commandBufferCount = 1;
3782 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003783 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003784
3785 m_errorMonitor->VerifyFound();
3786
3787}
3788
Chris Forbes48a53902016-06-30 11:46:27 +12003789TEST_F(VkLayerTest, RenderPassInitialLayoutUndefined) {
3790 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
3791 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
3792 "the command buffer has prior knowledge of that "
3793 "attachment's layout.");
3794
3795 m_errorMonitor->ExpectSuccess();
3796
3797 ASSERT_NO_FATAL_FAILURE(InitState());
3798
3799 // A renderpass with one color attachment.
3800 VkAttachmentDescription attachment = {
3801 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3802 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3803 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3804 VK_IMAGE_LAYOUT_UNDEFINED,
3805 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3806 };
3807
3808 VkAttachmentReference att_ref = {
3809 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3810 };
3811
3812 VkSubpassDescription subpass = {
3813 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3814 1, &att_ref, nullptr, nullptr, 0, nullptr
3815 };
3816
3817 VkRenderPassCreateInfo rpci = {
3818 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3819 0, 1, &attachment, 1, &subpass, 0, nullptr
3820 };
3821
3822 VkRenderPass rp;
3823 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3824 ASSERT_VK_SUCCESS(err);
3825
3826 // A compatible framebuffer.
3827 VkImageObj image(m_device);
3828 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3829 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3830 VK_IMAGE_TILING_OPTIMAL, 0);
3831 ASSERT_TRUE(image.initialized());
3832
3833 VkImageViewCreateInfo ivci = {
3834 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3835 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3836 {
3837 VK_COMPONENT_SWIZZLE_IDENTITY,
3838 VK_COMPONENT_SWIZZLE_IDENTITY,
3839 VK_COMPONENT_SWIZZLE_IDENTITY,
3840 VK_COMPONENT_SWIZZLE_IDENTITY
3841 },
3842 {
3843 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3844 },
3845 };
3846 VkImageView view;
3847 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3848 ASSERT_VK_SUCCESS(err);
3849
3850 VkFramebufferCreateInfo fci = {
3851 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3852 0, rp, 1, &view,
3853 32, 32, 1
3854 };
3855 VkFramebuffer fb;
3856 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3857 ASSERT_VK_SUCCESS(err);
3858
3859 // Record a single command buffer which uses this renderpass twice. The
3860 // bug is triggered at the beginning of the second renderpass, when the
3861 // command buffer already has a layout recorded for the attachment.
3862 VkRenderPassBeginInfo rpbi = {
3863 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003864 rp, fb, { { 0, 0 } , { 32, 32 } },
Chris Forbes48a53902016-06-30 11:46:27 +12003865 0, nullptr
3866 };
3867 BeginCommandBuffer();
3868 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3869 VK_SUBPASS_CONTENTS_INLINE);
3870 vkCmdEndRenderPass(m_commandBuffer->handle());
3871 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3872 VK_SUBPASS_CONTENTS_INLINE);
3873
3874 m_errorMonitor->VerifyNotFound();
3875
3876 vkCmdEndRenderPass(m_commandBuffer->handle());
3877 EndCommandBuffer();
3878
3879 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3880 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3881 vkDestroyImageView(m_device->device(), view, nullptr);
3882}
3883
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003884TEST_F(VkLayerTest, FramebufferBindingDestroyCommandPool) {
3885 TEST_DESCRIPTION("This test should pass. Create a Framebuffer and "
3886 "command buffer, bind them together, then destroy "
3887 "command pool and framebuffer and verify there are no "
3888 "errors.");
3889
3890 m_errorMonitor->ExpectSuccess();
3891
3892 ASSERT_NO_FATAL_FAILURE(InitState());
3893
3894 // A renderpass with one color attachment.
3895 VkAttachmentDescription attachment = {
3896 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3897 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3898 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3899 VK_IMAGE_LAYOUT_UNDEFINED,
3900 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3901 };
3902
3903 VkAttachmentReference att_ref = {
3904 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3905 };
3906
3907 VkSubpassDescription subpass = {
3908 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3909 1, &att_ref, nullptr, nullptr, 0, nullptr
3910 };
3911
3912 VkRenderPassCreateInfo rpci = {
3913 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3914 0, 1, &attachment, 1, &subpass, 0, nullptr
3915 };
3916
3917 VkRenderPass rp;
3918 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3919 ASSERT_VK_SUCCESS(err);
3920
3921 // A compatible framebuffer.
3922 VkImageObj image(m_device);
3923 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3924 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3925 VK_IMAGE_TILING_OPTIMAL, 0);
3926 ASSERT_TRUE(image.initialized());
3927
3928 VkImageViewCreateInfo ivci = {
3929 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3930 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3931 {
3932 VK_COMPONENT_SWIZZLE_IDENTITY,
3933 VK_COMPONENT_SWIZZLE_IDENTITY,
3934 VK_COMPONENT_SWIZZLE_IDENTITY,
3935 VK_COMPONENT_SWIZZLE_IDENTITY
3936 },
3937 {
3938 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3939 },
3940 };
3941 VkImageView view;
3942 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3943 ASSERT_VK_SUCCESS(err);
3944
3945 VkFramebufferCreateInfo fci = {
3946 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3947 0, rp, 1, &view,
3948 32, 32, 1
3949 };
3950 VkFramebuffer fb;
3951 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3952 ASSERT_VK_SUCCESS(err);
3953
3954 // Explicitly create a command buffer to bind the FB to so that we can then
3955 // destroy the command pool in order to implicitly free command buffer
3956 VkCommandPool command_pool;
3957 VkCommandPoolCreateInfo pool_create_info{};
3958 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3959 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3960 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3961 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3962 &command_pool);
3963
3964 VkCommandBuffer command_buffer;
3965 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3966 command_buffer_allocate_info.sType =
3967 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3968 command_buffer_allocate_info.commandPool = command_pool;
3969 command_buffer_allocate_info.commandBufferCount = 1;
3970 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3971 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3972 &command_buffer);
3973
3974 // Begin our cmd buffer with renderpass using our framebuffer
3975 VkRenderPassBeginInfo rpbi = {
3976 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
3977 rp, fb, { { 0, 0 } , { 32, 32 } },
3978 0, nullptr
3979 };
3980 VkCommandBufferBeginInfo begin_info{};
3981 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3982 vkBeginCommandBuffer(command_buffer, &begin_info);
3983
3984 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3985 vkCmdEndRenderPass(command_buffer);
3986 vkEndCommandBuffer(command_buffer);
Mark Lobodzinski7d10a822016-08-03 14:08:40 -06003987 vkDestroyImageView(m_device->device(), view, nullptr);
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003988 // Destroy command pool to implicitly free command buffer
3989 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3990 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3991 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3992 m_errorMonitor->VerifyNotFound();
3993}
3994
Chris Forbes51bf7c92016-06-30 15:22:08 +12003995TEST_F(VkLayerTest, RenderPassSubpassZeroTransitionsApplied) {
3996 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
3997 "transitions for the first subpass");
3998
3999 m_errorMonitor->ExpectSuccess();
4000
4001 ASSERT_NO_FATAL_FAILURE(InitState());
4002
4003 // A renderpass with one color attachment.
4004 VkAttachmentDescription attachment = {
4005 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
4006 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
4007 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4008 VK_IMAGE_LAYOUT_UNDEFINED,
4009 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4010 };
4011
4012 VkAttachmentReference att_ref = {
4013 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4014 };
4015
4016 VkSubpassDescription subpass = {
4017 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
4018 1, &att_ref, nullptr, nullptr, 0, nullptr
4019 };
4020
4021 VkSubpassDependency dep = {
Chris Forbescb4c7ad2016-07-06 10:28:18 +12004022 0, 0, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4023 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12004024 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4025 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4026 VK_DEPENDENCY_BY_REGION_BIT
4027 };
4028
4029 VkRenderPassCreateInfo rpci = {
4030 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4031 0, 1, &attachment, 1, &subpass, 1, &dep
4032 };
4033
4034 VkResult err;
4035 VkRenderPass rp;
4036 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4037 ASSERT_VK_SUCCESS(err);
4038
4039 // A compatible framebuffer.
4040 VkImageObj image(m_device);
4041 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
4042 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
4043 VK_IMAGE_TILING_OPTIMAL, 0);
4044 ASSERT_TRUE(image.initialized());
4045
4046 VkImageViewCreateInfo ivci = {
4047 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
4048 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
4049 {
4050 VK_COMPONENT_SWIZZLE_IDENTITY,
4051 VK_COMPONENT_SWIZZLE_IDENTITY,
4052 VK_COMPONENT_SWIZZLE_IDENTITY,
4053 VK_COMPONENT_SWIZZLE_IDENTITY
4054 },
4055 {
4056 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
4057 },
4058 };
4059 VkImageView view;
4060 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4061 ASSERT_VK_SUCCESS(err);
4062
4063 VkFramebufferCreateInfo fci = {
4064 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
4065 0, rp, 1, &view,
4066 32, 32, 1
4067 };
4068 VkFramebuffer fb;
4069 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4070 ASSERT_VK_SUCCESS(err);
4071
4072 // Record a single command buffer which issues a pipeline barrier w/
4073 // image memory barrier for the attachment. This detects the previously
4074 // missing tracking of the subpass layout by throwing a validation error
4075 // if it doesn't occur.
4076 VkRenderPassBeginInfo rpbi = {
4077 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06004078 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes51bf7c92016-06-30 15:22:08 +12004079 0, nullptr
4080 };
4081 BeginCommandBuffer();
4082 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4083 VK_SUBPASS_CONTENTS_INLINE);
4084
4085 VkImageMemoryBarrier imb = {
4086 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, nullptr,
4087 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4088 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4089 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4090 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4091 VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
4092 image.handle(),
4093 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
4094 };
4095 vkCmdPipelineBarrier(m_commandBuffer->handle(),
Chris Forbescb4c7ad2016-07-06 10:28:18 +12004096 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4097 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12004098 VK_DEPENDENCY_BY_REGION_BIT,
4099 0, nullptr, 0, nullptr, 1, &imb);
4100
4101 vkCmdEndRenderPass(m_commandBuffer->handle());
4102 m_errorMonitor->VerifyNotFound();
4103 EndCommandBuffer();
4104
4105 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4106 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4107 vkDestroyImageView(m_device->device(), view, nullptr);
4108}
4109
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004110TEST_F(VkLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
4111 TEST_DESCRIPTION("Validate that when an imageView of a depth/stencil image "
4112 "is used as a depth/stencil framebuffer attachment, the "
4113 "aspectMask is ignored and both depth and stencil image "
4114 "subresources are used.");
4115
4116 VkFormatProperties format_properties;
4117 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT,
4118 &format_properties);
4119 if (!(format_properties.optimalTilingFeatures &
4120 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
4121 return;
4122 }
4123
4124 m_errorMonitor->ExpectSuccess();
4125
4126 ASSERT_NO_FATAL_FAILURE(InitState());
4127
4128 VkAttachmentDescription attachment = {
4129 0,
4130 VK_FORMAT_D32_SFLOAT_S8_UINT,
4131 VK_SAMPLE_COUNT_1_BIT,
4132 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4133 VK_ATTACHMENT_STORE_OP_STORE,
4134 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4135 VK_ATTACHMENT_STORE_OP_DONT_CARE,
4136 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4137 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
4138
4139 VkAttachmentReference att_ref = {
4140 0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
4141
4142 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4143 0, nullptr,
4144 0, nullptr,
4145 nullptr, &att_ref,
4146 0, nullptr};
4147
4148 VkSubpassDependency dep = {0,
4149 0,
4150 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4151 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4152 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4153 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4154 VK_DEPENDENCY_BY_REGION_BIT};
4155
4156 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
4157 nullptr,
4158 0,
4159 1,
4160 &attachment,
4161 1,
4162 &subpass,
4163 1,
4164 &dep};
4165
4166 VkResult err;
4167 VkRenderPass rp;
4168 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4169 ASSERT_VK_SUCCESS(err);
4170
4171 VkImageObj image(m_device);
4172 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
4173 0x26, // usage
4174 VK_IMAGE_TILING_OPTIMAL, 0);
4175 ASSERT_TRUE(image.initialized());
4176 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
4177
4178 VkImageViewCreateInfo ivci = {
4179 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4180 nullptr,
4181 0,
4182 image.handle(),
4183 VK_IMAGE_VIEW_TYPE_2D,
4184 VK_FORMAT_D32_SFLOAT_S8_UINT,
4185 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B,
4186 VK_COMPONENT_SWIZZLE_A},
4187 {0x2, 0, 1, 0, 1},
4188 };
4189 VkImageView view;
4190 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4191 ASSERT_VK_SUCCESS(err);
4192
4193 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
4194 nullptr,
4195 0,
4196 rp,
4197 1,
4198 &view,
4199 32,
4200 32,
4201 1};
4202 VkFramebuffer fb;
4203 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4204 ASSERT_VK_SUCCESS(err);
4205
4206 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
4207 nullptr,
4208 rp,
4209 fb,
4210 {{0, 0}, {32, 32}},
4211 0,
4212 nullptr};
4213 BeginCommandBuffer();
4214 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4215 VK_SUBPASS_CONTENTS_INLINE);
4216
4217 VkImageMemoryBarrier imb = {};
4218 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4219 imb.pNext = nullptr;
4220 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4221 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4222 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4223 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4224 imb.srcQueueFamilyIndex = 0;
4225 imb.dstQueueFamilyIndex = 0;
4226 imb.image = image.handle();
4227 imb.subresourceRange.aspectMask = 0x6;
4228 imb.subresourceRange.baseMipLevel = 0;
4229 imb.subresourceRange.levelCount = 0x1;
4230 imb.subresourceRange.baseArrayLayer = 0;
4231 imb.subresourceRange.layerCount = 0x1;
4232
4233 vkCmdPipelineBarrier(m_commandBuffer->handle(),
4234 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4235 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4236 VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
4237 &imb);
4238
4239 vkCmdEndRenderPass(m_commandBuffer->handle());
4240 EndCommandBuffer();
4241 QueueCommandBuffer(false);
4242 m_errorMonitor->VerifyNotFound();
4243
4244 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4245 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4246 vkDestroyImageView(m_device->device(), view, nullptr);
4247}
Tony Barbourd5f7b822016-08-02 15:39:33 -06004248
Tony Barbour4e919972016-08-09 13:27:40 -06004249TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
4250 TEST_DESCRIPTION("Generate INVALID_RENDER_AREA error by beginning renderpass"
4251 "with extent outside of framebuffer");
4252 ASSERT_NO_FATAL_FAILURE(InitState());
4253 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4254
4255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4256 "Cannot execute a render pass with renderArea "
4257 "not within the bound of the framebuffer.");
4258
4259 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
4260 m_renderPassBeginInfo.renderArea.extent.width = 257;
4261 m_renderPassBeginInfo.renderArea.extent.height = 257;
4262 BeginCommandBuffer();
4263 m_errorMonitor->VerifyFound();
4264}
4265
4266TEST_F(VkLayerTest, DisabledIndependentBlend) {
4267 TEST_DESCRIPTION("Generate INDEPENDENT_BLEND by disabling independent "
4268 "blend and then specifying different blend states for two "
4269 "attachements");
Tony Barbour4e919972016-08-09 13:27:40 -06004270 VkPhysicalDeviceFeatures features = {};
4271 features.independentBlend = VK_FALSE;
Tony Barbour4cf5bd32016-08-12 14:53:58 -06004272 ASSERT_NO_FATAL_FAILURE(InitState(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06004273
Tony Barbour4cf5bd32016-08-12 14:53:58 -06004274 m_errorMonitor->SetDesiredFailureMsg(
4275 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4276 "Invalid Pipeline CreateInfo: If independent blend feature not "
4277 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06004278
Tony Barbour4cf5bd32016-08-12 14:53:58 -06004279 VkDescriptorSetObj descriptorSet(m_device);
4280 descriptorSet.AppendDummy();
4281 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06004282
Tony Barbour4cf5bd32016-08-12 14:53:58 -06004283 VkPipelineObj pipeline(m_device);
4284 VkRenderpassObj renderpass(m_device);
4285 VkShaderObj vs(m_device, bindStateVertShaderText,
4286 VK_SHADER_STAGE_VERTEX_BIT, this);
4287 pipeline.AddShader(&vs);
Tony Barbour4e919972016-08-09 13:27:40 -06004288
Tony Barbour4cf5bd32016-08-12 14:53:58 -06004289 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
4290 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
4291 att_state1.blendEnable = VK_TRUE;
4292 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
4293 att_state2.blendEnable = VK_FALSE;
4294 pipeline.AddColorAttachment(0, &att_state1);
4295 pipeline.AddColorAttachment(1, &att_state2);
4296 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(),
4297 renderpass.handle());
4298 m_errorMonitor->VerifyFound();
Tony Barbour4e919972016-08-09 13:27:40 -06004299}
4300
4301TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
4302 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
4303 "depth attachments in subpass");
Tony Barbour6514a6b2016-08-12 09:37:19 -06004304 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour4e919972016-08-09 13:27:40 -06004305
4306 m_errorMonitor->SetDesiredFailureMsg(
4307 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4308 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
4309
4310 // Create a renderPass with a single color attachment
4311 VkAttachmentReference attach = {};
4312 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4313 VkSubpassDescription subpass = {};
4314 VkRenderPassCreateInfo rpci = {};
4315 rpci.subpassCount = 1;
4316 rpci.pSubpasses = &subpass;
4317 rpci.attachmentCount = 1;
4318 VkAttachmentDescription attach_desc = {};
4319 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4320 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4321 rpci.pAttachments = &attach_desc;
4322 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4323 VkRenderPass rp;
4324 subpass.pDepthStencilAttachment = &attach;
4325 subpass.pColorAttachments = NULL;
4326 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4327 m_errorMonitor->VerifyFound();
4328}
4329
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004330TEST_F(VkLayerTest, RenderPassTransitionsAttachmentUnused) {
4331 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
4332 "errors, when an attachment reference is "
4333 "VK_ATTACHMENT_UNUSED");
4334
4335 m_errorMonitor->ExpectSuccess();
4336
4337 ASSERT_NO_FATAL_FAILURE(InitState());
4338
4339 // A renderpass with no attachments
4340 VkAttachmentReference att_ref = {
4341 VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4342 };
4343
4344 VkSubpassDescription subpass = {
4345 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
4346 1, &att_ref, nullptr, nullptr, 0, nullptr
4347 };
4348
4349 VkRenderPassCreateInfo rpci = {
4350 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4351 0, 0, nullptr, 1, &subpass, 0, nullptr
4352 };
4353
4354 VkRenderPass rp;
4355 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4356 ASSERT_VK_SUCCESS(err);
4357
4358 // A compatible framebuffer.
4359 VkFramebufferCreateInfo fci = {
4360 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
4361 0, rp, 0, nullptr,
4362 32, 32, 1
4363 };
4364 VkFramebuffer fb;
4365 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4366 ASSERT_VK_SUCCESS(err);
4367
4368 // Record a command buffer which just begins and ends the renderpass. The
4369 // bug manifests in BeginRenderPass.
4370 VkRenderPassBeginInfo rpbi = {
4371 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06004372 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004373 0, nullptr
4374 };
4375 BeginCommandBuffer();
4376 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4377 VK_SUBPASS_CONTENTS_INLINE);
4378 vkCmdEndRenderPass(m_commandBuffer->handle());
4379 m_errorMonitor->VerifyNotFound();
4380 EndCommandBuffer();
4381
4382 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4383 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4384}
4385
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004386// This is a positive test. No errors are expected.
4387TEST_F(VkLayerTest, StencilLoadOp) {
4388 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
4389 "CLEAR. stencil[Load|Store]Op used to be ignored.");
4390 VkResult result = VK_SUCCESS;
4391 VkImageFormatProperties formatProps;
4392 vkGetPhysicalDeviceImageFormatProperties(
4393 gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D,
4394 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4395 VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
4396 0, &formatProps);
4397 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
4398 return;
4399 }
4400
4401 ASSERT_NO_FATAL_FAILURE(InitState());
4402 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
4403 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
4404 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4405 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
4406 VkAttachmentDescription att = {};
4407 VkAttachmentReference ref = {};
4408 att.format = depth_stencil_fmt;
4409 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
4410 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
4411 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
4412 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
4413 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4414 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4415
4416 VkClearValue clear;
4417 clear.depthStencil.depth = 1.0;
4418 clear.depthStencil.stencil = 0;
4419 ref.attachment = 0;
4420 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4421
4422 VkSubpassDescription subpass = {};
4423 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
4424 subpass.flags = 0;
4425 subpass.inputAttachmentCount = 0;
4426 subpass.pInputAttachments = NULL;
4427 subpass.colorAttachmentCount = 0;
4428 subpass.pColorAttachments = NULL;
4429 subpass.pResolveAttachments = NULL;
4430 subpass.pDepthStencilAttachment = &ref;
4431 subpass.preserveAttachmentCount = 0;
4432 subpass.pPreserveAttachments = NULL;
4433
4434 VkRenderPass rp;
4435 VkRenderPassCreateInfo rp_info = {};
4436 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4437 rp_info.attachmentCount = 1;
4438 rp_info.pAttachments = &att;
4439 rp_info.subpassCount = 1;
4440 rp_info.pSubpasses = &subpass;
4441 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
4442 ASSERT_VK_SUCCESS(result);
4443
4444 VkImageView *depthView = m_depthStencil->BindInfo();
4445 VkFramebufferCreateInfo fb_info = {};
4446 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4447 fb_info.pNext = NULL;
4448 fb_info.renderPass = rp;
4449 fb_info.attachmentCount = 1;
4450 fb_info.pAttachments = depthView;
4451 fb_info.width = 100;
4452 fb_info.height = 100;
4453 fb_info.layers = 1;
4454 VkFramebuffer fb;
4455 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4456 ASSERT_VK_SUCCESS(result);
4457
4458
4459 VkRenderPassBeginInfo rpbinfo = {};
4460 rpbinfo.clearValueCount = 1;
4461 rpbinfo.pClearValues = &clear;
4462 rpbinfo.pNext = NULL;
4463 rpbinfo.renderPass = rp;
4464 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4465 rpbinfo.renderArea.extent.width = 100;
4466 rpbinfo.renderArea.extent.height = 100;
4467 rpbinfo.renderArea.offset.x = 0;
4468 rpbinfo.renderArea.offset.y = 0;
4469 rpbinfo.framebuffer = fb;
4470
4471 VkFence fence = {};
4472 VkFenceCreateInfo fence_ci = {};
4473 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4474 fence_ci.pNext = nullptr;
4475 fence_ci.flags = 0;
4476 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
4477 ASSERT_VK_SUCCESS(result);
4478
4479
4480 m_commandBuffer->BeginCommandBuffer();
4481 m_commandBuffer->BeginRenderPass(rpbinfo);
4482 m_commandBuffer->EndRenderPass();
4483 m_commandBuffer->EndCommandBuffer();
4484 m_commandBuffer->QueueCommandBuffer(fence);
4485
4486 VkImageObj destImage(m_device);
4487 destImage.init(100, 100, depth_stencil_fmt,
4488 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4489 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4490 VK_IMAGE_TILING_OPTIMAL, 0);
4491 VkImageMemoryBarrier barrier = {};
4492 VkImageSubresourceRange range;
4493 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4494 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4495 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4496 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT |
4497 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
4498 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4499 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
4500 barrier.image = m_depthStencil->handle();
4501 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4502 range.baseMipLevel = 0;
4503 range.levelCount = 1;
4504 range.baseArrayLayer = 0;
4505 range.layerCount = 1;
4506 barrier.subresourceRange = range;
4507 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4508 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
4509 cmdbuf.BeginCommandBuffer();
4510 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4511 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4512 nullptr, 1, &barrier);
4513 barrier.srcAccessMask = 0;
4514 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4515 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
4516 barrier.image = destImage.handle();
4517 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4518 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4519 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4520 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4521 nullptr, 1, &barrier);
4522 VkImageCopy cregion;
4523 cregion.srcSubresource.aspectMask =
4524 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4525 cregion.srcSubresource.mipLevel = 0;
4526 cregion.srcSubresource.baseArrayLayer = 0;
4527 cregion.srcSubresource.layerCount = 1;
4528 cregion.srcOffset.x = 0;
4529 cregion.srcOffset.y = 0;
4530 cregion.srcOffset.z = 0;
4531 cregion.dstSubresource.aspectMask =
4532 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4533 cregion.dstSubresource.mipLevel = 0;
4534 cregion.dstSubresource.baseArrayLayer = 0;
4535 cregion.dstSubresource.layerCount = 1;
4536 cregion.dstOffset.x = 0;
4537 cregion.dstOffset.y = 0;
4538 cregion.dstOffset.z = 0;
4539 cregion.extent.width = 100;
4540 cregion.extent.height = 100;
4541 cregion.extent.depth = 1;
4542 cmdbuf.CopyImage(m_depthStencil->handle(),
4543 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
4544 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
4545 cmdbuf.EndCommandBuffer();
4546
4547 VkSubmitInfo submit_info;
4548 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4549 submit_info.pNext = NULL;
4550 submit_info.waitSemaphoreCount = 0;
4551 submit_info.pWaitSemaphores = NULL;
4552 submit_info.pWaitDstStageMask = NULL;
4553 submit_info.commandBufferCount = 1;
4554 submit_info.pCommandBuffers = &cmdbuf.handle();
4555 submit_info.signalSemaphoreCount = 0;
4556 submit_info.pSignalSemaphores = NULL;
4557
4558 m_errorMonitor->ExpectSuccess();
4559 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4560 m_errorMonitor->VerifyNotFound();
4561
Mark Lobodzinskid0440da2016-06-17 15:10:03 -06004562 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004563 vkDestroyFence(m_device->device(), fence, nullptr);
4564 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4565 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4566}
4567
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004568TEST_F(VkLayerTest, UnusedPreserveAttachment) {
4569 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
4570 "attachment reference of VK_ATTACHMENT_UNUSED");
4571
4572 ASSERT_NO_FATAL_FAILURE(InitState());
4573 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4574
4575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4576 "must not be VK_ATTACHMENT_UNUSED");
4577
4578 VkAttachmentReference color_attach = {};
4579 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4580 color_attach.attachment = 0;
4581 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
4582 VkSubpassDescription subpass = {};
4583 subpass.colorAttachmentCount = 1;
4584 subpass.pColorAttachments = &color_attach;
4585 subpass.preserveAttachmentCount = 1;
4586 subpass.pPreserveAttachments = &preserve_attachment;
4587
4588 VkRenderPassCreateInfo rpci = {};
4589 rpci.subpassCount = 1;
4590 rpci.pSubpasses = &subpass;
4591 rpci.attachmentCount = 1;
4592 VkAttachmentDescription attach_desc = {};
4593 attach_desc.format = VK_FORMAT_UNDEFINED;
4594 rpci.pAttachments = &attach_desc;
4595 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4596 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004597 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004598
4599 m_errorMonitor->VerifyFound();
4600
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004601 if (result == VK_SUCCESS) {
4602 vkDestroyRenderPass(m_device->device(), rp, NULL);
4603 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004604}
4605
Chris Forbesc5389742016-06-29 11:49:23 +12004606TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004607 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
4608 "when the source of a subpass multisample resolve "
4609 "does not have multiple samples.");
4610
Chris Forbesc5389742016-06-29 11:49:23 +12004611 ASSERT_NO_FATAL_FAILURE(InitState());
4612
4613 m_errorMonitor->SetDesiredFailureMsg(
4614 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbes6655bb32016-07-01 18:27:30 +12004615 "Subpass 0 requests multisample resolve from attachment 0 which has "
4616 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12004617
4618 VkAttachmentDescription attachments[] = {
4619 {
4620 0, VK_FORMAT_R8G8B8A8_UNORM,
4621 VK_SAMPLE_COUNT_1_BIT,
4622 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4623 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4624 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4625 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4626 },
4627 {
4628 0, VK_FORMAT_R8G8B8A8_UNORM,
4629 VK_SAMPLE_COUNT_1_BIT,
4630 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4631 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4632 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4633 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4634 },
4635 };
4636
4637 VkAttachmentReference color = {
4638 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4639 };
4640
4641 VkAttachmentReference resolve = {
4642 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4643 };
4644
4645 VkSubpassDescription subpass = {
4646 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4647 0, nullptr,
4648 1, &color,
4649 &resolve,
4650 nullptr,
4651 0, nullptr
4652 };
4653
4654 VkRenderPassCreateInfo rpci = {
4655 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4656 0, 2, attachments, 1, &subpass, 0, nullptr
4657 };
4658
4659 VkRenderPass rp;
4660 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4661
4662 m_errorMonitor->VerifyFound();
4663
4664 if (err == VK_SUCCESS)
4665 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4666}
4667
4668TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004669 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4670 "when a subpass multisample resolve operation is "
4671 "requested, and the destination of that resolve has "
4672 "multiple samples.");
4673
Chris Forbesc5389742016-06-29 11:49:23 +12004674 ASSERT_NO_FATAL_FAILURE(InitState());
4675
4676 m_errorMonitor->SetDesiredFailureMsg(
4677 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4678 "Subpass 0 requests multisample resolve into attachment 1, which "
4679 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
4680
4681 VkAttachmentDescription attachments[] = {
4682 {
4683 0, VK_FORMAT_R8G8B8A8_UNORM,
4684 VK_SAMPLE_COUNT_4_BIT,
4685 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4686 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4687 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4688 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4689 },
4690 {
4691 0, VK_FORMAT_R8G8B8A8_UNORM,
4692 VK_SAMPLE_COUNT_4_BIT,
4693 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4694 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4695 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4696 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4697 },
4698 };
4699
4700 VkAttachmentReference color = {
4701 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4702 };
4703
4704 VkAttachmentReference resolve = {
4705 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4706 };
4707
4708 VkSubpassDescription subpass = {
4709 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4710 0, nullptr,
4711 1, &color,
4712 &resolve,
4713 nullptr,
4714 0, nullptr
4715 };
4716
4717 VkRenderPassCreateInfo rpci = {
4718 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4719 0, 2, attachments, 1, &subpass, 0, nullptr
4720 };
4721
4722 VkRenderPass rp;
4723 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4724
4725 m_errorMonitor->VerifyFound();
4726
4727 if (err == VK_SUCCESS)
4728 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4729}
4730
Chris Forbes3f128ef2016-06-29 14:58:53 +12004731TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004732 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4733 "when the color and depth attachments used by a subpass "
4734 "have inconsistent sample counts");
4735
Chris Forbes3f128ef2016-06-29 14:58:53 +12004736 ASSERT_NO_FATAL_FAILURE(InitState());
4737
4738 m_errorMonitor->SetDesiredFailureMsg(
4739 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4740 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
4741
4742 VkAttachmentDescription attachments[] = {
4743 {
4744 0, VK_FORMAT_R8G8B8A8_UNORM,
4745 VK_SAMPLE_COUNT_1_BIT,
4746 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4747 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4748 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4749 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4750 },
4751 {
4752 0, VK_FORMAT_R8G8B8A8_UNORM,
4753 VK_SAMPLE_COUNT_4_BIT,
4754 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4755 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4756 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4757 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4758 },
4759 };
4760
4761 VkAttachmentReference color[] = {
4762 {
4763 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4764 },
4765 {
4766 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4767 },
4768 };
4769
4770 VkSubpassDescription subpass = {
4771 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4772 0, nullptr,
4773 2, color,
4774 nullptr,
4775 nullptr,
4776 0, nullptr
4777 };
4778
4779 VkRenderPassCreateInfo rpci = {
4780 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4781 0, 2, attachments, 1, &subpass, 0, nullptr
4782 };
4783
4784 VkRenderPass rp;
4785 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4786
4787 m_errorMonitor->VerifyFound();
4788
4789 if (err == VK_SUCCESS)
4790 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4791}
4792
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004793TEST_F(VkLayerTest, FramebufferCreateErrors) {
4794 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
4795 " 1. Mismatch between fb & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004796 " 2. Use a color image as depthStencil attachment\n"
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004797 " 3. Mismatch fb & renderPass attachment formats\n"
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004798 " 4. Mismatch fb & renderPass attachment #samples\n"
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004799 " 5. FB attachment w/ non-1 mip-levels\n"
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004800 " 6. FB attachment where dimensions don't match\n"
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004801 " 7. FB attachment w/o identity swizzle\n"
4802 " 8. FB dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004803
4804 ASSERT_NO_FATAL_FAILURE(InitState());
4805 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4806
4807 m_errorMonitor->SetDesiredFailureMsg(
4808 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004809 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
4810 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004811
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004812 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004813 VkAttachmentReference attach = {};
4814 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4815 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004816 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004817 VkRenderPassCreateInfo rpci = {};
4818 rpci.subpassCount = 1;
4819 rpci.pSubpasses = &subpass;
4820 rpci.attachmentCount = 1;
4821 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004822 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004823 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004824 rpci.pAttachments = &attach_desc;
4825 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4826 VkRenderPass rp;
4827 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4828 ASSERT_VK_SUCCESS(err);
4829
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004830 VkImageView ivs[2];
4831 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
4832 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004833 VkFramebufferCreateInfo fb_info = {};
4834 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4835 fb_info.pNext = NULL;
4836 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004837 // Set mis-matching attachmentCount
4838 fb_info.attachmentCount = 2;
4839 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004840 fb_info.width = 100;
4841 fb_info.height = 100;
4842 fb_info.layers = 1;
4843
4844 VkFramebuffer fb;
4845 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4846
4847 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004848 if (err == VK_SUCCESS) {
4849 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4850 }
4851 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004852
4853 // Create a renderPass with a depth-stencil attachment created with
4854 // IMAGE_USAGE_COLOR_ATTACHMENT
4855 // Add our color attachment to pDepthStencilAttachment
4856 subpass.pDepthStencilAttachment = &attach;
4857 subpass.pColorAttachments = NULL;
4858 VkRenderPass rp_ds;
4859 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
4860 ASSERT_VK_SUCCESS(err);
4861 // Set correct attachment count, but attachment has COLOR usage bit set
4862 fb_info.attachmentCount = 1;
4863 fb_info.renderPass = rp_ds;
4864
4865 m_errorMonitor->SetDesiredFailureMsg(
4866 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4867 " conflicts with the image's IMAGE_USAGE flags ");
4868 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4869
4870 m_errorMonitor->VerifyFound();
4871 if (err == VK_SUCCESS) {
4872 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4873 }
4874 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004875
4876 // Create new renderpass with alternate attachment format from fb
4877 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
4878 subpass.pDepthStencilAttachment = NULL;
4879 subpass.pColorAttachments = &attach;
4880 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4881 ASSERT_VK_SUCCESS(err);
4882
4883 // Cause error due to mis-matched formats between rp & fb
4884 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
4885 fb_info.renderPass = rp;
4886 m_errorMonitor->SetDesiredFailureMsg(
4887 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4888 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
4889 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4890
4891 m_errorMonitor->VerifyFound();
4892 if (err == VK_SUCCESS) {
4893 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4894 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004895 vkDestroyRenderPass(m_device->device(), rp, NULL);
4896
4897 // Create new renderpass with alternate sample count from fb
4898 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4899 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
4900 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4901 ASSERT_VK_SUCCESS(err);
4902
4903 // Cause error due to mis-matched sample count between rp & fb
4904 fb_info.renderPass = rp;
4905 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4906 " has VK_SAMPLE_COUNT_1_BIT samples "
4907 "that do not match the "
4908 "VK_SAMPLE_COUNT_4_BIT ");
4909 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4910
4911 m_errorMonitor->VerifyFound();
4912 if (err == VK_SUCCESS) {
4913 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4914 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004915
4916 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004917
4918 // Create a custom imageView with non-1 mip levels
4919 VkImageObj image(m_device);
4920 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
4921 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4922 ASSERT_TRUE(image.initialized());
4923
4924 VkImageView view;
4925 VkImageViewCreateInfo ivci = {};
4926 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4927 ivci.image = image.handle();
4928 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4929 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4930 ivci.subresourceRange.layerCount = 1;
4931 ivci.subresourceRange.baseMipLevel = 0;
4932 // Set level count 2 (only 1 is allowed for FB attachment)
4933 ivci.subresourceRange.levelCount = 2;
4934 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4935 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4936 ASSERT_VK_SUCCESS(err);
4937 // Re-create renderpass to have matching sample count
4938 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4939 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4940 ASSERT_VK_SUCCESS(err);
4941
4942 fb_info.renderPass = rp;
4943 fb_info.pAttachments = &view;
4944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4945 " has mip levelCount of 2 but only ");
4946 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4947
4948 m_errorMonitor->VerifyFound();
4949 if (err == VK_SUCCESS) {
4950 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4951 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004952 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004953 // Update view to original color buffer and grow FB dimensions too big
4954 fb_info.pAttachments = ivs;
4955 fb_info.height = 1024;
4956 fb_info.width = 1024;
4957 fb_info.layers = 2;
4958 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4959 " Attachment dimensions must be at "
4960 "least as large. ");
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 Ehlisb1f303b2016-06-23 08:19:55 -06004967 // Create view attachment with non-identity swizzle
4968 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4969 ivci.image = image.handle();
4970 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4971 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4972 ivci.subresourceRange.layerCount = 1;
4973 ivci.subresourceRange.baseMipLevel = 0;
4974 ivci.subresourceRange.levelCount = 1;
4975 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4976 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4977 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4978 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4979 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4980 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4981 ASSERT_VK_SUCCESS(err);
4982
4983 fb_info.pAttachments = &view;
4984 fb_info.height = 100;
4985 fb_info.width = 100;
4986 fb_info.layers = 1;
4987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4988 " has non-identy swizzle. All "
4989 "framebuffer attachments must have "
4990 "been created with the identity "
4991 "swizzle. ");
4992 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4993
4994 m_errorMonitor->VerifyFound();
4995 if (err == VK_SUCCESS) {
4996 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4997 }
4998 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004999 // Request fb that exceeds max dimensions
5000 // reset attachment to color attachment
5001 fb_info.pAttachments = ivs;
5002 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
5003 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
5004 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
5005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5006 " Requested VkFramebufferCreateInfo "
5007 "dimensions exceed physical device "
5008 "limits. ");
5009 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5010
5011 m_errorMonitor->VerifyFound();
5012 if (err == VK_SUCCESS) {
5013 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5014 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06005015
Tobin Ehlis6cfda642016-06-22 16:12:58 -06005016 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06005017}
5018
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005019// This is a positive test. No errors should be generated.
Michael Lentine860b0fe2016-05-20 10:14:00 -05005020TEST_F(VkLayerTest, WaitEventThenSet) {
5021 TEST_DESCRIPTION(
5022 "Wait on a event then set it after the wait has been submitted.");
5023
Michael Lentine860b0fe2016-05-20 10:14:00 -05005024 m_errorMonitor->ExpectSuccess();
Tony Barbour6514a6b2016-08-12 09:37:19 -06005025 ASSERT_NO_FATAL_FAILURE(InitState());
Michael Lentine860b0fe2016-05-20 10:14:00 -05005026
5027 VkEvent event;
5028 VkEventCreateInfo event_create_info{};
5029 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5030 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
5031
5032 VkCommandPool command_pool;
5033 VkCommandPoolCreateInfo pool_create_info{};
5034 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5035 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5036 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5037 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5038 &command_pool);
5039
5040 VkCommandBuffer command_buffer;
5041 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5042 command_buffer_allocate_info.sType =
5043 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5044 command_buffer_allocate_info.commandPool = command_pool;
5045 command_buffer_allocate_info.commandBufferCount = 1;
5046 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5047 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5048 &command_buffer);
5049
5050 VkQueue queue = VK_NULL_HANDLE;
5051 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06005052 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005053
5054 {
5055 VkCommandBufferBeginInfo begin_info{};
5056 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5057 vkBeginCommandBuffer(command_buffer, &begin_info);
5058
5059 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT,
5060 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
5061 nullptr, 0, nullptr);
5062 vkCmdResetEvent(command_buffer, event,
5063 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
5064 vkEndCommandBuffer(command_buffer);
5065 }
5066 {
5067 VkSubmitInfo submit_info{};
5068 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5069 submit_info.commandBufferCount = 1;
5070 submit_info.pCommandBuffers = &command_buffer;
5071 submit_info.signalSemaphoreCount = 0;
5072 submit_info.pSignalSemaphores = nullptr;
5073 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5074 }
5075 { vkSetEvent(m_device->device(), event); }
5076
5077 vkQueueWaitIdle(queue);
5078
5079 vkDestroyEvent(m_device->device(), event, nullptr);
5080 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5081 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5082
5083 m_errorMonitor->VerifyNotFound();
5084}
Michael Lentine5627e692016-05-20 17:45:02 -05005085// This is a positive test. No errors should be generated.
Michael Lentinef01fb382016-07-21 17:24:56 -05005086TEST_F(VkLayerTest, QueryAndCopySecondaryCommandBuffers) {
5087 TEST_DESCRIPTION(
5088 "Issue a query on a secondary command buffery and copy it on a primary.");
5089
Tony Barbour6514a6b2016-08-12 09:37:19 -06005090 ASSERT_NO_FATAL_FAILURE(InitState());
Michael Lentinef01fb382016-07-21 17:24:56 -05005091 if ((m_device->queue_props.empty()) ||
5092 (m_device->queue_props[0].queueCount < 2))
5093 return;
5094
5095 m_errorMonitor->ExpectSuccess();
5096
5097 VkQueryPool query_pool;
5098 VkQueryPoolCreateInfo query_pool_create_info{};
5099 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5100 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
5101 query_pool_create_info.queryCount = 1;
5102 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
5103 &query_pool);
5104
5105 VkCommandPool command_pool;
5106 VkCommandPoolCreateInfo pool_create_info{};
5107 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5108 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5109 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5110 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5111 &command_pool);
5112
5113 VkCommandBuffer command_buffer;
5114 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5115 command_buffer_allocate_info.sType =
5116 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5117 command_buffer_allocate_info.commandPool = command_pool;
5118 command_buffer_allocate_info.commandBufferCount = 1;
5119 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5120 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5121 &command_buffer);
5122
5123 VkCommandBuffer secondary_command_buffer;
5124 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5125 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5126 &secondary_command_buffer);
5127
5128 VkQueue queue = VK_NULL_HANDLE;
5129 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5130 1, &queue);
5131
5132 uint32_t qfi = 0;
5133 VkBufferCreateInfo buff_create_info = {};
5134 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5135 buff_create_info.size = 1024;
5136 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
5137 buff_create_info.queueFamilyIndexCount = 1;
5138 buff_create_info.pQueueFamilyIndices = &qfi;
5139
5140 VkResult err;
5141 VkBuffer buffer;
5142 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
5143 ASSERT_VK_SUCCESS(err);
5144 VkMemoryAllocateInfo mem_alloc = {};
5145 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5146 mem_alloc.pNext = NULL;
5147 mem_alloc.allocationSize = 1024;
5148 mem_alloc.memoryTypeIndex = 0;
5149
5150 VkMemoryRequirements memReqs;
5151 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
5152 bool pass =
5153 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
5154 if (!pass) {
5155 vkDestroyBuffer(m_device->device(), buffer, NULL);
5156 return;
5157 }
5158
5159 VkDeviceMemory mem;
5160 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5161 ASSERT_VK_SUCCESS(err);
5162 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5163 ASSERT_VK_SUCCESS(err);
5164
5165 VkCommandBufferInheritanceInfo hinfo = {};
5166 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
5167 hinfo.renderPass = VK_NULL_HANDLE;
5168 hinfo.subpass = 0;
5169 hinfo.framebuffer = VK_NULL_HANDLE;
5170 hinfo.occlusionQueryEnable = VK_FALSE;
5171 hinfo.queryFlags = 0;
5172 hinfo.pipelineStatistics = 0;
5173
5174 {
5175 VkCommandBufferBeginInfo begin_info{};
5176 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5177 begin_info.pInheritanceInfo = &hinfo;
5178 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
5179
5180 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
5181 vkCmdWriteTimestamp(secondary_command_buffer,
5182 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
5183
5184 vkEndCommandBuffer(secondary_command_buffer);
5185
5186 begin_info.pInheritanceInfo = nullptr;
5187 vkBeginCommandBuffer(command_buffer, &begin_info);
5188
5189 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
5190 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer,
5191 0, 0, 0);
5192
5193 vkEndCommandBuffer(command_buffer);
5194 }
5195 {
5196 VkSubmitInfo submit_info{};
5197 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5198 submit_info.commandBufferCount = 1;
5199 submit_info.pCommandBuffers = &command_buffer;
5200 submit_info.signalSemaphoreCount = 0;
5201 submit_info.pSignalSemaphores = nullptr;
5202 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5203 }
5204
5205 vkQueueWaitIdle(queue);
5206
5207 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
5208 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5209 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
5210 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5211 vkDestroyBuffer(m_device->device(), buffer, NULL);
5212 vkFreeMemory(m_device->device(), mem, NULL);
5213
5214 m_errorMonitor->VerifyNotFound();
5215}
5216
5217// This is a positive test. No errors should be generated.
Michael Lentine5627e692016-05-20 17:45:02 -05005218TEST_F(VkLayerTest, QueryAndCopyMultipleCommandBuffers) {
5219 TEST_DESCRIPTION(
5220 "Issue a query and copy from it on a second command buffer.");
5221
Tony Barbour6514a6b2016-08-12 09:37:19 -06005222 ASSERT_NO_FATAL_FAILURE(InitState());
Michael Lentine5627e692016-05-20 17:45:02 -05005223 if ((m_device->queue_props.empty()) ||
5224 (m_device->queue_props[0].queueCount < 2))
5225 return;
5226
5227 m_errorMonitor->ExpectSuccess();
5228
5229 VkQueryPool query_pool;
5230 VkQueryPoolCreateInfo query_pool_create_info{};
5231 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5232 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
5233 query_pool_create_info.queryCount = 1;
5234 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
5235 &query_pool);
5236
5237 VkCommandPool command_pool;
5238 VkCommandPoolCreateInfo pool_create_info{};
5239 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5240 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5241 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5242 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5243 &command_pool);
5244
5245 VkCommandBuffer command_buffer[2];
5246 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5247 command_buffer_allocate_info.sType =
5248 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5249 command_buffer_allocate_info.commandPool = command_pool;
5250 command_buffer_allocate_info.commandBufferCount = 2;
5251 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5252 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5253 command_buffer);
5254
5255 VkQueue queue = VK_NULL_HANDLE;
5256 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5257 1, &queue);
5258
5259 uint32_t qfi = 0;
5260 VkBufferCreateInfo buff_create_info = {};
5261 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5262 buff_create_info.size = 1024;
5263 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
5264 buff_create_info.queueFamilyIndexCount = 1;
5265 buff_create_info.pQueueFamilyIndices = &qfi;
5266
5267 VkResult err;
5268 VkBuffer buffer;
5269 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
5270 ASSERT_VK_SUCCESS(err);
5271 VkMemoryAllocateInfo mem_alloc = {};
5272 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5273 mem_alloc.pNext = NULL;
5274 mem_alloc.allocationSize = 1024;
5275 mem_alloc.memoryTypeIndex = 0;
5276
5277 VkMemoryRequirements memReqs;
5278 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
5279 bool pass =
5280 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
5281 if (!pass) {
5282 vkDestroyBuffer(m_device->device(), buffer, NULL);
5283 return;
5284 }
5285
5286 VkDeviceMemory mem;
5287 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5288 ASSERT_VK_SUCCESS(err);
5289 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5290 ASSERT_VK_SUCCESS(err);
5291
5292 {
5293 VkCommandBufferBeginInfo begin_info{};
5294 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5295 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5296
5297 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
5298 vkCmdWriteTimestamp(command_buffer[0],
5299 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
5300
5301 vkEndCommandBuffer(command_buffer[0]);
5302
5303 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5304
5305 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer,
5306 0, 0, 0);
5307
5308 vkEndCommandBuffer(command_buffer[1]);
5309 }
5310 {
5311 VkSubmitInfo submit_info{};
5312 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5313 submit_info.commandBufferCount = 2;
5314 submit_info.pCommandBuffers = command_buffer;
5315 submit_info.signalSemaphoreCount = 0;
5316 submit_info.pSignalSemaphores = nullptr;
5317 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5318 }
5319
5320 vkQueueWaitIdle(queue);
5321
5322 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
5323 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
5324 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06005325 vkDestroyBuffer(m_device->device(), buffer, NULL);
5326 vkFreeMemory(m_device->device(), mem, NULL);
Michael Lentine5627e692016-05-20 17:45:02 -05005327
5328 m_errorMonitor->VerifyNotFound();
5329}
Michael Lentine860b0fe2016-05-20 10:14:00 -05005330
5331TEST_F(VkLayerTest, ResetEventThenSet) {
5332 TEST_DESCRIPTION(
5333 "Reset an event then set it after the reset has been submitted.");
5334
Michael Lentine860b0fe2016-05-20 10:14:00 -05005335 m_errorMonitor->ExpectSuccess();
5336
Tony Barbour6514a6b2016-08-12 09:37:19 -06005337 ASSERT_NO_FATAL_FAILURE(InitState());
Michael Lentine860b0fe2016-05-20 10:14:00 -05005338 VkEvent event;
5339 VkEventCreateInfo event_create_info{};
5340 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5341 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
5342
5343 VkCommandPool command_pool;
5344 VkCommandPoolCreateInfo pool_create_info{};
5345 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5346 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5347 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5348 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5349 &command_pool);
5350
5351 VkCommandBuffer command_buffer;
5352 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5353 command_buffer_allocate_info.sType =
5354 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5355 command_buffer_allocate_info.commandPool = command_pool;
5356 command_buffer_allocate_info.commandBufferCount = 1;
5357 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5358 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5359 &command_buffer);
5360
5361 VkQueue queue = VK_NULL_HANDLE;
5362 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06005363 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005364
5365 {
5366 VkCommandBufferBeginInfo begin_info{};
5367 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5368 vkBeginCommandBuffer(command_buffer, &begin_info);
5369
5370 vkCmdResetEvent(command_buffer, event,
5371 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
5372 vkCmdWaitEvents(command_buffer, 1, &event,
5373 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5374 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
5375 nullptr, 0, nullptr);
5376 vkEndCommandBuffer(command_buffer);
5377 }
5378 {
5379 VkSubmitInfo submit_info{};
5380 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5381 submit_info.commandBufferCount = 1;
5382 submit_info.pCommandBuffers = &command_buffer;
5383 submit_info.signalSemaphoreCount = 0;
5384 submit_info.pSignalSemaphores = nullptr;
5385 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5386 }
5387 {
Tony Barbour6514a6b2016-08-12 09:37:19 -06005388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5389 "that is already in use by a "
5390 "command buffer.");
Michael Lentine860b0fe2016-05-20 10:14:00 -05005391 vkSetEvent(m_device->device(), event);
5392 m_errorMonitor->VerifyFound();
5393 }
5394
5395 vkQueueWaitIdle(queue);
5396
5397 vkDestroyEvent(m_device->device(), event, nullptr);
5398 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5399 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5400}
5401
5402// This is a positive test. No errors should be generated.
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005403TEST_F(VkLayerTest, TwoFencesThreeFrames) {
5404 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
5405 "run through a Submit & WaitForFences cycle 3 times. This "
5406 "previously revealed a bug so running this positive test "
5407 "to prevent a regression.");
5408 m_errorMonitor->ExpectSuccess();
5409
5410 ASSERT_NO_FATAL_FAILURE(InitState());
5411 VkQueue queue = VK_NULL_HANDLE;
5412 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5413 0, &queue);
5414
5415 static const uint32_t NUM_OBJECTS = 2;
5416 static const uint32_t NUM_FRAMES = 3;
5417 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
5418 VkFence fences[NUM_OBJECTS] = {};
5419
5420 VkCommandPool cmd_pool;
5421 VkCommandPoolCreateInfo cmd_pool_ci = {};
5422 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5423 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
5424 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5425 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci,
5426 nullptr, &cmd_pool);
5427 ASSERT_VK_SUCCESS(err);
5428
5429 VkCommandBufferAllocateInfo cmd_buf_info = {};
5430 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5431 cmd_buf_info.commandPool = cmd_pool;
5432 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5433 cmd_buf_info.commandBufferCount = 1;
5434
5435 VkFenceCreateInfo fence_ci = {};
5436 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5437 fence_ci.pNext = nullptr;
5438 fence_ci.flags = 0;
5439
5440 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
5441 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info,
5442 &cmd_buffers[i]);
5443 ASSERT_VK_SUCCESS(err);
5444 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
5445 ASSERT_VK_SUCCESS(err);
5446 }
5447
5448 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
Tobin Ehlisf9025162016-05-26 06:55:21 -06005449 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
5450 // Create empty cmd buffer
5451 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
5452 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005453
Tobin Ehlisf9025162016-05-26 06:55:21 -06005454 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
5455 ASSERT_VK_SUCCESS(err);
5456 err = vkEndCommandBuffer(cmd_buffers[obj]);
5457 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005458
Tobin Ehlisf9025162016-05-26 06:55:21 -06005459 VkSubmitInfo submit_info = {};
5460 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5461 submit_info.commandBufferCount = 1;
5462 submit_info.pCommandBuffers = &cmd_buffers[obj];
5463 // Submit cmd buffer and wait for fence
5464 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
5465 ASSERT_VK_SUCCESS(err);
5466 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE,
5467 UINT64_MAX);
5468 ASSERT_VK_SUCCESS(err);
5469 err = vkResetFences(m_device->device(), 1, &fences[obj]);
5470 ASSERT_VK_SUCCESS(err);
5471 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005472 }
5473 m_errorMonitor->VerifyNotFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06005474 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
5475 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
5476 vkDestroyFence(m_device->device(), fences[i], nullptr);
5477 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005478}
5479// This is a positive test. No errors should be generated.
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005480TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
5481
5482 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5483 "submitted on separate queues followed by a QueueWaitIdle.");
5484
Tony Barbour6514a6b2016-08-12 09:37:19 -06005485 ASSERT_NO_FATAL_FAILURE(InitState());
Dustin Graves48458142016-04-29 16:11:55 -06005486 if ((m_device->queue_props.empty()) ||
5487 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005488 return;
5489
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005490 m_errorMonitor->ExpectSuccess();
5491
5492 VkSemaphore semaphore;
5493 VkSemaphoreCreateInfo semaphore_create_info{};
5494 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5495 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5496 &semaphore);
5497
5498 VkCommandPool command_pool;
5499 VkCommandPoolCreateInfo pool_create_info{};
5500 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5501 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5502 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5503 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5504 &command_pool);
5505
5506 VkCommandBuffer command_buffer[2];
5507 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5508 command_buffer_allocate_info.sType =
5509 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5510 command_buffer_allocate_info.commandPool = command_pool;
5511 command_buffer_allocate_info.commandBufferCount = 2;
5512 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5513 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5514 command_buffer);
5515
5516 VkQueue queue = VK_NULL_HANDLE;
5517 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5518 1, &queue);
5519
5520 {
5521 VkCommandBufferBeginInfo begin_info{};
5522 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5523 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5524
5525 vkCmdPipelineBarrier(command_buffer[0],
5526 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5527 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5528 0, nullptr, 0, nullptr);
5529
5530 VkViewport viewport{};
5531 viewport.maxDepth = 1.0f;
5532 viewport.minDepth = 0.0f;
5533 viewport.width = 512;
5534 viewport.height = 512;
5535 viewport.x = 0;
5536 viewport.y = 0;
5537 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5538 vkEndCommandBuffer(command_buffer[0]);
5539 }
5540 {
5541 VkCommandBufferBeginInfo begin_info{};
5542 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5543 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5544
5545 VkViewport viewport{};
5546 viewport.maxDepth = 1.0f;
5547 viewport.minDepth = 0.0f;
5548 viewport.width = 512;
5549 viewport.height = 512;
5550 viewport.x = 0;
5551 viewport.y = 0;
5552 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5553 vkEndCommandBuffer(command_buffer[1]);
5554 }
5555 {
5556 VkSubmitInfo submit_info{};
5557 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5558 submit_info.commandBufferCount = 1;
5559 submit_info.pCommandBuffers = &command_buffer[0];
5560 submit_info.signalSemaphoreCount = 1;
5561 submit_info.pSignalSemaphores = &semaphore;
5562 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5563 }
5564 {
5565 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5566 VkSubmitInfo submit_info{};
5567 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5568 submit_info.commandBufferCount = 1;
5569 submit_info.pCommandBuffers = &command_buffer[1];
5570 submit_info.waitSemaphoreCount = 1;
5571 submit_info.pWaitSemaphores = &semaphore;
5572 submit_info.pWaitDstStageMask = flags;
5573 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5574 }
5575
5576 vkQueueWaitIdle(m_device->m_queue);
5577
5578 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5579 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5580 &command_buffer[0]);
5581 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5582
5583 m_errorMonitor->VerifyNotFound();
5584}
5585
5586// This is a positive test. No errors should be generated.
5587TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
5588
5589 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5590 "submitted on separate queues, the second having a fence"
5591 "followed by a QueueWaitIdle.");
5592
Tony Barbour6514a6b2016-08-12 09:37:19 -06005593 ASSERT_NO_FATAL_FAILURE(InitState());
Dustin Graves48458142016-04-29 16:11:55 -06005594 if ((m_device->queue_props.empty()) ||
5595 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005596 return;
5597
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005598 m_errorMonitor->ExpectSuccess();
5599
5600 VkFence fence;
5601 VkFenceCreateInfo fence_create_info{};
5602 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5603 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5604
5605 VkSemaphore semaphore;
5606 VkSemaphoreCreateInfo semaphore_create_info{};
5607 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5608 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5609 &semaphore);
5610
5611 VkCommandPool command_pool;
5612 VkCommandPoolCreateInfo pool_create_info{};
5613 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5614 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5615 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5616 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5617 &command_pool);
5618
5619 VkCommandBuffer command_buffer[2];
5620 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5621 command_buffer_allocate_info.sType =
5622 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5623 command_buffer_allocate_info.commandPool = command_pool;
5624 command_buffer_allocate_info.commandBufferCount = 2;
5625 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5626 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5627 command_buffer);
5628
5629 VkQueue queue = VK_NULL_HANDLE;
5630 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5631 1, &queue);
5632
5633 {
5634 VkCommandBufferBeginInfo begin_info{};
5635 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5636 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5637
5638 vkCmdPipelineBarrier(command_buffer[0],
5639 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5640 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5641 0, nullptr, 0, nullptr);
5642
5643 VkViewport viewport{};
5644 viewport.maxDepth = 1.0f;
5645 viewport.minDepth = 0.0f;
5646 viewport.width = 512;
5647 viewport.height = 512;
5648 viewport.x = 0;
5649 viewport.y = 0;
5650 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5651 vkEndCommandBuffer(command_buffer[0]);
5652 }
5653 {
5654 VkCommandBufferBeginInfo begin_info{};
5655 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5656 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5657
5658 VkViewport viewport{};
5659 viewport.maxDepth = 1.0f;
5660 viewport.minDepth = 0.0f;
5661 viewport.width = 512;
5662 viewport.height = 512;
5663 viewport.x = 0;
5664 viewport.y = 0;
5665 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5666 vkEndCommandBuffer(command_buffer[1]);
5667 }
5668 {
5669 VkSubmitInfo submit_info{};
5670 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5671 submit_info.commandBufferCount = 1;
5672 submit_info.pCommandBuffers = &command_buffer[0];
5673 submit_info.signalSemaphoreCount = 1;
5674 submit_info.pSignalSemaphores = &semaphore;
5675 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5676 }
5677 {
5678 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5679 VkSubmitInfo submit_info{};
5680 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5681 submit_info.commandBufferCount = 1;
5682 submit_info.pCommandBuffers = &command_buffer[1];
5683 submit_info.waitSemaphoreCount = 1;
5684 submit_info.pWaitSemaphores = &semaphore;
5685 submit_info.pWaitDstStageMask = flags;
5686 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5687 }
5688
5689 vkQueueWaitIdle(m_device->m_queue);
5690
5691 vkDestroyFence(m_device->device(), fence, nullptr);
5692 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5693 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5694 &command_buffer[0]);
5695 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5696
5697 m_errorMonitor->VerifyNotFound();
5698}
5699
5700// This is a positive test. No errors should be generated.
5701TEST_F(VkLayerTest,
5702 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
5703
5704 TEST_DESCRIPTION(
5705 "Two command buffers, each in a separate QueueSubmit call "
5706 "submitted on separate queues, the second having a fence"
5707 "followed by two consecutive WaitForFences calls on the same fence.");
5708
Tony Barbour6514a6b2016-08-12 09:37:19 -06005709 ASSERT_NO_FATAL_FAILURE(InitState());
Dustin Graves48458142016-04-29 16:11:55 -06005710 if ((m_device->queue_props.empty()) ||
5711 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005712 return;
5713
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005714 m_errorMonitor->ExpectSuccess();
5715
5716 VkFence fence;
5717 VkFenceCreateInfo fence_create_info{};
5718 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5719 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5720
5721 VkSemaphore semaphore;
5722 VkSemaphoreCreateInfo semaphore_create_info{};
5723 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5724 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5725 &semaphore);
5726
5727 VkCommandPool command_pool;
5728 VkCommandPoolCreateInfo pool_create_info{};
5729 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5730 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5731 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5732 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5733 &command_pool);
5734
5735 VkCommandBuffer command_buffer[2];
5736 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5737 command_buffer_allocate_info.sType =
5738 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5739 command_buffer_allocate_info.commandPool = command_pool;
5740 command_buffer_allocate_info.commandBufferCount = 2;
5741 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5742 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5743 command_buffer);
5744
5745 VkQueue queue = VK_NULL_HANDLE;
5746 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5747 1, &queue);
5748
5749 {
5750 VkCommandBufferBeginInfo begin_info{};
5751 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5752 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5753
5754 vkCmdPipelineBarrier(command_buffer[0],
5755 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5756 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5757 0, nullptr, 0, nullptr);
5758
5759 VkViewport viewport{};
5760 viewport.maxDepth = 1.0f;
5761 viewport.minDepth = 0.0f;
5762 viewport.width = 512;
5763 viewport.height = 512;
5764 viewport.x = 0;
5765 viewport.y = 0;
5766 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5767 vkEndCommandBuffer(command_buffer[0]);
5768 }
5769 {
5770 VkCommandBufferBeginInfo begin_info{};
5771 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5772 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5773
5774 VkViewport viewport{};
5775 viewport.maxDepth = 1.0f;
5776 viewport.minDepth = 0.0f;
5777 viewport.width = 512;
5778 viewport.height = 512;
5779 viewport.x = 0;
5780 viewport.y = 0;
5781 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5782 vkEndCommandBuffer(command_buffer[1]);
5783 }
5784 {
5785 VkSubmitInfo submit_info{};
5786 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5787 submit_info.commandBufferCount = 1;
5788 submit_info.pCommandBuffers = &command_buffer[0];
5789 submit_info.signalSemaphoreCount = 1;
5790 submit_info.pSignalSemaphores = &semaphore;
5791 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5792 }
5793 {
5794 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5795 VkSubmitInfo submit_info{};
5796 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5797 submit_info.commandBufferCount = 1;
5798 submit_info.pCommandBuffers = &command_buffer[1];
5799 submit_info.waitSemaphoreCount = 1;
5800 submit_info.pWaitSemaphores = &semaphore;
5801 submit_info.pWaitDstStageMask = flags;
5802 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5803 }
5804
5805 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5806 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5807
5808 vkDestroyFence(m_device->device(), fence, nullptr);
5809 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5810 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5811 &command_buffer[0]);
5812 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5813
5814 m_errorMonitor->VerifyNotFound();
5815}
5816
Chris Forbes0f8126b2016-06-20 17:48:22 +12005817TEST_F(VkLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour6514a6b2016-08-12 09:37:19 -06005818
5819 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes0f8126b2016-06-20 17:48:22 +12005820 if ((m_device->queue_props.empty()) ||
5821 (m_device->queue_props[0].queueCount < 2)) {
5822 printf("Test requires two queues, skipping\n");
5823 return;
5824 }
5825
5826 VkResult err;
5827
5828 m_errorMonitor->ExpectSuccess();
5829
5830 VkQueue q0 = m_device->m_queue;
5831 VkQueue q1 = nullptr;
5832 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
5833 ASSERT_NE(q1, nullptr);
5834
5835 // An (empty) command buffer. We must have work in the first submission --
5836 // the layer treats unfenced work differently from fenced work.
5837 VkCommandPoolCreateInfo cpci = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0 };
5838 VkCommandPool pool;
5839 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
5840 ASSERT_VK_SUCCESS(err);
5841 VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr,
5842 pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1
5843 };
5844 VkCommandBuffer cb;
5845 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
5846 ASSERT_VK_SUCCESS(err);
5847 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
5848 0, nullptr
5849 };
5850 err = vkBeginCommandBuffer(cb, &cbbi);
5851 ASSERT_VK_SUCCESS(err);
5852 err = vkEndCommandBuffer(cb);
5853 ASSERT_VK_SUCCESS(err);
5854
5855 // A semaphore
5856 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
5857 VkSemaphore s;
5858 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
5859 ASSERT_VK_SUCCESS(err);
5860
5861 // First submission, to q0
5862 VkSubmitInfo s0 = {
5863 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5864 0, nullptr, nullptr,
5865 1, &cb,
5866 1, &s
5867 };
5868
5869 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
5870 ASSERT_VK_SUCCESS(err);
5871
5872 // Second submission, to q1, waiting on s
5873 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
5874 VkSubmitInfo s1 = {
5875 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5876 1, &s, &waitmask,
5877 0, nullptr,
5878 0, nullptr
5879 };
5880
5881 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
5882 ASSERT_VK_SUCCESS(err);
5883
5884 // Wait for q0 idle
5885 err = vkQueueWaitIdle(q0);
5886 ASSERT_VK_SUCCESS(err);
5887
5888 // Command buffer should have been completed (it was on q0); reset the pool.
5889 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
5890
5891 m_errorMonitor->VerifyNotFound();
5892
5893 // Force device completely idle and clean up resources
5894 vkDeviceWaitIdle(m_device->device());
5895 vkDestroyCommandPool(m_device->device(), pool, nullptr);
5896 vkDestroySemaphore(m_device->device(), s, nullptr);
5897}
Chris Forbes0f8126b2016-06-20 17:48:22 +12005898
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005899// This is a positive test. No errors should be generated.
5900TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
5901
5902 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5903 "submitted on separate queues, the second having a fence, "
5904 "followed by a WaitForFences call.");
5905
Tony Barbour6514a6b2016-08-12 09:37:19 -06005906 ASSERT_NO_FATAL_FAILURE(InitState());
Dustin Graves48458142016-04-29 16:11:55 -06005907 if ((m_device->queue_props.empty()) ||
5908 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005909 return;
5910
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005911 m_errorMonitor->ExpectSuccess();
5912
Tony Barbour6514a6b2016-08-12 09:37:19 -06005913 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005914 VkFence fence;
5915 VkFenceCreateInfo fence_create_info{};
5916 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5917 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5918
5919 VkSemaphore semaphore;
5920 VkSemaphoreCreateInfo semaphore_create_info{};
5921 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5922 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5923 &semaphore);
5924
5925 VkCommandPool command_pool;
5926 VkCommandPoolCreateInfo pool_create_info{};
5927 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5928 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5929 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5930 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5931 &command_pool);
5932
5933 VkCommandBuffer command_buffer[2];
5934 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5935 command_buffer_allocate_info.sType =
5936 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5937 command_buffer_allocate_info.commandPool = command_pool;
5938 command_buffer_allocate_info.commandBufferCount = 2;
5939 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5940 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5941 command_buffer);
5942
5943 VkQueue queue = VK_NULL_HANDLE;
5944 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5945 1, &queue);
5946
5947
5948 {
5949 VkCommandBufferBeginInfo begin_info{};
5950 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5951 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5952
5953 vkCmdPipelineBarrier(command_buffer[0],
5954 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5955 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5956 0, nullptr, 0, nullptr);
5957
5958 VkViewport viewport{};
5959 viewport.maxDepth = 1.0f;
5960 viewport.minDepth = 0.0f;
5961 viewport.width = 512;
5962 viewport.height = 512;
5963 viewport.x = 0;
5964 viewport.y = 0;
5965 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5966 vkEndCommandBuffer(command_buffer[0]);
5967 }
5968 {
5969 VkCommandBufferBeginInfo begin_info{};
5970 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5971 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5972
5973 VkViewport viewport{};
5974 viewport.maxDepth = 1.0f;
5975 viewport.minDepth = 0.0f;
5976 viewport.width = 512;
5977 viewport.height = 512;
5978 viewport.x = 0;
5979 viewport.y = 0;
5980 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5981 vkEndCommandBuffer(command_buffer[1]);
5982 }
5983 {
5984 VkSubmitInfo submit_info{};
5985 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5986 submit_info.commandBufferCount = 1;
5987 submit_info.pCommandBuffers = &command_buffer[0];
5988 submit_info.signalSemaphoreCount = 1;
5989 submit_info.pSignalSemaphores = &semaphore;
5990 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5991 }
5992 {
5993 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5994 VkSubmitInfo submit_info{};
5995 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5996 submit_info.commandBufferCount = 1;
5997 submit_info.pCommandBuffers = &command_buffer[1];
5998 submit_info.waitSemaphoreCount = 1;
5999 submit_info.pWaitSemaphores = &semaphore;
6000 submit_info.pWaitDstStageMask = flags;
6001 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6002 }
6003
6004 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6005
6006 vkDestroyFence(m_device->device(), fence, nullptr);
6007 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
6008 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6009 &command_buffer[0]);
6010 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6011
6012 m_errorMonitor->VerifyNotFound();
6013}
6014
6015// This is a positive test. No errors should be generated.
6016TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
6017
6018 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
6019 "on the same queue, sharing a signal/wait semaphore, the "
6020 "second having a fence, "
6021 "followed by a WaitForFences call.");
6022
6023 m_errorMonitor->ExpectSuccess();
6024
Tony Barbour6514a6b2016-08-12 09:37:19 -06006025 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006026 VkFence fence;
6027 VkFenceCreateInfo fence_create_info{};
6028 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6029 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6030
6031 VkSemaphore semaphore;
6032 VkSemaphoreCreateInfo semaphore_create_info{};
6033 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6034 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
6035 &semaphore);
6036
6037 VkCommandPool command_pool;
6038 VkCommandPoolCreateInfo pool_create_info{};
6039 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6040 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6041 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6042 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6043 &command_pool);
6044
6045 VkCommandBuffer command_buffer[2];
6046 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6047 command_buffer_allocate_info.sType =
6048 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6049 command_buffer_allocate_info.commandPool = command_pool;
6050 command_buffer_allocate_info.commandBufferCount = 2;
6051 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6052 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6053 command_buffer);
6054
6055 {
6056 VkCommandBufferBeginInfo begin_info{};
6057 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6058 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6059
6060 vkCmdPipelineBarrier(command_buffer[0],
6061 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6062 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6063 0, nullptr, 0, nullptr);
6064
6065 VkViewport viewport{};
6066 viewport.maxDepth = 1.0f;
6067 viewport.minDepth = 0.0f;
6068 viewport.width = 512;
6069 viewport.height = 512;
6070 viewport.x = 0;
6071 viewport.y = 0;
6072 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6073 vkEndCommandBuffer(command_buffer[0]);
6074 }
6075 {
6076 VkCommandBufferBeginInfo begin_info{};
6077 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6078 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6079
6080 VkViewport viewport{};
6081 viewport.maxDepth = 1.0f;
6082 viewport.minDepth = 0.0f;
6083 viewport.width = 512;
6084 viewport.height = 512;
6085 viewport.x = 0;
6086 viewport.y = 0;
6087 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6088 vkEndCommandBuffer(command_buffer[1]);
6089 }
6090 {
6091 VkSubmitInfo submit_info{};
6092 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6093 submit_info.commandBufferCount = 1;
6094 submit_info.pCommandBuffers = &command_buffer[0];
6095 submit_info.signalSemaphoreCount = 1;
6096 submit_info.pSignalSemaphores = &semaphore;
6097 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6098 }
6099 {
6100 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6101 VkSubmitInfo submit_info{};
6102 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6103 submit_info.commandBufferCount = 1;
6104 submit_info.pCommandBuffers = &command_buffer[1];
6105 submit_info.waitSemaphoreCount = 1;
6106 submit_info.pWaitSemaphores = &semaphore;
6107 submit_info.pWaitDstStageMask = flags;
6108 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6109 }
6110
6111 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6112
6113 vkDestroyFence(m_device->device(), fence, nullptr);
6114 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
6115 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6116 &command_buffer[0]);
6117 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6118
6119 m_errorMonitor->VerifyNotFound();
6120}
6121
6122// This is a positive test. No errors should be generated.
6123TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
6124
6125 TEST_DESCRIPTION(
6126 "Two command buffers, each in a separate QueueSubmit call "
6127 "on the same queue, no fences, followed by a third QueueSubmit with NO "
6128 "SubmitInfos but with a fence, followed by a WaitForFences call.");
6129
6130 m_errorMonitor->ExpectSuccess();
6131
Tony Barbour6514a6b2016-08-12 09:37:19 -06006132 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006133 VkFence fence;
6134 VkFenceCreateInfo fence_create_info{};
6135 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6136 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6137
6138 VkCommandPool command_pool;
6139 VkCommandPoolCreateInfo pool_create_info{};
6140 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6141 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6142 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6143 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6144 &command_pool);
6145
6146 VkCommandBuffer command_buffer[2];
6147 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6148 command_buffer_allocate_info.sType =
6149 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6150 command_buffer_allocate_info.commandPool = command_pool;
6151 command_buffer_allocate_info.commandBufferCount = 2;
6152 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6153 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6154 command_buffer);
6155
6156 {
6157 VkCommandBufferBeginInfo begin_info{};
6158 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6159 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6160
6161 vkCmdPipelineBarrier(command_buffer[0],
6162 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6163 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6164 0, nullptr, 0, nullptr);
6165
6166 VkViewport viewport{};
6167 viewport.maxDepth = 1.0f;
6168 viewport.minDepth = 0.0f;
6169 viewport.width = 512;
6170 viewport.height = 512;
6171 viewport.x = 0;
6172 viewport.y = 0;
6173 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6174 vkEndCommandBuffer(command_buffer[0]);
6175 }
6176 {
6177 VkCommandBufferBeginInfo begin_info{};
6178 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6179 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6180
6181 VkViewport viewport{};
6182 viewport.maxDepth = 1.0f;
6183 viewport.minDepth = 0.0f;
6184 viewport.width = 512;
6185 viewport.height = 512;
6186 viewport.x = 0;
6187 viewport.y = 0;
6188 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6189 vkEndCommandBuffer(command_buffer[1]);
6190 }
6191 {
6192 VkSubmitInfo submit_info{};
6193 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6194 submit_info.commandBufferCount = 1;
6195 submit_info.pCommandBuffers = &command_buffer[0];
6196 submit_info.signalSemaphoreCount = 0;
6197 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
6198 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6199 }
6200 {
6201 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6202 VkSubmitInfo submit_info{};
6203 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6204 submit_info.commandBufferCount = 1;
6205 submit_info.pCommandBuffers = &command_buffer[1];
6206 submit_info.waitSemaphoreCount = 0;
6207 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
6208 submit_info.pWaitDstStageMask = flags;
6209 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6210 }
6211
6212 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
6213
Mike Stroyancd1c3e52016-06-21 09:20:01 -06006214 VkResult err =
6215 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6216 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006217
6218 vkDestroyFence(m_device->device(), fence, nullptr);
6219 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6220 &command_buffer[0]);
6221 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6222
6223 m_errorMonitor->VerifyNotFound();
6224}
6225
6226// This is a positive test. No errors should be generated.
6227TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
6228
6229 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
6230 "on the same queue, the second having a fence, followed "
6231 "by a WaitForFences call.");
6232
6233 m_errorMonitor->ExpectSuccess();
6234
Tony Barbour6514a6b2016-08-12 09:37:19 -06006235 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006236 VkFence fence;
6237 VkFenceCreateInfo fence_create_info{};
6238 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6239 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6240
6241 VkCommandPool command_pool;
6242 VkCommandPoolCreateInfo pool_create_info{};
6243 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6244 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6245 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6246 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6247 &command_pool);
6248
6249 VkCommandBuffer command_buffer[2];
6250 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6251 command_buffer_allocate_info.sType =
6252 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6253 command_buffer_allocate_info.commandPool = command_pool;
6254 command_buffer_allocate_info.commandBufferCount = 2;
6255 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6256 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6257 command_buffer);
6258
6259 {
6260 VkCommandBufferBeginInfo begin_info{};
6261 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6262 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6263
6264 vkCmdPipelineBarrier(command_buffer[0],
6265 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6266 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6267 0, nullptr, 0, nullptr);
6268
6269 VkViewport viewport{};
6270 viewport.maxDepth = 1.0f;
6271 viewport.minDepth = 0.0f;
6272 viewport.width = 512;
6273 viewport.height = 512;
6274 viewport.x = 0;
6275 viewport.y = 0;
6276 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6277 vkEndCommandBuffer(command_buffer[0]);
6278 }
6279 {
6280 VkCommandBufferBeginInfo begin_info{};
6281 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6282 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6283
6284 VkViewport viewport{};
6285 viewport.maxDepth = 1.0f;
6286 viewport.minDepth = 0.0f;
6287 viewport.width = 512;
6288 viewport.height = 512;
6289 viewport.x = 0;
6290 viewport.y = 0;
6291 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6292 vkEndCommandBuffer(command_buffer[1]);
6293 }
6294 {
6295 VkSubmitInfo submit_info{};
6296 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6297 submit_info.commandBufferCount = 1;
6298 submit_info.pCommandBuffers = &command_buffer[0];
6299 submit_info.signalSemaphoreCount = 0;
6300 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
6301 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6302 }
6303 {
6304 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6305 VkSubmitInfo submit_info{};
6306 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6307 submit_info.commandBufferCount = 1;
6308 submit_info.pCommandBuffers = &command_buffer[1];
6309 submit_info.waitSemaphoreCount = 0;
6310 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
6311 submit_info.pWaitDstStageMask = flags;
6312 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6313 }
6314
6315 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6316
6317 vkDestroyFence(m_device->device(), fence, nullptr);
6318 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6319 &command_buffer[0]);
6320 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6321
6322 m_errorMonitor->VerifyNotFound();
6323}
6324
6325// This is a positive test. No errors should be generated.
6326TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
6327
6328 TEST_DESCRIPTION(
6329 "Two command buffers each in a separate SubmitInfo sent in a single "
6330 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour6514a6b2016-08-12 09:37:19 -06006331 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006332
6333 m_errorMonitor->ExpectSuccess();
6334
6335 VkFence fence;
6336 VkFenceCreateInfo fence_create_info{};
6337 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6338 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6339
6340 VkSemaphore semaphore;
6341 VkSemaphoreCreateInfo semaphore_create_info{};
6342 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6343 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
6344 &semaphore);
6345
6346 VkCommandPool command_pool;
6347 VkCommandPoolCreateInfo pool_create_info{};
6348 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6349 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6350 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6351 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6352 &command_pool);
6353
6354 VkCommandBuffer command_buffer[2];
6355 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6356 command_buffer_allocate_info.sType =
6357 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6358 command_buffer_allocate_info.commandPool = command_pool;
6359 command_buffer_allocate_info.commandBufferCount = 2;
6360 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6361 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6362 command_buffer);
6363
6364 {
6365 VkCommandBufferBeginInfo begin_info{};
6366 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6367 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6368
6369 vkCmdPipelineBarrier(command_buffer[0],
6370 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6371 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6372 0, nullptr, 0, nullptr);
6373
6374 VkViewport viewport{};
6375 viewport.maxDepth = 1.0f;
6376 viewport.minDepth = 0.0f;
6377 viewport.width = 512;
6378 viewport.height = 512;
6379 viewport.x = 0;
6380 viewport.y = 0;
6381 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6382 vkEndCommandBuffer(command_buffer[0]);
6383 }
6384 {
6385 VkCommandBufferBeginInfo begin_info{};
6386 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6387 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6388
6389 VkViewport viewport{};
6390 viewport.maxDepth = 1.0f;
6391 viewport.minDepth = 0.0f;
6392 viewport.width = 512;
6393 viewport.height = 512;
6394 viewport.x = 0;
6395 viewport.y = 0;
6396 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6397 vkEndCommandBuffer(command_buffer[1]);
6398 }
6399 {
6400 VkSubmitInfo submit_info[2];
6401 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6402
6403 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6404 submit_info[0].pNext = NULL;
6405 submit_info[0].commandBufferCount = 1;
6406 submit_info[0].pCommandBuffers = &command_buffer[0];
6407 submit_info[0].signalSemaphoreCount = 1;
6408 submit_info[0].pSignalSemaphores = &semaphore;
6409 submit_info[0].waitSemaphoreCount = 0;
6410 submit_info[0].pWaitSemaphores = NULL;
6411 submit_info[0].pWaitDstStageMask = 0;
6412
6413 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6414 submit_info[1].pNext = NULL;
6415 submit_info[1].commandBufferCount = 1;
6416 submit_info[1].pCommandBuffers = &command_buffer[1];
6417 submit_info[1].waitSemaphoreCount = 1;
6418 submit_info[1].pWaitSemaphores = &semaphore;
6419 submit_info[1].pWaitDstStageMask = flags;
6420 submit_info[1].signalSemaphoreCount = 0;
6421 submit_info[1].pSignalSemaphores = NULL;
6422 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
6423 }
6424
6425 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6426
6427 vkDestroyFence(m_device->device(), fence, nullptr);
6428 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6429 &command_buffer[0]);
6430 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006431 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006432
6433 m_errorMonitor->VerifyNotFound();
6434}
6435
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006436TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006437 TEST_DESCRIPTION(
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006438 "Run a simple draw calls to validate failure when Depth Bias dynamic "
6439 "state is required but not correctly bound.");
6440
Tony Barbour6514a6b2016-08-12 09:37:19 -06006441 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006442 // 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
Tony Barbour6514a6b2016-08-12 09:37:19 -06006456 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006457 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07006458 m_errorMonitor->SetDesiredFailureMsg(
6459 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006460 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006461 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6462 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006463 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006464}
6465
6466TEST_F(VkLayerTest, DynamicViewportNotBound) {
6467 TEST_DESCRIPTION(
6468 "Run a simple draw calls to validate failure when Viewport dynamic "
6469 "state is required but not correctly bound.");
6470
Tony Barbour6514a6b2016-08-12 09:37:19 -06006471 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006472 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07006473 m_errorMonitor->SetDesiredFailureMsg(
6474 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006475 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006476 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6477 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006478 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006479}
6480
6481TEST_F(VkLayerTest, DynamicScissorNotBound) {
6482 TEST_DESCRIPTION(
6483 "Run a simple draw calls to validate failure when Scissor dynamic "
6484 "state is required but not correctly bound.");
6485
Tony Barbour6514a6b2016-08-12 09:37:19 -06006486 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006487 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07006488 m_errorMonitor->SetDesiredFailureMsg(
6489 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006490 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006491 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6492 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006493 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006494}
6495
Cortd713fe82016-07-27 09:51:27 -07006496TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006497 TEST_DESCRIPTION(
Tobin Ehlis21c88352016-05-26 06:15:45 -06006498 "Run a simple draw calls to validate failure when Blend Constants "
6499 "dynamic state is required but not correctly bound.");
Tony Barbour6514a6b2016-08-12 09:37:19 -06006500
6501 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06006502 // Dynamic blend constant state
6503 m_errorMonitor->SetDesiredFailureMsg(
6504 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6505 "Dynamic blend constants state not set for this command buffer");
6506 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6507 BsoFailBlend);
6508 m_errorMonitor->VerifyFound();
6509}
6510
6511TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
6512 TEST_DESCRIPTION(
6513 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006514 "state is required but not correctly bound.");
Tony Barbour6514a6b2016-08-12 09:37:19 -06006515
6516 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06006517 if (!m_device->phy().features().depthBounds) {
6518 printf("Device does not support depthBounds test; skipped.\n");
6519 return;
6520 }
6521 // Dynamic depth bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006522 m_errorMonitor->SetDesiredFailureMsg(
6523 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006524 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006525 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6526 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006527 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006528}
6529
6530TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
6531 TEST_DESCRIPTION(
6532 "Run a simple draw calls to validate failure when Stencil Read dynamic "
6533 "state is required but not correctly bound.");
Tony Barbour6514a6b2016-08-12 09:37:19 -06006534
6535 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006536 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07006537 m_errorMonitor->SetDesiredFailureMsg(
6538 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006539 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006540 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6541 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006542 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006543}
6544
6545TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
6546 TEST_DESCRIPTION(
6547 "Run a simple draw calls to validate failure when Stencil Write dynamic"
6548 " state is required but not correctly bound.");
Tony Barbour6514a6b2016-08-12 09:37:19 -06006549
6550 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006551 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07006552 m_errorMonitor->SetDesiredFailureMsg(
6553 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006554 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006555 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6556 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006557 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006558}
6559
6560TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
6561 TEST_DESCRIPTION(
6562 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
6563 "state is required but not correctly bound.");
Tony Barbour6514a6b2016-08-12 09:37:19 -06006564
6565 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006566 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07006567 m_errorMonitor->SetDesiredFailureMsg(
6568 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006569 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006570 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6571 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006572 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06006573}
6574
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06006575TEST_F(VkLayerTest, IndexBufferNotBound) {
6576 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Tony Barbour6514a6b2016-08-12 09:37:19 -06006577
6578 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06006579 m_errorMonitor->SetDesiredFailureMsg(
6580 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6581 "Index buffer object not bound to this command buffer when Indexed ");
6582 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6583 BsoFailIndexBuffer);
6584 m_errorMonitor->VerifyFound();
6585}
6586
Karl Schultz6addd812016-02-02 17:17:23 -07006587TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Karl Schultz6addd812016-02-02 17:17:23 -07006588 m_errorMonitor->SetDesiredFailureMsg(
6589 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6590 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
6591 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006592
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006593 ASSERT_NO_FATAL_FAILURE(InitState());
6594 ASSERT_NO_FATAL_FAILURE(InitViewport());
6595 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6596
Karl Schultz6addd812016-02-02 17:17:23 -07006597 // We luck out b/c by default the framework creates CB w/ the
6598 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006599 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006600 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
6601 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006602 EndCommandBuffer();
6603
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006604 // Bypass framework since it does the waits automatically
6605 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006606 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08006607 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6608 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006609 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006610 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07006611 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006612 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006613 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08006614 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006615 submit_info.pSignalSemaphores = NULL;
6616
Chris Forbes40028e22016-06-13 09:59:34 +12006617 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07006618 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006619
Karl Schultz6addd812016-02-02 17:17:23 -07006620 // Cause validation error by re-submitting cmd buffer that should only be
6621 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12006622 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006623
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006624 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006625}
6626
Karl Schultz6addd812016-02-02 17:17:23 -07006627TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006628 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07006629 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006630
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006631 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006632 "Unable to allocate 1 descriptors of "
6633 "type "
6634 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006635
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006636 ASSERT_NO_FATAL_FAILURE(InitState());
6637 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006638
Karl Schultz6addd812016-02-02 17:17:23 -07006639 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
6640 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006641 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006642 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6643 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006644
6645 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006646 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6647 ds_pool_ci.pNext = NULL;
6648 ds_pool_ci.flags = 0;
6649 ds_pool_ci.maxSets = 1;
6650 ds_pool_ci.poolSizeCount = 1;
6651 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006652
6653 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006654 err =
6655 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006656 ASSERT_VK_SUCCESS(err);
6657
6658 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006659 dsl_binding.binding = 0;
6660 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6661 dsl_binding.descriptorCount = 1;
6662 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6663 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006664
6665 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006666 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6667 ds_layout_ci.pNext = NULL;
6668 ds_layout_ci.bindingCount = 1;
6669 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006670
6671 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006672 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6673 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006674 ASSERT_VK_SUCCESS(err);
6675
6676 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006677 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006678 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006679 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006680 alloc_info.descriptorPool = ds_pool;
6681 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006682 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6683 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006684
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006685 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006686
Chia-I Wuf7458c52015-10-26 21:10:41 +08006687 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6688 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006689}
6690
Karl Schultz6addd812016-02-02 17:17:23 -07006691TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
6692 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06006693
Karl Schultz6addd812016-02-02 17:17:23 -07006694 m_errorMonitor->SetDesiredFailureMsg(
6695 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6696 "It is invalid to call vkFreeDescriptorSets() with a pool created "
6697 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006698
Tobin Ehlise735c692015-10-08 13:13:50 -06006699 ASSERT_NO_FATAL_FAILURE(InitState());
6700 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06006701
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006702 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006703 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6704 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06006705
6706 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006707 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6708 ds_pool_ci.pNext = NULL;
6709 ds_pool_ci.maxSets = 1;
6710 ds_pool_ci.poolSizeCount = 1;
6711 ds_pool_ci.flags = 0;
6712 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
6713 // app can only call vkResetDescriptorPool on this pool.;
6714 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06006715
6716 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006717 err =
6718 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06006719 ASSERT_VK_SUCCESS(err);
6720
6721 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006722 dsl_binding.binding = 0;
6723 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6724 dsl_binding.descriptorCount = 1;
6725 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6726 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06006727
6728 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006729 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6730 ds_layout_ci.pNext = NULL;
6731 ds_layout_ci.bindingCount = 1;
6732 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06006733
6734 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006735 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6736 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06006737 ASSERT_VK_SUCCESS(err);
6738
6739 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006740 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006741 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006742 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006743 alloc_info.descriptorPool = ds_pool;
6744 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006745 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6746 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06006747 ASSERT_VK_SUCCESS(err);
6748
6749 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006750 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06006751
Chia-I Wuf7458c52015-10-26 21:10:41 +08006752 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6753 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06006754}
6755
Karl Schultz6addd812016-02-02 17:17:23 -07006756TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006757 // Attempt to clear Descriptor Pool with bad object.
6758 // ObjectTracker should catch this.
Tony Barbour6514a6b2016-08-12 09:37:19 -06006759
6760 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzbdb75952016-04-19 11:36:49 -06006761 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006762 "Invalid Descriptor Pool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006763 uint64_t fake_pool_handle = 0xbaad6001;
6764 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
6765 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06006766 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006767}
6768
Karl Schultz6addd812016-02-02 17:17:23 -07006769TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006770 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
6771 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006772 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06006773 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006774
6775 uint64_t fake_set_handle = 0xbaad6001;
6776 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006777 VkResult err;
6778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006779 "Invalid Descriptor Set Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06006780
6781 ASSERT_NO_FATAL_FAILURE(InitState());
6782
6783 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
6784 layout_bindings[0].binding = 0;
6785 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6786 layout_bindings[0].descriptorCount = 1;
6787 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
6788 layout_bindings[0].pImmutableSamplers = NULL;
6789
6790 VkDescriptorSetLayout descriptor_set_layout;
6791 VkDescriptorSetLayoutCreateInfo dslci = {};
6792 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6793 dslci.pNext = NULL;
6794 dslci.bindingCount = 1;
6795 dslci.pBindings = layout_bindings;
6796 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006797 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006798
6799 VkPipelineLayout pipeline_layout;
6800 VkPipelineLayoutCreateInfo plci = {};
6801 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6802 plci.pNext = NULL;
6803 plci.setLayoutCount = 1;
6804 plci.pSetLayouts = &descriptor_set_layout;
6805 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006806 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006807
6808 BeginCommandBuffer();
6809 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006810 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06006811 m_errorMonitor->VerifyFound();
6812 EndCommandBuffer();
6813 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
6814 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006815}
6816
Karl Schultz6addd812016-02-02 17:17:23 -07006817TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006818 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
6819 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006820 uint64_t fake_layout_handle = 0xbaad6001;
6821 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006822 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006823 "Invalid Descriptor Set Layout Object 0xbaad6001");
Tony Barbour6514a6b2016-08-12 09:37:19 -06006824 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzbdb75952016-04-19 11:36:49 -06006825 VkPipelineLayout pipeline_layout;
6826 VkPipelineLayoutCreateInfo plci = {};
6827 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6828 plci.pNext = NULL;
6829 plci.setLayoutCount = 1;
6830 plci.pSetLayouts = &bad_layout;
6831 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
6832
6833 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006834}
6835
Mark Muellerd4914412016-06-13 17:52:06 -06006836TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
6837 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
6838 "1) A uniform buffer update must have a valid buffer index."
6839 "2) When using an array of descriptors in a single WriteDescriptor,"
6840 " the descriptor types and stageflags must all be the same."
6841 "3) Immutable Sampler state must match across descriptors");
6842
6843 const char *invalid_BufferInfo_ErrorMessage =
6844 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
6845 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
6846 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
6847 const char *stateFlag_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006848 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006849 const char *immutable_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006850 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006851
Mark Muellerd4914412016-06-13 17:52:06 -06006852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
6853
6854 ASSERT_NO_FATAL_FAILURE(InitState());
6855 VkDescriptorPoolSize ds_type_count[4] = {};
6856 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6857 ds_type_count[0].descriptorCount = 1;
6858 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6859 ds_type_count[1].descriptorCount = 1;
6860 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6861 ds_type_count[2].descriptorCount = 1;
6862 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6863 ds_type_count[3].descriptorCount = 1;
6864
6865 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6866 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6867 ds_pool_ci.maxSets = 1;
6868 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
6869 ds_pool_ci.pPoolSizes = ds_type_count;
6870
6871 VkDescriptorPool ds_pool;
6872 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6873 ASSERT_VK_SUCCESS(err);
6874
Mark Muellerb9896722016-06-16 09:54:29 -06006875 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006876 layout_binding[0].binding = 0;
6877 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6878 layout_binding[0].descriptorCount = 1;
6879 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6880 layout_binding[0].pImmutableSamplers = NULL;
6881
6882 layout_binding[1].binding = 1;
6883 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6884 layout_binding[1].descriptorCount = 1;
6885 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6886 layout_binding[1].pImmutableSamplers = NULL;
6887
6888 VkSamplerCreateInfo sampler_ci = {};
6889 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6890 sampler_ci.pNext = NULL;
6891 sampler_ci.magFilter = VK_FILTER_NEAREST;
6892 sampler_ci.minFilter = VK_FILTER_NEAREST;
6893 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6894 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6895 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6896 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6897 sampler_ci.mipLodBias = 1.0;
6898 sampler_ci.anisotropyEnable = VK_FALSE;
6899 sampler_ci.maxAnisotropy = 1;
6900 sampler_ci.compareEnable = VK_FALSE;
6901 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6902 sampler_ci.minLod = 1.0;
6903 sampler_ci.maxLod = 1.0;
6904 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6905 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6906 VkSampler sampler;
6907
6908 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6909 ASSERT_VK_SUCCESS(err);
6910
6911 layout_binding[2].binding = 2;
6912 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6913 layout_binding[2].descriptorCount = 1;
6914 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6915 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
6916
Mark Muellerd4914412016-06-13 17:52:06 -06006917 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6918 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6919 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
6920 ds_layout_ci.pBindings = layout_binding;
6921 VkDescriptorSetLayout ds_layout;
6922 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6923 ASSERT_VK_SUCCESS(err);
6924
6925 VkDescriptorSetAllocateInfo alloc_info = {};
6926 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6927 alloc_info.descriptorSetCount = 1;
6928 alloc_info.descriptorPool = ds_pool;
6929 alloc_info.pSetLayouts = &ds_layout;
6930 VkDescriptorSet descriptorSet;
6931 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6932 ASSERT_VK_SUCCESS(err);
6933
6934 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6935 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6936 pipeline_layout_ci.pNext = NULL;
6937 pipeline_layout_ci.setLayoutCount = 1;
6938 pipeline_layout_ci.pSetLayouts = &ds_layout;
6939
6940 VkPipelineLayout pipeline_layout;
6941 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6942 ASSERT_VK_SUCCESS(err);
6943
Mark Mueller5c838ce2016-06-16 09:54:29 -06006944 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006945 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6946 descriptor_write.dstSet = descriptorSet;
6947 descriptor_write.dstBinding = 0;
6948 descriptor_write.descriptorCount = 1;
6949 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6950
Mark Mueller5c838ce2016-06-16 09:54:29 -06006951 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06006952 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6953 m_errorMonitor->VerifyFound();
6954
6955 // Create a buffer to update the descriptor with
6956 uint32_t qfi = 0;
6957 VkBufferCreateInfo buffCI = {};
6958 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6959 buffCI.size = 1024;
6960 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6961 buffCI.queueFamilyIndexCount = 1;
6962 buffCI.pQueueFamilyIndices = &qfi;
6963
6964 VkBuffer dyub;
6965 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6966 ASSERT_VK_SUCCESS(err);
6967 VkDescriptorBufferInfo buffInfo = {};
6968 buffInfo.buffer = dyub;
6969 buffInfo.offset = 0;
6970 buffInfo.range = 1024;
6971
6972 descriptor_write.pBufferInfo = &buffInfo;
6973 descriptor_write.descriptorCount = 2;
6974
Mark Mueller5c838ce2016-06-16 09:54:29 -06006975 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06006976 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
6977 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6978 m_errorMonitor->VerifyFound();
6979
Mark Mueller5c838ce2016-06-16 09:54:29 -06006980 // 3) The second descriptor has a null_ptr pImmutableSamplers and
6981 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06006982 descriptor_write.dstBinding = 1;
6983 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06006984
6985
6986 // Make pImageInfo index non-null to avoid complaints of it missing
6987 VkDescriptorImageInfo imageInfo = {};
6988 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6989 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06006990 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
6991 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6992 m_errorMonitor->VerifyFound();
6993
Mark Muellerd4914412016-06-13 17:52:06 -06006994 vkDestroyBuffer(m_device->device(), dyub, NULL);
6995 vkDestroySampler(m_device->device(), sampler, NULL);
6996 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6997 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6998 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6999}
7000
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06007001TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
7002 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7003 "due to a buffer dependency being destroyed.");
7004 ASSERT_NO_FATAL_FAILURE(InitState());
7005
7006 VkImageObj image(m_device);
7007 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
7008 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
7009 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
7010 VK_IMAGE_TILING_OPTIMAL, 0);
7011 ASSERT_TRUE(image.initialized());
7012
7013 VkBuffer buffer;
7014 VkDeviceMemory mem;
7015 VkMemoryRequirements mem_reqs;
7016
7017 VkBufferCreateInfo buf_info = {};
7018 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7019 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7020 buf_info.size = 256;
7021 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7022 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
7023 ASSERT_VK_SUCCESS(err);
7024
7025 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
7026
7027 VkMemoryAllocateInfo alloc_info = {};
7028 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7029 alloc_info.allocationSize = 256;
7030 bool pass = false;
7031 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
7032 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
7033 if (!pass) {
7034 vkDestroyBuffer(m_device->device(), buffer, NULL);
7035 return;
7036 }
7037 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
7038 ASSERT_VK_SUCCESS(err);
7039
7040 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
7041 ASSERT_VK_SUCCESS(err);
7042
7043 VkBufferImageCopy region = {};
7044 region.bufferRowLength = 128;
7045 region.bufferImageHeight = 128;
7046 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7047
7048 region.imageSubresource.layerCount = 1;
7049 region.imageExtent.height = 4;
7050 region.imageExtent.width = 4;
7051 region.imageExtent.depth = 1;
7052 m_commandBuffer->BeginCommandBuffer();
7053 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
7054 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
7055 1, &region);
7056 m_commandBuffer->EndCommandBuffer();
7057
7058 m_errorMonitor->SetDesiredFailureMsg(
7059 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7060 " that is invalid because bound buffer ");
7061 // Destroy buffer dependency prior to submit to cause ERROR
7062 vkDestroyBuffer(m_device->device(), buffer, NULL);
7063
7064 VkSubmitInfo submit_info = {};
7065 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7066 submit_info.commandBufferCount = 1;
7067 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7068 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7069
7070 m_errorMonitor->VerifyFound();
7071 vkFreeMemory(m_device->handle(), mem, NULL);
7072}
7073
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007074TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
7075 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7076 "due to an image dependency being destroyed.");
7077 ASSERT_NO_FATAL_FAILURE(InitState());
7078
7079 VkImage image;
7080 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7081 VkImageCreateInfo image_create_info = {};
7082 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7083 image_create_info.pNext = NULL;
7084 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7085 image_create_info.format = tex_format;
7086 image_create_info.extent.width = 32;
7087 image_create_info.extent.height = 32;
7088 image_create_info.extent.depth = 1;
7089 image_create_info.mipLevels = 1;
7090 image_create_info.arrayLayers = 1;
7091 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7092 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7093 image_create_info.usage =
7094 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7095 image_create_info.flags = 0;
7096 VkResult err =
7097 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7098 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007099 // Have to bind memory to image before recording cmd in cmd buffer using it
7100 VkMemoryRequirements mem_reqs;
7101 VkDeviceMemory image_mem;
7102 bool pass;
7103 VkMemoryAllocateInfo mem_alloc = {};
7104 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7105 mem_alloc.pNext = NULL;
7106 mem_alloc.memoryTypeIndex = 0;
7107 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
7108 mem_alloc.allocationSize = mem_reqs.size;
7109 pass =
7110 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
7111 ASSERT_TRUE(pass);
7112 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
7113 ASSERT_VK_SUCCESS(err);
7114 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
7115 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007116
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007117 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06007118 VkClearColorValue ccv;
7119 ccv.float32[0] = 1.0f;
7120 ccv.float32[1] = 1.0f;
7121 ccv.float32[2] = 1.0f;
7122 ccv.float32[3] = 1.0f;
7123 VkImageSubresourceRange isr = {};
7124 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007125 isr.baseArrayLayer = 0;
7126 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06007127 isr.layerCount = 1;
7128 isr.levelCount = 1;
7129 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
7130 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007131 m_commandBuffer->EndCommandBuffer();
7132
7133 m_errorMonitor->SetDesiredFailureMsg(
7134 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
7135 // Destroy image dependency prior to submit to cause ERROR
7136 vkDestroyImage(m_device->device(), image, NULL);
7137
7138 VkSubmitInfo submit_info = {};
7139 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7140 submit_info.commandBufferCount = 1;
7141 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7142 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7143
7144 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007145 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007146}
7147
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007148TEST_F(VkLayerTest, ImageMemoryNotBound) {
7149 TEST_DESCRIPTION(
7150 "Attempt to draw with an image which has not had memory bound to it.");
7151 ASSERT_NO_FATAL_FAILURE(InitState());
7152
7153 VkImage image;
7154 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7155 VkImageCreateInfo image_create_info = {};
7156 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7157 image_create_info.pNext = NULL;
7158 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7159 image_create_info.format = tex_format;
7160 image_create_info.extent.width = 32;
7161 image_create_info.extent.height = 32;
7162 image_create_info.extent.depth = 1;
7163 image_create_info.mipLevels = 1;
7164 image_create_info.arrayLayers = 1;
7165 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7166 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7167 image_create_info.usage =
7168 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7169 image_create_info.flags = 0;
7170 VkResult err =
7171 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7172 ASSERT_VK_SUCCESS(err);
7173 // Have to bind memory to image before recording cmd in cmd buffer using it
7174 VkMemoryRequirements mem_reqs;
7175 VkDeviceMemory image_mem;
7176 bool pass;
7177 VkMemoryAllocateInfo mem_alloc = {};
7178 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7179 mem_alloc.pNext = NULL;
7180 mem_alloc.memoryTypeIndex = 0;
7181 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
7182 mem_alloc.allocationSize = mem_reqs.size;
7183 pass =
7184 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
7185 ASSERT_TRUE(pass);
7186 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
7187 ASSERT_VK_SUCCESS(err);
7188
7189 // Introduce error, do not call vkBindImageMemory(m_device->device(), image,
7190 // image_mem, 0);
7191 m_errorMonitor->SetDesiredFailureMsg(
7192 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7193 "used without first calling vkBindImageMemory");
7194
7195 m_commandBuffer->BeginCommandBuffer();
7196 VkClearColorValue ccv;
7197 ccv.float32[0] = 1.0f;
7198 ccv.float32[1] = 1.0f;
7199 ccv.float32[2] = 1.0f;
7200 ccv.float32[3] = 1.0f;
7201 VkImageSubresourceRange isr = {};
7202 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7203 isr.baseArrayLayer = 0;
7204 isr.baseMipLevel = 0;
7205 isr.layerCount = 1;
7206 isr.levelCount = 1;
7207 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
7208 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
7209 m_commandBuffer->EndCommandBuffer();
7210
7211 m_errorMonitor->VerifyFound();
7212 vkDestroyImage(m_device->device(), image, NULL);
7213 vkFreeMemory(m_device->device(), image_mem, nullptr);
7214}
7215
7216TEST_F(VkLayerTest, BufferMemoryNotBound) {
7217 TEST_DESCRIPTION(
7218 "Attempt to copy from a buffer which has not had memory bound to it.");
7219 ASSERT_NO_FATAL_FAILURE(InitState());
7220
7221 VkImageObj image(m_device);
7222 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
7223 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
7224 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
7225 VK_IMAGE_TILING_OPTIMAL, 0);
7226 ASSERT_TRUE(image.initialized());
7227
7228 VkBuffer buffer;
7229 VkDeviceMemory mem;
7230 VkMemoryRequirements mem_reqs;
7231
7232 VkBufferCreateInfo buf_info = {};
7233 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7234 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7235 buf_info.size = 256;
7236 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7237 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
7238 ASSERT_VK_SUCCESS(err);
7239
7240 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
7241
7242 VkMemoryAllocateInfo alloc_info = {};
7243 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7244 alloc_info.allocationSize = 256;
7245 bool pass = false;
7246 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
7247 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
7248 if (!pass) {
7249 vkDestroyBuffer(m_device->device(), buffer, NULL);
7250 return;
7251 }
7252 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
7253 ASSERT_VK_SUCCESS(err);
7254
7255 // Introduce failure by not calling vkBindBufferMemory(m_device->device(),
7256 // buffer, mem, 0);
7257 m_errorMonitor->SetDesiredFailureMsg(
7258 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7259 "used without first calling vkBindBufferMemory");
7260 VkBufferImageCopy region = {};
7261 region.bufferRowLength = 128;
7262 region.bufferImageHeight = 128;
7263 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7264
7265 region.imageSubresource.layerCount = 1;
7266 region.imageExtent.height = 4;
7267 region.imageExtent.width = 4;
7268 region.imageExtent.depth = 1;
7269 m_commandBuffer->BeginCommandBuffer();
7270 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
7271 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
7272 1, &region);
7273 m_commandBuffer->EndCommandBuffer();
7274
7275 m_errorMonitor->VerifyFound();
7276
7277 vkDestroyBuffer(m_device->device(), buffer, NULL);
7278 vkFreeMemory(m_device->handle(), mem, NULL);
7279}
7280
Tobin Ehlis85940f52016-07-07 16:57:21 -06007281TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
7282 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7283 "due to an event dependency being destroyed.");
7284 ASSERT_NO_FATAL_FAILURE(InitState());
7285
7286 VkEvent event;
7287 VkEventCreateInfo evci = {};
7288 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
7289 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
7290 ASSERT_VK_SUCCESS(result);
7291
7292 m_commandBuffer->BeginCommandBuffer();
7293 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event,
7294 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
7295 m_commandBuffer->EndCommandBuffer();
7296
7297 m_errorMonitor->SetDesiredFailureMsg(
7298 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
7299 // Destroy event dependency prior to submit to cause ERROR
7300 vkDestroyEvent(m_device->device(), event, NULL);
7301
7302 VkSubmitInfo submit_info = {};
7303 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7304 submit_info.commandBufferCount = 1;
7305 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7306 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7307
7308 m_errorMonitor->VerifyFound();
7309}
7310
Tobin Ehlisdbea7552016-07-08 14:33:31 -06007311TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
7312 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7313 "due to a query pool dependency being destroyed.");
7314 ASSERT_NO_FATAL_FAILURE(InitState());
7315
7316 VkQueryPool query_pool;
7317 VkQueryPoolCreateInfo qpci{};
7318 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
7319 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
7320 qpci.queryCount = 1;
7321 VkResult result =
7322 vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
7323 ASSERT_VK_SUCCESS(result);
7324
7325 m_commandBuffer->BeginCommandBuffer();
7326 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
7327 m_commandBuffer->EndCommandBuffer();
7328
7329 m_errorMonitor->SetDesiredFailureMsg(
7330 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7331 " that is invalid because bound query pool ");
7332 // Destroy query pool dependency prior to submit to cause ERROR
7333 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
7334
7335 VkSubmitInfo submit_info = {};
7336 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7337 submit_info.commandBufferCount = 1;
7338 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7339 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7340
7341 m_errorMonitor->VerifyFound();
7342}
7343
Tobin Ehlis24130d92016-07-08 15:50:53 -06007344TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
7345 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7346 "due to a pipeline dependency being destroyed.");
7347 ASSERT_NO_FATAL_FAILURE(InitState());
7348 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7349
7350 VkResult err;
7351
7352 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7353 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7354
7355 VkPipelineLayout pipeline_layout;
7356 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7357 &pipeline_layout);
7358 ASSERT_VK_SUCCESS(err);
7359
7360 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7361 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7362 vp_state_ci.viewportCount = 1;
7363 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06007364 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06007365 vp_state_ci.scissorCount = 1;
7366 VkRect2D scissors = {}; // Dummy scissors to point to
7367 vp_state_ci.pScissors = &scissors;
7368 // No dynamic state
7369 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7370 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7371
7372 VkPipelineShaderStageCreateInfo shaderStages[2];
7373 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7374
7375 VkShaderObj vs(m_device, bindStateVertShaderText,
7376 VK_SHADER_STAGE_VERTEX_BIT, this);
7377 VkShaderObj fs(m_device, bindStateFragShaderText,
7378 VK_SHADER_STAGE_FRAGMENT_BIT,
7379 this); // We shouldn't need a fragment shader
7380 // but add it to be able to run on more devices
7381 shaderStages[0] = vs.GetStageCreateInfo();
7382 shaderStages[1] = fs.GetStageCreateInfo();
7383
7384 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7385 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7386
7387 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7388 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7389 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7390
7391 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7392 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7393
7394 VkPipelineColorBlendAttachmentState att = {};
7395 att.blendEnable = VK_FALSE;
7396 att.colorWriteMask = 0xf;
7397
7398 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7399 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7400 cb_ci.attachmentCount = 1;
7401 cb_ci.pAttachments = &att;
7402
7403 VkGraphicsPipelineCreateInfo gp_ci = {};
7404 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7405 gp_ci.stageCount = 2;
7406 gp_ci.pStages = shaderStages;
7407 gp_ci.pVertexInputState = &vi_ci;
7408 gp_ci.pInputAssemblyState = &ia_ci;
7409 gp_ci.pViewportState = &vp_state_ci;
7410 gp_ci.pRasterizationState = &rs_ci;
7411 gp_ci.pColorBlendState = &cb_ci;
7412 gp_ci.pDynamicState = &dyn_state_ci;
7413 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7414 gp_ci.layout = pipeline_layout;
7415 gp_ci.renderPass = renderPass();
7416
7417 VkPipelineCacheCreateInfo pc_ci = {};
7418 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7419
7420 VkPipeline pipeline;
7421 VkPipelineCache pipelineCache;
7422 err =
7423 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
7424 ASSERT_VK_SUCCESS(err);
7425
7426 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7427 &gp_ci, NULL, &pipeline);
7428 ASSERT_VK_SUCCESS(err);
7429
7430 m_commandBuffer->BeginCommandBuffer();
7431 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7432 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
7433 m_commandBuffer->EndCommandBuffer();
7434 // Now destroy pipeline in order to cause error when submitting
7435 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
7436
7437 m_errorMonitor->SetDesiredFailureMsg(
7438 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7439 " that is invalid because bound pipeline ");
7440
7441 VkSubmitInfo submit_info = {};
7442 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7443 submit_info.commandBufferCount = 1;
7444 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7445 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7446
7447 m_errorMonitor->VerifyFound();
7448 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7449 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7450}
7451
Karl Schultz6addd812016-02-02 17:17:23 -07007452TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06007453 // Attempt to bind an invalid Pipeline to a valid Command Buffer
7454 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007455 // Create a valid cmd buffer
7456 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06007457 uint64_t fake_pipeline_handle = 0xbaad6001;
7458 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06007459 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06007460 "Invalid Pipeline Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06007461 ASSERT_NO_FATAL_FAILURE(InitState());
7462 BeginCommandBuffer();
7463 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7464 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
7465 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06007466 // Now issue a draw call with no pipeline bound
7467 m_errorMonitor->SetDesiredFailureMsg(
7468 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7469 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tony Barbourdf4c0042016-06-01 15:55:43 -06007470
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06007471 BeginCommandBuffer();
7472 Draw(1, 0, 0, 0);
7473 m_errorMonitor->VerifyFound();
7474 // Finally same check once more but with Dispatch/Compute
7475 m_errorMonitor->SetDesiredFailureMsg(
7476 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7477 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06007478 BeginCommandBuffer();
7479 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
7480 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007481}
7482
Karl Schultz6addd812016-02-02 17:17:23 -07007483TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
7484 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
7485 // CommandBuffer
7486 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007487
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007489 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007490
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007491 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06007492 ASSERT_NO_FATAL_FAILURE(InitViewport());
7493 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007494 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007495 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7496 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007497
7498 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007499 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7500 ds_pool_ci.pNext = NULL;
7501 ds_pool_ci.maxSets = 1;
7502 ds_pool_ci.poolSizeCount = 1;
7503 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06007504
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007505 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007506 err =
7507 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007508 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007509
Tony Barboureb254902015-07-15 12:50:33 -06007510 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007511 dsl_binding.binding = 0;
7512 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7513 dsl_binding.descriptorCount = 1;
7514 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7515 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007516
Tony Barboureb254902015-07-15 12:50:33 -06007517 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007518 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7519 ds_layout_ci.pNext = NULL;
7520 ds_layout_ci.bindingCount = 1;
7521 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007522 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007523 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7524 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007525 ASSERT_VK_SUCCESS(err);
7526
7527 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007528 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007529 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007530 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007531 alloc_info.descriptorPool = ds_pool;
7532 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007533 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7534 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007535 ASSERT_VK_SUCCESS(err);
7536
Tony Barboureb254902015-07-15 12:50:33 -06007537 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007538 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7539 pipeline_layout_ci.pNext = NULL;
7540 pipeline_layout_ci.setLayoutCount = 1;
7541 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007542
7543 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007544 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7545 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007546 ASSERT_VK_SUCCESS(err);
7547
Karl Schultz6addd812016-02-02 17:17:23 -07007548 VkShaderObj vs(m_device, bindStateVertShaderText,
7549 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06007550 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07007551 // on more devices
7552 VkShaderObj fs(m_device, bindStateFragShaderText,
7553 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007554
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007555 VkPipelineObj pipe(m_device);
7556 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007557 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06007558 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007559 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007560
7561 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007562 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7563 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7564 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7565 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7566 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007567
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007568 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007569
Chia-I Wuf7458c52015-10-26 21:10:41 +08007570 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7571 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7572 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007573}
7574
Karl Schultz6addd812016-02-02 17:17:23 -07007575TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007576 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07007577 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007578
Karl Schultz6addd812016-02-02 17:17:23 -07007579 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007580 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
7581 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007582
7583 ASSERT_NO_FATAL_FAILURE(InitState());
7584 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007585 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7586 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007587
7588 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007589 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7590 ds_pool_ci.pNext = NULL;
7591 ds_pool_ci.maxSets = 1;
7592 ds_pool_ci.poolSizeCount = 1;
7593 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007594
7595 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007596 err =
7597 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007598 ASSERT_VK_SUCCESS(err);
7599
7600 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007601 dsl_binding.binding = 0;
7602 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7603 dsl_binding.descriptorCount = 1;
7604 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7605 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007606
7607 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007608 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7609 ds_layout_ci.pNext = NULL;
7610 ds_layout_ci.bindingCount = 1;
7611 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007612 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007613 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7614 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007615 ASSERT_VK_SUCCESS(err);
7616
7617 VkDescriptorSet descriptorSet;
7618 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007619 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007620 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007621 alloc_info.descriptorPool = ds_pool;
7622 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007623 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7624 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007625 ASSERT_VK_SUCCESS(err);
7626
Karl Schultz6addd812016-02-02 17:17:23 -07007627 VkBufferView view =
7628 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007629 VkWriteDescriptorSet descriptor_write;
7630 memset(&descriptor_write, 0, sizeof(descriptor_write));
7631 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7632 descriptor_write.dstSet = descriptorSet;
7633 descriptor_write.dstBinding = 0;
7634 descriptor_write.descriptorCount = 1;
7635 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7636 descriptor_write.pTexelBufferView = &view;
7637
7638 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7639
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007640 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007641
7642 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7643 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7644}
7645
Mark Youngd339ba32016-05-30 13:28:35 -06007646TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
7647 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has"
7648 " no memory bound to it.");
7649
7650 VkResult err;
7651 m_errorMonitor->SetDesiredFailureMsg(
7652 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -06007653 "used without first calling vkBindBufferMemory");
Mark Youngd339ba32016-05-30 13:28:35 -06007654
7655 ASSERT_NO_FATAL_FAILURE(InitState());
7656
7657 // Create a buffer with no bound memory and then attempt to create
7658 // a buffer view.
7659 VkBufferCreateInfo buff_ci = {};
7660 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7661 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7662 buff_ci.size = 256;
7663 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7664 VkBuffer buffer;
7665 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
7666 ASSERT_VK_SUCCESS(err);
7667
7668 VkBufferViewCreateInfo buff_view_ci = {};
7669 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
7670 buff_view_ci.buffer = buffer;
7671 buff_view_ci.format = VK_FORMAT_R8_UNORM;
7672 buff_view_ci.range = VK_WHOLE_SIZE;
7673 VkBufferView buff_view;
7674 err =
7675 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
7676
7677 m_errorMonitor->VerifyFound();
7678 vkDestroyBuffer(m_device->device(), buffer, NULL);
7679 // If last error is success, it still created the view, so delete it.
7680 if (err == VK_SUCCESS) {
7681 vkDestroyBufferView(m_device->device(), buff_view, NULL);
7682 }
7683}
7684
Karl Schultz6addd812016-02-02 17:17:23 -07007685TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
7686 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
7687 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07007688 // 1. No dynamicOffset supplied
7689 // 2. Too many dynamicOffsets supplied
7690 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07007691 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007693 " requires 1 dynamicOffsets, but only "
7694 "0 dynamicOffsets are left in "
7695 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007696
7697 ASSERT_NO_FATAL_FAILURE(InitState());
7698 ASSERT_NO_FATAL_FAILURE(InitViewport());
7699 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7700
7701 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007702 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7703 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007704
7705 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007706 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7707 ds_pool_ci.pNext = NULL;
7708 ds_pool_ci.maxSets = 1;
7709 ds_pool_ci.poolSizeCount = 1;
7710 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007711
7712 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007713 err =
7714 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007715 ASSERT_VK_SUCCESS(err);
7716
7717 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007718 dsl_binding.binding = 0;
7719 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7720 dsl_binding.descriptorCount = 1;
7721 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7722 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007723
7724 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007725 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7726 ds_layout_ci.pNext = NULL;
7727 ds_layout_ci.bindingCount = 1;
7728 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007729 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007730 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7731 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007732 ASSERT_VK_SUCCESS(err);
7733
7734 VkDescriptorSet descriptorSet;
7735 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007736 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007737 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007738 alloc_info.descriptorPool = ds_pool;
7739 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007740 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7741 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007742 ASSERT_VK_SUCCESS(err);
7743
7744 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007745 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7746 pipeline_layout_ci.pNext = NULL;
7747 pipeline_layout_ci.setLayoutCount = 1;
7748 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007749
7750 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007751 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7752 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007753 ASSERT_VK_SUCCESS(err);
7754
7755 // Create a buffer to update the descriptor with
7756 uint32_t qfi = 0;
7757 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007758 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7759 buffCI.size = 1024;
7760 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7761 buffCI.queueFamilyIndexCount = 1;
7762 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007763
7764 VkBuffer dyub;
7765 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7766 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007767 // Allocate memory and bind to buffer so we can make it to the appropriate
7768 // error
7769 VkMemoryAllocateInfo mem_alloc = {};
7770 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7771 mem_alloc.pNext = NULL;
7772 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12007773 mem_alloc.memoryTypeIndex = 0;
7774
7775 VkMemoryRequirements memReqs;
7776 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
7777 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
7778 0);
7779 if (!pass) {
7780 vkDestroyBuffer(m_device->device(), dyub, NULL);
7781 return;
7782 }
7783
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007784 VkDeviceMemory mem;
7785 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
7786 ASSERT_VK_SUCCESS(err);
7787 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
7788 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007789 // Correctly update descriptor to avoid "NOT_UPDATED" error
7790 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007791 buffInfo.buffer = dyub;
7792 buffInfo.offset = 0;
7793 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007794
7795 VkWriteDescriptorSet descriptor_write;
7796 memset(&descriptor_write, 0, sizeof(descriptor_write));
7797 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7798 descriptor_write.dstSet = descriptorSet;
7799 descriptor_write.dstBinding = 0;
7800 descriptor_write.descriptorCount = 1;
7801 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7802 descriptor_write.pBufferInfo = &buffInfo;
7803
7804 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7805
7806 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007807 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7808 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7809 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007810 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007811 uint32_t pDynOff[2] = {512, 756};
7812 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07007813 m_errorMonitor->SetDesiredFailureMsg(
7814 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07007815 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07007816 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7817 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7818 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12007819 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007820 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7822 " dynamic offset 512 combined with "
7823 "offset 0 and range 1024 that "
7824 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07007825 // Create PSO to be used for draw-time errors below
7826 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007827 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007828 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007829 "out gl_PerVertex { \n"
7830 " vec4 gl_Position;\n"
7831 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007832 "void main(){\n"
7833 " gl_Position = vec4(1);\n"
7834 "}\n";
7835 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007836 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007837 "\n"
7838 "layout(location=0) out vec4 x;\n"
7839 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7840 "void main(){\n"
7841 " x = vec4(bar.y);\n"
7842 "}\n";
7843 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7844 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7845 VkPipelineObj pipe(m_device);
7846 pipe.AddShader(&vs);
7847 pipe.AddShader(&fs);
7848 pipe.AddColorAttachment();
7849 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7850
Karl Schultz6addd812016-02-02 17:17:23 -07007851 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7852 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7853 // This update should succeed, but offset size of 512 will overstep buffer
7854 // /w range 1024 & size 1024
7855 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7856 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7857 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07007858 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007859 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007860
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007861 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06007862 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007863
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007864 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007865 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007866 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7867}
7868
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007869TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
7870 TEST_DESCRIPTION("Attempt to update a descriptor with a non-sparse buffer "
7871 "that doesn't have memory bound");
7872 VkResult err;
7873 m_errorMonitor->SetDesiredFailureMsg(
7874 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7875 " used without first calling vkBindBufferMemory.");
7876
7877 ASSERT_NO_FATAL_FAILURE(InitState());
7878 ASSERT_NO_FATAL_FAILURE(InitViewport());
7879 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7880
7881 VkDescriptorPoolSize ds_type_count = {};
7882 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7883 ds_type_count.descriptorCount = 1;
7884
7885 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7886 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7887 ds_pool_ci.pNext = NULL;
7888 ds_pool_ci.maxSets = 1;
7889 ds_pool_ci.poolSizeCount = 1;
7890 ds_pool_ci.pPoolSizes = &ds_type_count;
7891
7892 VkDescriptorPool ds_pool;
7893 err =
7894 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
7895 ASSERT_VK_SUCCESS(err);
7896
7897 VkDescriptorSetLayoutBinding dsl_binding = {};
7898 dsl_binding.binding = 0;
7899 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7900 dsl_binding.descriptorCount = 1;
7901 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7902 dsl_binding.pImmutableSamplers = NULL;
7903
7904 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7905 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7906 ds_layout_ci.pNext = NULL;
7907 ds_layout_ci.bindingCount = 1;
7908 ds_layout_ci.pBindings = &dsl_binding;
7909 VkDescriptorSetLayout ds_layout;
7910 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7911 &ds_layout);
7912 ASSERT_VK_SUCCESS(err);
7913
7914 VkDescriptorSet descriptorSet;
7915 VkDescriptorSetAllocateInfo alloc_info = {};
7916 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7917 alloc_info.descriptorSetCount = 1;
7918 alloc_info.descriptorPool = ds_pool;
7919 alloc_info.pSetLayouts = &ds_layout;
7920 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7921 &descriptorSet);
7922 ASSERT_VK_SUCCESS(err);
7923
7924 // Create a buffer to update the descriptor with
7925 uint32_t qfi = 0;
7926 VkBufferCreateInfo buffCI = {};
7927 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7928 buffCI.size = 1024;
7929 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7930 buffCI.queueFamilyIndexCount = 1;
7931 buffCI.pQueueFamilyIndices = &qfi;
7932
7933 VkBuffer dyub;
7934 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7935 ASSERT_VK_SUCCESS(err);
7936
7937 // Attempt to update descriptor without binding memory to it
7938 VkDescriptorBufferInfo buffInfo = {};
7939 buffInfo.buffer = dyub;
7940 buffInfo.offset = 0;
7941 buffInfo.range = 1024;
7942
7943 VkWriteDescriptorSet descriptor_write;
7944 memset(&descriptor_write, 0, sizeof(descriptor_write));
7945 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7946 descriptor_write.dstSet = descriptorSet;
7947 descriptor_write.dstBinding = 0;
7948 descriptor_write.descriptorCount = 1;
7949 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7950 descriptor_write.pBufferInfo = &buffInfo;
7951
7952 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7953 m_errorMonitor->VerifyFound();
7954
7955 vkDestroyBuffer(m_device->device(), dyub, NULL);
7956 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7957 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7958}
7959
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007960TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007961 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007962 ASSERT_NO_FATAL_FAILURE(InitState());
7963 ASSERT_NO_FATAL_FAILURE(InitViewport());
7964 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7965
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007966 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007967 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007968 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7969 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7970 pipeline_layout_ci.pushConstantRangeCount = 1;
7971 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7972
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007973 //
7974 // Check for invalid push constant ranges in pipeline layouts.
7975 //
7976 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007977 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007978 char const *msg;
7979 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007980
Karl Schultzc81037d2016-05-12 08:11:23 -06007981 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7982 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7983 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7984 "vkCreatePipelineLayout() call has push constants index 0 with "
7985 "size 0."},
7986 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7987 "vkCreatePipelineLayout() call has push constants index 0 with "
7988 "size 1."},
7989 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7990 "vkCreatePipelineLayout() call has push constants index 0 with "
7991 "size 1."},
7992 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7993 "vkCreatePipelineLayout() call has push constants index 0 with "
7994 "size 0."},
7995 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7996 "vkCreatePipelineLayout() call has push constants index 0 with "
7997 "offset 1. Offset must"},
7998 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7999 "vkCreatePipelineLayout() call has push constants index 0 "
8000 "with offset "},
8001 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
8002 "vkCreatePipelineLayout() call has push constants "
8003 "index 0 with offset "},
8004 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
8005 "vkCreatePipelineLayout() call has push constants index 0 "
8006 "with offset "},
8007 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
8008 "vkCreatePipelineLayout() call has push "
8009 "constants index 0 with offset "},
8010 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
8011 "vkCreatePipelineLayout() call has push "
8012 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008013 }};
8014
8015 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06008016 for (const auto &iter : range_tests) {
8017 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8019 iter.msg);
8020 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
8021 NULL, &pipeline_layout);
8022 m_errorMonitor->VerifyFound();
8023 if (VK_SUCCESS == err) {
8024 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8025 }
8026 }
8027
8028 // Check for invalid stage flag
8029 pc_range.offset = 0;
8030 pc_range.size = 16;
8031 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008032 m_errorMonitor->SetDesiredFailureMsg(
8033 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008034 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008035 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8036 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008037 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008038 if (VK_SUCCESS == err) {
8039 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8040 }
8041
8042 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06008043 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008044 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06008045 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008046 char const *msg;
8047 };
8048
Karl Schultzc81037d2016-05-12 08:11:23 -06008049 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008050 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8051 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8052 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8053 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8054 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
8055 "vkCreatePipelineLayout() call has push constants with overlapping "
8056 "ranges: 0:[0, 4), 1:[0, 4)"},
8057 {
8058 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8059 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8060 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8061 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
8062 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
8063 "vkCreatePipelineLayout() call has push constants with "
8064 "overlapping "
8065 "ranges: 3:[12, 20), 4:[16, 20)",
8066 },
8067 {
8068 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8069 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
8070 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8071 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8072 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
8073 "vkCreatePipelineLayout() call has push constants with "
8074 "overlapping "
8075 "ranges: 0:[16, 20), 1:[12, 20)",
8076 },
8077 {
8078 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8079 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8080 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8081 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
8082 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
8083 "vkCreatePipelineLayout() call has push constants with "
8084 "overlapping "
8085 "ranges: 0:[16, 20), 3:[12, 20)",
8086 },
8087 {
8088 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8089 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
8090 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
8091 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
8092 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
8093 "vkCreatePipelineLayout() call has push constants with "
8094 "overlapping "
8095 "ranges: 0:[16, 20), 2:[4, 100)",
8096 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008097
Karl Schultzc81037d2016-05-12 08:11:23 -06008098 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008099 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06008100 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
8101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008102 iter.msg);
8103 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
8104 NULL, &pipeline_layout);
8105 m_errorMonitor->VerifyFound();
8106 if (VK_SUCCESS == err) {
8107 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8108 }
8109 }
8110
8111 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06008112 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
8113 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8114 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8115 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8116 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
8117 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
8118 ""},
8119 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
8120 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
8121 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
8122 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
8123 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
8124 ""}}};
8125 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008126 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
8127 m_errorMonitor->ExpectSuccess();
8128 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
8129 NULL, &pipeline_layout);
8130 m_errorMonitor->VerifyNotFound();
8131 if (VK_SUCCESS == err) {
8132 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8133 }
8134 }
8135
8136 //
8137 // CmdPushConstants tests
8138 //
Karl Schultzc81037d2016-05-12 08:11:23 -06008139 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008140
8141 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06008142 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
8143 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
8144 "vkCmdPushConstants() call has push constants with size 0. Size "
8145 "must be greater than zero and a multiple of 4."},
8146 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
8147 "vkCmdPushConstants() call has push constants with size 1. Size "
8148 "must be greater than zero and a multiple of 4."},
8149 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
8150 "vkCmdPushConstants() call has push constants with size 1. Size "
8151 "must be greater than zero and a multiple of 4."},
8152 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
8153 "vkCmdPushConstants() call has push constants with offset 1. "
8154 "Offset must be a multiple of 4."},
8155 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
8156 "vkCmdPushConstants() call has push constants with offset 1. "
8157 "Offset must be a multiple of 4."},
8158 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
8159 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
8160 "0x1 not within flag-matching ranges in pipeline layout"},
8161 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
8162 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
8163 "0x1 not within flag-matching ranges in pipeline layout"},
8164 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
8165 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
8166 "0x1 not within flag-matching ranges in pipeline layout"},
8167 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
8168 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
8169 "0x1 not within flag-matching ranges in pipeline layout"},
8170 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
8171 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
8172 "any of the ranges in pipeline layout"},
8173 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
8174 0, 16},
8175 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
8176 "any of the ranges in pipeline layout"},
8177 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008178 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008179 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008180 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008181 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008182 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008183 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008184 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008185 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008186 "vkCmdPushConstants() call has push constants with offset "},
8187 }};
8188
8189 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06008190 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008191 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06008192 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008193 };
Karl Schultzc81037d2016-05-12 08:11:23 -06008194 pipeline_layout_ci.pushConstantRangeCount =
8195 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008196 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008197 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8198 &pipeline_layout);
8199 ASSERT_VK_SUCCESS(err);
8200 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06008201 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008202 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8203 iter.msg);
8204 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06008205 iter.range.stageFlags, iter.range.offset,
8206 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008207 m_errorMonitor->VerifyFound();
8208 }
8209
8210 // Check for invalid stage flag
8211 m_errorMonitor->SetDesiredFailureMsg(
8212 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8213 "vkCmdPushConstants() call has no stageFlags set.");
8214 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06008215 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008216 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06008217 EndCommandBuffer();
8218 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
8219 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008220
Karl Schultzc81037d2016-05-12 08:11:23 -06008221 // overlapping range tests with cmd
8222 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
8223 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
8224 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
8225 "0x1 not within flag-matching ranges in pipeline layout"},
8226 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8227 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
8228 "0x1 not within flag-matching ranges in pipeline layout"},
8229 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
8230 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
8231 "0x1 not within flag-matching ranges in pipeline layout"},
8232 }};
8233 const VkPushConstantRange pc_range3[] = {
8234 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
8235 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
8236 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8237 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
8238 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
8239 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
8240 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
8241 };
8242 pipeline_layout_ci.pushConstantRangeCount =
8243 sizeof(pc_range3) / sizeof(VkPushConstantRange);
8244 pipeline_layout_ci.pPushConstantRanges = pc_range3;
8245 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8246 &pipeline_layout);
8247 ASSERT_VK_SUCCESS(err);
8248 BeginCommandBuffer();
8249 for (const auto &iter : cmd_overlap_tests) {
8250 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8251 iter.msg);
8252 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
8253 iter.range.stageFlags, iter.range.offset,
8254 iter.range.size, dummy_values);
8255 m_errorMonitor->VerifyFound();
8256 }
8257 EndCommandBuffer();
8258 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
8259 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8260
8261 // positive overlapping range tests with cmd
8262 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
8263 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
8264 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
8265 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
8266 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
8267 }};
8268 const VkPushConstantRange pc_range4[] = {
8269 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
8270 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
8271 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
8272 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8273 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
8274 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
8275 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
8276 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
8277 };
8278 pipeline_layout_ci.pushConstantRangeCount =
8279 sizeof(pc_range4) / sizeof(VkPushConstantRange);
8280 pipeline_layout_ci.pPushConstantRanges = pc_range4;
8281 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8282 &pipeline_layout);
8283 ASSERT_VK_SUCCESS(err);
8284 BeginCommandBuffer();
8285 for (const auto &iter : cmd_overlap_tests_pos) {
8286 m_errorMonitor->ExpectSuccess();
8287 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
8288 iter.range.stageFlags, iter.range.offset,
8289 iter.range.size, dummy_values);
8290 m_errorMonitor->VerifyNotFound();
8291 }
8292 EndCommandBuffer();
8293 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008294 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8295}
8296
Karl Schultz6addd812016-02-02 17:17:23 -07008297TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07008298 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07008299 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008300
8301 ASSERT_NO_FATAL_FAILURE(InitState());
8302 ASSERT_NO_FATAL_FAILURE(InitViewport());
8303 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8304
Mike Stroyanb8a61002016-06-20 16:00:28 -06008305 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
8306 VkImageTiling tiling;
8307 VkFormatProperties format_properties;
8308 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
8309 if (format_properties.linearTilingFeatures &
8310 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
8311 tiling = VK_IMAGE_TILING_LINEAR;
8312 } else if (format_properties.optimalTilingFeatures &
8313 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
8314 tiling = VK_IMAGE_TILING_OPTIMAL;
8315 } else {
8316 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
8317 "skipped.\n");
8318 return;
8319 }
8320
Tobin Ehlis559c6382015-11-05 09:52:49 -07008321 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
8322 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008323 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8324 ds_type_count[0].descriptorCount = 10;
8325 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8326 ds_type_count[1].descriptorCount = 2;
8327 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
8328 ds_type_count[2].descriptorCount = 2;
8329 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
8330 ds_type_count[3].descriptorCount = 5;
8331 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
8332 // type
8333 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8334 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
8335 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008336
8337 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008338 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8339 ds_pool_ci.pNext = NULL;
8340 ds_pool_ci.maxSets = 5;
8341 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
8342 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008343
8344 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008345 err =
8346 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008347 ASSERT_VK_SUCCESS(err);
8348
8349 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
8350 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008351 dsl_binding[0].binding = 0;
8352 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8353 dsl_binding[0].descriptorCount = 5;
8354 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
8355 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008356
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008357 // Create layout identical to set0 layout but w/ different stageFlags
8358 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008359 dsl_fs_stage_only.binding = 0;
8360 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8361 dsl_fs_stage_only.descriptorCount = 5;
8362 dsl_fs_stage_only.stageFlags =
8363 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
8364 // bind time
8365 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008366 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008367 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8368 ds_layout_ci.pNext = NULL;
8369 ds_layout_ci.bindingCount = 1;
8370 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008371 static const uint32_t NUM_LAYOUTS = 4;
8372 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008373 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008374 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
8375 // layout for error case
8376 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8377 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008378 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008379 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07008380 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8381 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008382 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008383 dsl_binding[0].binding = 0;
8384 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008385 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008386 dsl_binding[1].binding = 1;
8387 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
8388 dsl_binding[1].descriptorCount = 2;
8389 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
8390 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008391 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008392 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07008393 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8394 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008395 ASSERT_VK_SUCCESS(err);
8396 dsl_binding[0].binding = 0;
8397 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008398 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008399 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008400 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8401 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008402 ASSERT_VK_SUCCESS(err);
8403 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008404 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07008405 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8406 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008407 ASSERT_VK_SUCCESS(err);
8408
8409 static const uint32_t NUM_SETS = 4;
8410 VkDescriptorSet descriptorSet[NUM_SETS] = {};
8411 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008412 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008413 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008414 alloc_info.descriptorPool = ds_pool;
8415 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008416 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8417 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008418 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008419 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008420 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008421 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07008422 err =
8423 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008424 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008425
8426 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008427 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8428 pipeline_layout_ci.pNext = NULL;
8429 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
8430 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008431
8432 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008433 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8434 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008435 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008436 // Create pipelineLayout with only one setLayout
8437 pipeline_layout_ci.setLayoutCount = 1;
8438 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008439 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8440 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008441 ASSERT_VK_SUCCESS(err);
8442 // Create pipelineLayout with 2 descriptor setLayout at index 0
8443 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
8444 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07008445 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8446 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008447 ASSERT_VK_SUCCESS(err);
8448 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
8449 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
8450 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07008451 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8452 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008453 ASSERT_VK_SUCCESS(err);
8454 // Create pipelineLayout with UB type, but stageFlags for FS only
8455 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
8456 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07008457 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8458 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008459 ASSERT_VK_SUCCESS(err);
8460 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
8461 VkDescriptorSetLayout pl_bad_s0[2] = {};
8462 pl_bad_s0[0] = ds_layout_fs_only;
8463 pl_bad_s0[1] = ds_layout[1];
8464 pipeline_layout_ci.setLayoutCount = 2;
8465 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
8466 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07008467 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8468 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008469 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008470
8471 // Create a buffer to update the descriptor with
8472 uint32_t qfi = 0;
8473 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008474 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8475 buffCI.size = 1024;
8476 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
8477 buffCI.queueFamilyIndexCount = 1;
8478 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008479
8480 VkBuffer dyub;
8481 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
8482 ASSERT_VK_SUCCESS(err);
8483 // Correctly update descriptor to avoid "NOT_UPDATED" error
8484 static const uint32_t NUM_BUFFS = 5;
8485 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008486 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07008487 buffInfo[i].buffer = dyub;
8488 buffInfo[i].offset = 0;
8489 buffInfo[i].range = 1024;
8490 }
Karl Schultz6addd812016-02-02 17:17:23 -07008491 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07008492 const int32_t tex_width = 32;
8493 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008494 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008495 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8496 image_create_info.pNext = NULL;
8497 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8498 image_create_info.format = tex_format;
8499 image_create_info.extent.width = tex_width;
8500 image_create_info.extent.height = tex_height;
8501 image_create_info.extent.depth = 1;
8502 image_create_info.mipLevels = 1;
8503 image_create_info.arrayLayers = 1;
8504 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06008505 image_create_info.tiling = tiling;
8506 image_create_info.usage =
8507 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07008508 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008509 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8510 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008511
Karl Schultz6addd812016-02-02 17:17:23 -07008512 VkMemoryRequirements memReqs;
8513 VkDeviceMemory imageMem;
8514 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008515 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008516 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8517 memAlloc.pNext = NULL;
8518 memAlloc.allocationSize = 0;
8519 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008520 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
8521 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008522 pass =
8523 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008524 ASSERT_TRUE(pass);
8525 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
8526 ASSERT_VK_SUCCESS(err);
8527 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
8528 ASSERT_VK_SUCCESS(err);
8529
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008530 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008531 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8532 image_view_create_info.image = image;
8533 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8534 image_view_create_info.format = tex_format;
8535 image_view_create_info.subresourceRange.layerCount = 1;
8536 image_view_create_info.subresourceRange.baseMipLevel = 0;
8537 image_view_create_info.subresourceRange.levelCount = 1;
8538 image_view_create_info.subresourceRange.aspectMask =
8539 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008540
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008541 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008542 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8543 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008544 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008545 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008546 imageInfo[0].imageView = view;
8547 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
8548 imageInfo[1].imageView = view;
8549 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008550 imageInfo[2].imageView = view;
8551 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
8552 imageInfo[3].imageView = view;
8553 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008554
8555 static const uint32_t NUM_SET_UPDATES = 3;
8556 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
8557 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8558 descriptor_write[0].dstSet = descriptorSet[0];
8559 descriptor_write[0].dstBinding = 0;
8560 descriptor_write[0].descriptorCount = 5;
8561 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8562 descriptor_write[0].pBufferInfo = buffInfo;
8563 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8564 descriptor_write[1].dstSet = descriptorSet[1];
8565 descriptor_write[1].dstBinding = 0;
8566 descriptor_write[1].descriptorCount = 2;
8567 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8568 descriptor_write[1].pImageInfo = imageInfo;
8569 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8570 descriptor_write[2].dstSet = descriptorSet[1];
8571 descriptor_write[2].dstBinding = 1;
8572 descriptor_write[2].descriptorCount = 2;
8573 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008574 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008575
8576 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008577
Tobin Ehlis88452832015-12-03 09:40:56 -07008578 // Create PSO to be used for draw-time errors below
8579 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12008580 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008581 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008582 "out gl_PerVertex {\n"
8583 " vec4 gl_Position;\n"
8584 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008585 "void main(){\n"
8586 " gl_Position = vec4(1);\n"
8587 "}\n";
8588 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12008589 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008590 "\n"
8591 "layout(location=0) out vec4 x;\n"
8592 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
8593 "void main(){\n"
8594 " x = vec4(bar.y);\n"
8595 "}\n";
8596 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8597 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008598 VkPipelineObj pipe(m_device);
8599 pipe.AddShader(&vs);
8600 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07008601 pipe.AddColorAttachment();
8602 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07008603
8604 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07008605
Karl Schultz6addd812016-02-02 17:17:23 -07008606 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8607 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8608 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
8609 // of PSO
8610 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
8611 // cmd_pipeline.c
8612 // due to the fact that cmd_alloc_dset_data() has not been called in
8613 // cmd_bind_graphics_pipeline()
8614 // TODO : Want to cause various binding incompatibility issues here to test
8615 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07008616 // First cause various verify_layout_compatibility() fails
8617 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008618 // verify_set_layout_compatibility fail cases:
8619 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07008620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06008621 "Invalid Pipeline Layout Object ");
Karl Schultz6addd812016-02-02 17:17:23 -07008622 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8623 VK_PIPELINE_BIND_POINT_GRAPHICS,
8624 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
8625 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008626 m_errorMonitor->VerifyFound();
8627
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008628 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07008629 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8630 " attempting to bind set to index 1");
8631 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8632 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
8633 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008634 m_errorMonitor->VerifyFound();
8635
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008636 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008637 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
8638 // descriptors
8639 m_errorMonitor->SetDesiredFailureMsg(
8640 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008641 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07008642 vkCmdBindDescriptorSets(
8643 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8644 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008645 m_errorMonitor->VerifyFound();
8646
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008647 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
8648 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07008649 m_errorMonitor->SetDesiredFailureMsg(
8650 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008651 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07008652 vkCmdBindDescriptorSets(
8653 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8654 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008655 m_errorMonitor->VerifyFound();
8656
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008657 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
8658 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07008659 m_errorMonitor->SetDesiredFailureMsg(
8660 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008661 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07008662 vkCmdBindDescriptorSets(
8663 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8664 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008665 m_errorMonitor->VerifyFound();
8666
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008667 // Cause INFO messages due to disturbing previously bound Sets
8668 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07008669 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8670 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8671 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008672 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07008673 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008674 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008675 " previously bound as set #0 was disturbed ");
8676 vkCmdBindDescriptorSets(
8677 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8678 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008679 m_errorMonitor->VerifyFound();
8680
Karl Schultz6addd812016-02-02 17:17:23 -07008681 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8682 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8683 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008684 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008685 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008686 " newly bound as set #0 so set #1 and "
8687 "any subsequent sets were disturbed ");
8688 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8689 VK_PIPELINE_BIND_POINT_GRAPHICS,
8690 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008691 m_errorMonitor->VerifyFound();
8692
Tobin Ehlis10fad692016-07-07 12:00:36 -06008693 // Now that we're done actively using the pipelineLayout that gfx pipeline
8694 // was created with, we should be able to delete it. Do that now to verify
8695 // that validation obeys pipelineLayout lifetime
8696 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
8697
Tobin Ehlis88452832015-12-03 09:40:56 -07008698 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07008699 // 1. Error due to not binding required set (we actually use same code as
8700 // above to disturb set0)
8701 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8702 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8703 2, &descriptorSet[0], 0, NULL);
8704 vkCmdBindDescriptorSets(
8705 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8706 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
8707 m_errorMonitor->SetDesiredFailureMsg(
8708 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8709 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07008710 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008711 m_errorMonitor->VerifyFound();
8712
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008713 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008714 // 2. Error due to bound set not being compatible with PSO's
8715 // VkPipelineLayout (diff stageFlags in this case)
8716 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8717 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8718 2, &descriptorSet[0], 0, NULL);
8719 m_errorMonitor->SetDesiredFailureMsg(
8720 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8721 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07008722 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008723 m_errorMonitor->VerifyFound();
8724
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008725 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07008726 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008727 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
8728 }
8729 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06008730 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
8731 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008732 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008733 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8734 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008735 vkFreeMemory(m_device->device(), imageMem, NULL);
8736 vkDestroyImage(m_device->device(), image, NULL);
8737 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008738}
Tobin Ehlis559c6382015-11-05 09:52:49 -07008739
Karl Schultz6addd812016-02-02 17:17:23 -07008740TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008741
Karl Schultz6addd812016-02-02 17:17:23 -07008742 m_errorMonitor->SetDesiredFailureMsg(
8743 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008744 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008745
8746 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008747 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008748 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008749 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008750
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008751 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008752}
8753
Karl Schultz6addd812016-02-02 17:17:23 -07008754TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
8755 VkResult err;
8756 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008757
Karl Schultz6addd812016-02-02 17:17:23 -07008758 m_errorMonitor->SetDesiredFailureMsg(
8759 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07008760 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008761
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008762 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008763
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008764 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008765 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008766 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008767 cmd.commandPool = m_commandPool;
8768 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008769 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06008770
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008771 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06008772 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008773
8774 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008775 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008776 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008777 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008778 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008779 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
8780 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008781 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008782
8783 // The error should be caught by validation of the BeginCommandBuffer call
8784 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
8785
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008786 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008787 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008788}
8789
Karl Schultz6addd812016-02-02 17:17:23 -07008790TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008791 // Cause error due to Begin while recording CB
8792 // Then cause 2 errors for attempting to reset CB w/o having
8793 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
8794 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008796 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008797
8798 ASSERT_NO_FATAL_FAILURE(InitState());
8799
8800 // Calls AllocateCommandBuffers
8801 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
8802
Karl Schultz6addd812016-02-02 17:17:23 -07008803 // Force the failure by setting the Renderpass and Framebuffer fields with
8804 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008805 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008806 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008807 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8808 cmd_buf_info.pNext = NULL;
8809 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008810 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008811
8812 // Begin CB to transition to recording state
8813 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
8814 // Can't re-begin. This should trigger error
8815 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008816 m_errorMonitor->VerifyFound();
8817
Karl Schultz6addd812016-02-02 17:17:23 -07008818 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8819 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008820 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
8821 // Reset attempt will trigger error due to incorrect CommandPool state
8822 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008823 m_errorMonitor->VerifyFound();
8824
Karl Schultz6addd812016-02-02 17:17:23 -07008825 m_errorMonitor->SetDesiredFailureMsg(
8826 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8827 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008828 // Transition CB to RECORDED state
8829 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
8830 // Now attempting to Begin will implicitly reset, which triggers error
8831 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008832 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008833}
8834
Karl Schultz6addd812016-02-02 17:17:23 -07008835TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008836 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008837 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008838
Karl Schultz6addd812016-02-02 17:17:23 -07008839 m_errorMonitor->SetDesiredFailureMsg(
8840 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008841 "Invalid Pipeline CreateInfo State: Vtx Shader required");
8842
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008843 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008844 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008845
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008846 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008847 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8848 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06008849
8850 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008851 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8852 ds_pool_ci.pNext = NULL;
8853 ds_pool_ci.maxSets = 1;
8854 ds_pool_ci.poolSizeCount = 1;
8855 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008856
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008857 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008858 err =
8859 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008860 ASSERT_VK_SUCCESS(err);
8861
Tony Barboureb254902015-07-15 12:50:33 -06008862 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008863 dsl_binding.binding = 0;
8864 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8865 dsl_binding.descriptorCount = 1;
8866 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8867 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008868
Tony Barboureb254902015-07-15 12:50:33 -06008869 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008870 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8871 ds_layout_ci.pNext = NULL;
8872 ds_layout_ci.bindingCount = 1;
8873 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06008874
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008875 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008876 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8877 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008878 ASSERT_VK_SUCCESS(err);
8879
8880 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008881 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008882 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008883 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008884 alloc_info.descriptorPool = ds_pool;
8885 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008886 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8887 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008888 ASSERT_VK_SUCCESS(err);
8889
Tony Barboureb254902015-07-15 12:50:33 -06008890 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008891 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8892 pipeline_layout_ci.setLayoutCount = 1;
8893 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008894
8895 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008896 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8897 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008898 ASSERT_VK_SUCCESS(err);
8899
Tobin Ehlise68360f2015-10-01 11:15:13 -06008900 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008901 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06008902
8903 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008904 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8905 vp_state_ci.scissorCount = 1;
8906 vp_state_ci.pScissors = &sc;
8907 vp_state_ci.viewportCount = 1;
8908 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008909
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008910 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8911 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8912 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8913 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8914 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8915 rs_state_ci.depthClampEnable = VK_FALSE;
8916 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8917 rs_state_ci.depthBiasEnable = VK_FALSE;
8918
Tony Barboureb254902015-07-15 12:50:33 -06008919 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008920 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8921 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008922 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008923 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8924 gp_ci.layout = pipeline_layout;
8925 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06008926
8927 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008928 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8929 pc_ci.initialDataSize = 0;
8930 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008931
8932 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06008933 VkPipelineCache pipelineCache;
8934
Karl Schultz6addd812016-02-02 17:17:23 -07008935 err =
8936 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06008937 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008938 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8939 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008940
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008941 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008942
Chia-I Wuf7458c52015-10-26 21:10:41 +08008943 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8944 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8945 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8946 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008947}
Tobin Ehlis912df022015-09-17 08:46:18 -06008948/*// TODO : This test should be good, but needs Tess support in compiler to run
8949TEST_F(VkLayerTest, InvalidPatchControlPoints)
8950{
8951 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06008952 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008953
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008955 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
8956primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008957
Tobin Ehlis912df022015-09-17 08:46:18 -06008958 ASSERT_NO_FATAL_FAILURE(InitState());
8959 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06008960
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008961 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06008962 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008963 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008964
8965 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8966 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8967 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008968 ds_pool_ci.poolSizeCount = 1;
8969 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06008970
8971 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008972 err = vkCreateDescriptorPool(m_device->device(),
8973VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06008974 ASSERT_VK_SUCCESS(err);
8975
8976 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08008977 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06008978 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08008979 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008980 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8981 dsl_binding.pImmutableSamplers = NULL;
8982
8983 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008984 ds_layout_ci.sType =
8985VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008986 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008987 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008988 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06008989
8990 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008991 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8992&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008993 ASSERT_VK_SUCCESS(err);
8994
8995 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07008996 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
8997VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06008998 ASSERT_VK_SUCCESS(err);
8999
9000 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009001 pipeline_layout_ci.sType =
9002VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06009003 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009004 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06009005 pipeline_layout_ci.pSetLayouts = &ds_layout;
9006
9007 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009008 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9009&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06009010 ASSERT_VK_SUCCESS(err);
9011
9012 VkPipelineShaderStageCreateInfo shaderStages[3];
9013 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
9014
Karl Schultz6addd812016-02-02 17:17:23 -07009015 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
9016this);
Tobin Ehlis912df022015-09-17 08:46:18 -06009017 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07009018 VkShaderObj
9019tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
9020this);
9021 VkShaderObj
9022te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
9023this);
Tobin Ehlis912df022015-09-17 08:46:18 -06009024
Karl Schultz6addd812016-02-02 17:17:23 -07009025 shaderStages[0].sType =
9026VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009027 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06009028 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07009029 shaderStages[1].sType =
9030VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009031 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06009032 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07009033 shaderStages[2].sType =
9034VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009035 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06009036 shaderStages[2].shader = te.handle();
9037
9038 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009039 iaCI.sType =
9040VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08009041 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06009042
9043 VkPipelineTessellationStateCreateInfo tsCI = {};
9044 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
9045 tsCI.patchControlPoints = 0; // This will cause an error
9046
9047 VkGraphicsPipelineCreateInfo gp_ci = {};
9048 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9049 gp_ci.pNext = NULL;
9050 gp_ci.stageCount = 3;
9051 gp_ci.pStages = shaderStages;
9052 gp_ci.pVertexInputState = NULL;
9053 gp_ci.pInputAssemblyState = &iaCI;
9054 gp_ci.pTessellationState = &tsCI;
9055 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009056 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06009057 gp_ci.pMultisampleState = NULL;
9058 gp_ci.pDepthStencilState = NULL;
9059 gp_ci.pColorBlendState = NULL;
9060 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9061 gp_ci.layout = pipeline_layout;
9062 gp_ci.renderPass = renderPass();
9063
9064 VkPipelineCacheCreateInfo pc_ci = {};
9065 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9066 pc_ci.pNext = NULL;
9067 pc_ci.initialSize = 0;
9068 pc_ci.initialData = 0;
9069 pc_ci.maxSize = 0;
9070
9071 VkPipeline pipeline;
9072 VkPipelineCache pipelineCache;
9073
Karl Schultz6addd812016-02-02 17:17:23 -07009074 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
9075&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06009076 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009077 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9078&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06009079
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009080 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009081
Chia-I Wuf7458c52015-10-26 21:10:41 +08009082 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9083 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9084 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9085 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06009086}
9087*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06009088// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07009089TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07009090 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009091
Karl Schultz6addd812016-02-02 17:17:23 -07009092 m_errorMonitor->SetDesiredFailureMsg(
9093 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009094 "Gfx Pipeline viewport count (1) must match scissor count (0).");
9095
Tobin Ehlise68360f2015-10-01 11:15:13 -06009096 ASSERT_NO_FATAL_FAILURE(InitState());
9097 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06009098
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009099 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009100 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9101 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009102
9103 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009104 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9105 ds_pool_ci.maxSets = 1;
9106 ds_pool_ci.poolSizeCount = 1;
9107 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009108
9109 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009110 err =
9111 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009112 ASSERT_VK_SUCCESS(err);
9113
9114 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009115 dsl_binding.binding = 0;
9116 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9117 dsl_binding.descriptorCount = 1;
9118 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009119
9120 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009121 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9122 ds_layout_ci.bindingCount = 1;
9123 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009124
9125 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009126 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9127 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009128 ASSERT_VK_SUCCESS(err);
9129
9130 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009131 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009132 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009133 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009134 alloc_info.descriptorPool = ds_pool;
9135 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009136 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9137 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009138 ASSERT_VK_SUCCESS(err);
9139
9140 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009141 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9142 pipeline_layout_ci.setLayoutCount = 1;
9143 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009144
9145 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009146 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9147 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009148 ASSERT_VK_SUCCESS(err);
9149
9150 VkViewport vp = {}; // Just need dummy vp to point to
9151
9152 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009153 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9154 vp_state_ci.scissorCount = 0;
9155 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
9156 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009157
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009158 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
9159 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9160 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
9161 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
9162 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9163 rs_state_ci.depthClampEnable = VK_FALSE;
9164 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
9165 rs_state_ci.depthBiasEnable = VK_FALSE;
9166
Cody Northropeb3a6c12015-10-05 14:44:45 -06009167 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009168 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009169
Karl Schultz6addd812016-02-02 17:17:23 -07009170 VkShaderObj vs(m_device, bindStateVertShaderText,
9171 VK_SHADER_STAGE_VERTEX_BIT, this);
9172 VkShaderObj fs(m_device, bindStateFragShaderText,
9173 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009174 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009175 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009176 shaderStages[0] = vs.GetStageCreateInfo();
9177 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009178
9179 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009180 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9181 gp_ci.stageCount = 2;
9182 gp_ci.pStages = shaderStages;
9183 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009184 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07009185 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9186 gp_ci.layout = pipeline_layout;
9187 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009188
9189 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009190 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009191
9192 VkPipeline pipeline;
9193 VkPipelineCache pipelineCache;
9194
Karl Schultz6addd812016-02-02 17:17:23 -07009195 err =
9196 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009197 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009198 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9199 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009200
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009201 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009202
Chia-I Wuf7458c52015-10-26 21:10:41 +08009203 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9204 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9205 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9206 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009207}
Karl Schultz6addd812016-02-02 17:17:23 -07009208// Don't set viewport state in PSO. This is an error b/c we always need this
9209// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06009210// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07009211TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06009212 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07009213 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009214
Karl Schultz6addd812016-02-02 17:17:23 -07009215 m_errorMonitor->SetDesiredFailureMsg(
9216 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009217 "Gfx Pipeline pViewportState is null. Even if ");
9218
Tobin Ehlise68360f2015-10-01 11:15:13 -06009219 ASSERT_NO_FATAL_FAILURE(InitState());
9220 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06009221
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009222 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009223 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9224 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009225
9226 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009227 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9228 ds_pool_ci.maxSets = 1;
9229 ds_pool_ci.poolSizeCount = 1;
9230 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009231
9232 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009233 err =
9234 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009235 ASSERT_VK_SUCCESS(err);
9236
9237 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009238 dsl_binding.binding = 0;
9239 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9240 dsl_binding.descriptorCount = 1;
9241 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009242
9243 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009244 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9245 ds_layout_ci.bindingCount = 1;
9246 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009247
9248 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009249 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9250 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009251 ASSERT_VK_SUCCESS(err);
9252
9253 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009254 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009255 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009256 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009257 alloc_info.descriptorPool = ds_pool;
9258 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009259 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9260 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009261 ASSERT_VK_SUCCESS(err);
9262
9263 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009264 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9265 pipeline_layout_ci.setLayoutCount = 1;
9266 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009267
9268 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009269 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9270 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009271 ASSERT_VK_SUCCESS(err);
9272
9273 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
9274 // Set scissor as dynamic to avoid second error
9275 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009276 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9277 dyn_state_ci.dynamicStateCount = 1;
9278 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009279
Cody Northropeb3a6c12015-10-05 14:44:45 -06009280 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009281 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009282
Karl Schultz6addd812016-02-02 17:17:23 -07009283 VkShaderObj vs(m_device, bindStateVertShaderText,
9284 VK_SHADER_STAGE_VERTEX_BIT, this);
9285 VkShaderObj fs(m_device, bindStateFragShaderText,
9286 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009287 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009288 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009289 shaderStages[0] = vs.GetStageCreateInfo();
9290 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009291
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009292
9293 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
9294 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9295 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
9296 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
9297 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9298 rs_state_ci.depthClampEnable = VK_FALSE;
9299 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
9300 rs_state_ci.depthBiasEnable = VK_FALSE;
9301
Tobin Ehlise68360f2015-10-01 11:15:13 -06009302 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009303 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9304 gp_ci.stageCount = 2;
9305 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009306 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07009307 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
9308 // should cause validation error
9309 gp_ci.pDynamicState = &dyn_state_ci;
9310 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9311 gp_ci.layout = pipeline_layout;
9312 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009313
9314 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009315 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009316
9317 VkPipeline pipeline;
9318 VkPipelineCache pipelineCache;
9319
Karl Schultz6addd812016-02-02 17:17:23 -07009320 err =
9321 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009322 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009323 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9324 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009325
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009326 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009327
Chia-I Wuf7458c52015-10-26 21:10:41 +08009328 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9329 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9330 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9331 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009332}
9333// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07009334// Then run second test where dynamic scissor count doesn't match PSO scissor
9335// count
9336TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
9337 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009338
Karl Schultz6addd812016-02-02 17:17:23 -07009339 m_errorMonitor->SetDesiredFailureMsg(
9340 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009341 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
9342
Tobin Ehlise68360f2015-10-01 11:15:13 -06009343 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009344
9345 if (!m_device->phy().features().multiViewport) {
9346 printf("Device does not support multiple viewports/scissors; skipped.\n");
9347 return;
9348 }
9349
Tobin Ehlise68360f2015-10-01 11:15:13 -06009350 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06009351
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009352 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009353 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9354 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009355
9356 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009357 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9358 ds_pool_ci.maxSets = 1;
9359 ds_pool_ci.poolSizeCount = 1;
9360 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009361
9362 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009363 err =
9364 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009365 ASSERT_VK_SUCCESS(err);
9366
9367 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009368 dsl_binding.binding = 0;
9369 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9370 dsl_binding.descriptorCount = 1;
9371 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009372
9373 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009374 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9375 ds_layout_ci.bindingCount = 1;
9376 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009377
9378 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009379 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9380 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009381 ASSERT_VK_SUCCESS(err);
9382
9383 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009384 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009385 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009386 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009387 alloc_info.descriptorPool = ds_pool;
9388 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009389 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9390 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009391 ASSERT_VK_SUCCESS(err);
9392
9393 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009394 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9395 pipeline_layout_ci.setLayoutCount = 1;
9396 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009397
9398 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009399 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9400 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009401 ASSERT_VK_SUCCESS(err);
9402
9403 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009404 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9405 vp_state_ci.viewportCount = 1;
9406 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
9407 vp_state_ci.scissorCount = 1;
9408 vp_state_ci.pScissors =
9409 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06009410
9411 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
9412 // Set scissor as dynamic to avoid that error
9413 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009414 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9415 dyn_state_ci.dynamicStateCount = 1;
9416 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009417
Cody Northropeb3a6c12015-10-05 14:44:45 -06009418 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009419 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009420
Karl Schultz6addd812016-02-02 17:17:23 -07009421 VkShaderObj vs(m_device, bindStateVertShaderText,
9422 VK_SHADER_STAGE_VERTEX_BIT, this);
9423 VkShaderObj fs(m_device, bindStateFragShaderText,
9424 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009425 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009426 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009427 shaderStages[0] = vs.GetStageCreateInfo();
9428 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009429
Cody Northropf6622dc2015-10-06 10:33:21 -06009430 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9431 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9432 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009433 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06009434 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009435 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06009436 vi_ci.pVertexAttributeDescriptions = nullptr;
9437
9438 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9439 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9440 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9441
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009442 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009443 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06009444 rs_ci.pNext = nullptr;
9445
Mark Youngc89c6312016-03-31 16:03:20 -06009446 VkPipelineColorBlendAttachmentState att = {};
9447 att.blendEnable = VK_FALSE;
9448 att.colorWriteMask = 0xf;
9449
Cody Northropf6622dc2015-10-06 10:33:21 -06009450 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9451 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9452 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06009453 cb_ci.attachmentCount = 1;
9454 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06009455
Tobin Ehlise68360f2015-10-01 11:15:13 -06009456 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009457 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9458 gp_ci.stageCount = 2;
9459 gp_ci.pStages = shaderStages;
9460 gp_ci.pVertexInputState = &vi_ci;
9461 gp_ci.pInputAssemblyState = &ia_ci;
9462 gp_ci.pViewportState = &vp_state_ci;
9463 gp_ci.pRasterizationState = &rs_ci;
9464 gp_ci.pColorBlendState = &cb_ci;
9465 gp_ci.pDynamicState = &dyn_state_ci;
9466 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9467 gp_ci.layout = pipeline_layout;
9468 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009469
9470 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009471 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009472
9473 VkPipeline pipeline;
9474 VkPipelineCache pipelineCache;
9475
Karl Schultz6addd812016-02-02 17:17:23 -07009476 err =
9477 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009478 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009479 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9480 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009481
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009482 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009483
Tobin Ehlisd332f282015-10-02 11:00:56 -06009484 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07009485 // First need to successfully create the PSO from above by setting
9486 // pViewports
9487 m_errorMonitor->SetDesiredFailureMsg(
9488 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009489 "Dynamic scissor(s) 0 are used by PSO, ");
Karl Schultz6addd812016-02-02 17:17:23 -07009490
9491 VkViewport vp = {}; // Just need dummy vp to point to
9492 vp_state_ci.pViewports = &vp;
9493 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9494 &gp_ci, NULL, &pipeline);
9495 ASSERT_VK_SUCCESS(err);
9496 BeginCommandBuffer();
9497 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9498 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009499 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07009500 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009501 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07009502 Draw(1, 0, 0, 0);
9503
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009504 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07009505
9506 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9507 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9508 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9509 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009510 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07009511}
9512// Create PSO w/o non-zero scissorCount but no scissor data
9513// Then run second test where dynamic viewportCount doesn't match PSO
9514// viewportCount
9515TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
9516 VkResult err;
9517
9518 m_errorMonitor->SetDesiredFailureMsg(
9519 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9520 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
9521
9522 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009523
9524 if (!m_device->phy().features().multiViewport) {
9525 printf("Device does not support multiple viewports/scissors; skipped.\n");
9526 return;
9527 }
9528
Karl Schultz6addd812016-02-02 17:17:23 -07009529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9530
9531 VkDescriptorPoolSize ds_type_count = {};
9532 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9533 ds_type_count.descriptorCount = 1;
9534
9535 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9536 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9537 ds_pool_ci.maxSets = 1;
9538 ds_pool_ci.poolSizeCount = 1;
9539 ds_pool_ci.pPoolSizes = &ds_type_count;
9540
9541 VkDescriptorPool ds_pool;
9542 err =
9543 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9544 ASSERT_VK_SUCCESS(err);
9545
9546 VkDescriptorSetLayoutBinding dsl_binding = {};
9547 dsl_binding.binding = 0;
9548 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9549 dsl_binding.descriptorCount = 1;
9550 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9551
9552 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9553 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9554 ds_layout_ci.bindingCount = 1;
9555 ds_layout_ci.pBindings = &dsl_binding;
9556
9557 VkDescriptorSetLayout ds_layout;
9558 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9559 &ds_layout);
9560 ASSERT_VK_SUCCESS(err);
9561
9562 VkDescriptorSet descriptorSet;
9563 VkDescriptorSetAllocateInfo alloc_info = {};
9564 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9565 alloc_info.descriptorSetCount = 1;
9566 alloc_info.descriptorPool = ds_pool;
9567 alloc_info.pSetLayouts = &ds_layout;
9568 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9569 &descriptorSet);
9570 ASSERT_VK_SUCCESS(err);
9571
9572 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9573 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9574 pipeline_layout_ci.setLayoutCount = 1;
9575 pipeline_layout_ci.pSetLayouts = &ds_layout;
9576
9577 VkPipelineLayout pipeline_layout;
9578 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9579 &pipeline_layout);
9580 ASSERT_VK_SUCCESS(err);
9581
9582 VkPipelineViewportStateCreateInfo vp_state_ci = {};
9583 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9584 vp_state_ci.scissorCount = 1;
9585 vp_state_ci.pScissors =
9586 NULL; // Null scissor w/ count of 1 should cause error
9587 vp_state_ci.viewportCount = 1;
9588 vp_state_ci.pViewports =
9589 NULL; // vp is dynamic (below) so this won't cause error
9590
9591 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
9592 // Set scissor as dynamic to avoid that error
9593 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
9594 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9595 dyn_state_ci.dynamicStateCount = 1;
9596 dyn_state_ci.pDynamicStates = &vp_state;
9597
9598 VkPipelineShaderStageCreateInfo shaderStages[2];
9599 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
9600
9601 VkShaderObj vs(m_device, bindStateVertShaderText,
9602 VK_SHADER_STAGE_VERTEX_BIT, this);
9603 VkShaderObj fs(m_device, bindStateFragShaderText,
9604 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009605 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009606 // but add it to be able to run on more devices
9607 shaderStages[0] = vs.GetStageCreateInfo();
9608 shaderStages[1] = fs.GetStageCreateInfo();
9609
9610 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9611 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9612 vi_ci.pNext = nullptr;
9613 vi_ci.vertexBindingDescriptionCount = 0;
9614 vi_ci.pVertexBindingDescriptions = nullptr;
9615 vi_ci.vertexAttributeDescriptionCount = 0;
9616 vi_ci.pVertexAttributeDescriptions = nullptr;
9617
9618 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9619 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9620 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9621
9622 VkPipelineRasterizationStateCreateInfo rs_ci = {};
9623 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9624 rs_ci.pNext = nullptr;
9625
Mark Youngc89c6312016-03-31 16:03:20 -06009626 VkPipelineColorBlendAttachmentState att = {};
9627 att.blendEnable = VK_FALSE;
9628 att.colorWriteMask = 0xf;
9629
Karl Schultz6addd812016-02-02 17:17:23 -07009630 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9631 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9632 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06009633 cb_ci.attachmentCount = 1;
9634 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07009635
9636 VkGraphicsPipelineCreateInfo gp_ci = {};
9637 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9638 gp_ci.stageCount = 2;
9639 gp_ci.pStages = shaderStages;
9640 gp_ci.pVertexInputState = &vi_ci;
9641 gp_ci.pInputAssemblyState = &ia_ci;
9642 gp_ci.pViewportState = &vp_state_ci;
9643 gp_ci.pRasterizationState = &rs_ci;
9644 gp_ci.pColorBlendState = &cb_ci;
9645 gp_ci.pDynamicState = &dyn_state_ci;
9646 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9647 gp_ci.layout = pipeline_layout;
9648 gp_ci.renderPass = renderPass();
9649
9650 VkPipelineCacheCreateInfo pc_ci = {};
9651 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9652
9653 VkPipeline pipeline;
9654 VkPipelineCache pipelineCache;
9655
9656 err =
9657 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9658 ASSERT_VK_SUCCESS(err);
9659 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9660 &gp_ci, NULL, &pipeline);
9661
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009662 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07009663
9664 // Now hit second fail case where we set scissor w/ different count than PSO
9665 // First need to successfully create the PSO from above by setting
9666 // pViewports
9667 m_errorMonitor->SetDesiredFailureMsg(
9668 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009669 "Dynamic viewport(s) 0 are used by PSO, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009670
Tobin Ehlisd332f282015-10-02 11:00:56 -06009671 VkRect2D sc = {}; // Just need dummy vp to point to
9672 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07009673 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9674 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009675 ASSERT_VK_SUCCESS(err);
9676 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009677 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9678 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009679 VkViewport viewports[1] = {}; // don't care about data
Tobin Ehlisd332f282015-10-02 11:00:56 -06009680 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009681 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009682 Draw(1, 0, 0, 0);
9683
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009684 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009685
Chia-I Wuf7458c52015-10-26 21:10:41 +08009686 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9687 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9688 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9689 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009690 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009691}
9692
Mark Young7394fdd2016-03-31 14:56:43 -06009693TEST_F(VkLayerTest, PSOLineWidthInvalid) {
9694 VkResult err;
9695
9696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009697 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009698
9699 ASSERT_NO_FATAL_FAILURE(InitState());
9700 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9701
9702 VkDescriptorPoolSize ds_type_count = {};
9703 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9704 ds_type_count.descriptorCount = 1;
9705
9706 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9707 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9708 ds_pool_ci.maxSets = 1;
9709 ds_pool_ci.poolSizeCount = 1;
9710 ds_pool_ci.pPoolSizes = &ds_type_count;
9711
9712 VkDescriptorPool ds_pool;
9713 err =
9714 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9715 ASSERT_VK_SUCCESS(err);
9716
9717 VkDescriptorSetLayoutBinding dsl_binding = {};
9718 dsl_binding.binding = 0;
9719 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9720 dsl_binding.descriptorCount = 1;
9721 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9722
9723 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9724 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9725 ds_layout_ci.bindingCount = 1;
9726 ds_layout_ci.pBindings = &dsl_binding;
9727
9728 VkDescriptorSetLayout ds_layout;
9729 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9730 &ds_layout);
9731 ASSERT_VK_SUCCESS(err);
9732
9733 VkDescriptorSet descriptorSet;
9734 VkDescriptorSetAllocateInfo alloc_info = {};
9735 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9736 alloc_info.descriptorSetCount = 1;
9737 alloc_info.descriptorPool = ds_pool;
9738 alloc_info.pSetLayouts = &ds_layout;
9739 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9740 &descriptorSet);
9741 ASSERT_VK_SUCCESS(err);
9742
9743 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9744 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9745 pipeline_layout_ci.setLayoutCount = 1;
9746 pipeline_layout_ci.pSetLayouts = &ds_layout;
9747
9748 VkPipelineLayout pipeline_layout;
9749 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9750 &pipeline_layout);
9751 ASSERT_VK_SUCCESS(err);
9752
9753 VkPipelineViewportStateCreateInfo vp_state_ci = {};
9754 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9755 vp_state_ci.scissorCount = 1;
9756 vp_state_ci.pScissors = NULL;
9757 vp_state_ci.viewportCount = 1;
9758 vp_state_ci.pViewports = NULL;
9759
9760 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
9761 VK_DYNAMIC_STATE_SCISSOR,
9762 VK_DYNAMIC_STATE_LINE_WIDTH};
9763 // Set scissor as dynamic to avoid that error
9764 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
9765 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9766 dyn_state_ci.dynamicStateCount = 2;
9767 dyn_state_ci.pDynamicStates = dynamic_states;
9768
9769 VkPipelineShaderStageCreateInfo shaderStages[2];
9770 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
9771
9772 VkShaderObj vs(m_device, bindStateVertShaderText,
9773 VK_SHADER_STAGE_VERTEX_BIT, this);
9774 VkShaderObj fs(m_device, bindStateFragShaderText,
9775 VK_SHADER_STAGE_FRAGMENT_BIT,
9776 this); // TODO - We shouldn't need a fragment shader
9777 // but add it to be able to run on more devices
9778 shaderStages[0] = vs.GetStageCreateInfo();
9779 shaderStages[1] = fs.GetStageCreateInfo();
9780
9781 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9782 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9783 vi_ci.pNext = nullptr;
9784 vi_ci.vertexBindingDescriptionCount = 0;
9785 vi_ci.pVertexBindingDescriptions = nullptr;
9786 vi_ci.vertexAttributeDescriptionCount = 0;
9787 vi_ci.pVertexAttributeDescriptions = nullptr;
9788
9789 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9790 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9791 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9792
9793 VkPipelineRasterizationStateCreateInfo rs_ci = {};
9794 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9795 rs_ci.pNext = nullptr;
9796
Mark Young47107952016-05-02 15:59:55 -06009797 // Check too low (line width of -1.0f).
9798 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06009799
9800 VkPipelineColorBlendAttachmentState att = {};
9801 att.blendEnable = VK_FALSE;
9802 att.colorWriteMask = 0xf;
9803
9804 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9805 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9806 cb_ci.pNext = nullptr;
9807 cb_ci.attachmentCount = 1;
9808 cb_ci.pAttachments = &att;
9809
9810 VkGraphicsPipelineCreateInfo gp_ci = {};
9811 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9812 gp_ci.stageCount = 2;
9813 gp_ci.pStages = shaderStages;
9814 gp_ci.pVertexInputState = &vi_ci;
9815 gp_ci.pInputAssemblyState = &ia_ci;
9816 gp_ci.pViewportState = &vp_state_ci;
9817 gp_ci.pRasterizationState = &rs_ci;
9818 gp_ci.pColorBlendState = &cb_ci;
9819 gp_ci.pDynamicState = &dyn_state_ci;
9820 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9821 gp_ci.layout = pipeline_layout;
9822 gp_ci.renderPass = renderPass();
9823
9824 VkPipelineCacheCreateInfo pc_ci = {};
9825 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9826
9827 VkPipeline pipeline;
9828 VkPipelineCache pipelineCache;
9829
9830 err =
9831 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9832 ASSERT_VK_SUCCESS(err);
9833 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9834 &gp_ci, NULL, &pipeline);
9835
9836 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009837 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009838
9839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9840 "Attempt to set lineWidth to 65536");
9841
9842 // Check too high (line width of 65536.0f).
9843 rs_ci.lineWidth = 65536.0f;
9844
9845 err =
9846 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9847 ASSERT_VK_SUCCESS(err);
9848 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9849 &gp_ci, NULL, &pipeline);
9850
9851 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009852 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009853
9854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009855 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009856
9857 dyn_state_ci.dynamicStateCount = 3;
9858
9859 rs_ci.lineWidth = 1.0f;
9860
9861 err =
9862 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9863 ASSERT_VK_SUCCESS(err);
9864 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9865 &gp_ci, NULL, &pipeline);
9866 BeginCommandBuffer();
9867 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9868 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
9869
9870 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06009871 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06009872 m_errorMonitor->VerifyFound();
9873
9874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9875 "Attempt to set lineWidth to 65536");
9876
9877 // Check too high with dynamic setting.
9878 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
9879 m_errorMonitor->VerifyFound();
9880 EndCommandBuffer();
9881
9882 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9883 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9884 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9885 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009886 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009887}
9888
Karl Schultz6addd812016-02-02 17:17:23 -07009889TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009890 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009891 m_errorMonitor->SetDesiredFailureMsg(
9892 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009893 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009894
9895 ASSERT_NO_FATAL_FAILURE(InitState());
9896 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009897
Tony Barbourfe3351b2015-07-28 10:17:20 -06009898 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009899 // Don't care about RenderPass handle b/c error should be flagged before
9900 // that
9901 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
9902 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009903
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009904 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009905}
9906
Karl Schultz6addd812016-02-02 17:17:23 -07009907TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009908 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009909 m_errorMonitor->SetDesiredFailureMsg(
9910 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009911 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009912
9913 ASSERT_NO_FATAL_FAILURE(InitState());
9914 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009915
Tony Barbourfe3351b2015-07-28 10:17:20 -06009916 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009917 // Just create a dummy Renderpass that's non-NULL so we can get to the
9918 // proper error
Chris Forbes38ae7c42016-06-21 20:51:44 +12009919 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
Karl Schultz6addd812016-02-02 17:17:23 -07009920 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009921
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009922 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009923}
9924
Chris Forbes2eeabe32016-06-21 20:52:34 +12009925TEST_F(VkLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
9926 m_errorMonitor->ExpectSuccess();
9927
9928 ASSERT_NO_FATAL_FAILURE(InitState());
9929 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9930
9931 BeginCommandBuffer(); // framework implicitly begins the renderpass.
9932 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // end implicit.
9933
9934 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9935 VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9936 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9937 m_errorMonitor->VerifyNotFound();
9938 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9939 VK_SUBPASS_CONTENTS_INLINE);
9940 m_errorMonitor->VerifyNotFound();
9941 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9942 m_errorMonitor->VerifyNotFound();
9943
9944 m_commandBuffer->EndCommandBuffer();
9945 m_errorMonitor->VerifyNotFound();
9946}
9947
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009948TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
9949 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
9950 "the number of renderPass attachments that use loadOp"
9951 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
9952
9953 ASSERT_NO_FATAL_FAILURE(InitState());
9954 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9955
9956 // Create a renderPass with a single attachment that uses loadOp CLEAR
9957 VkAttachmentReference attach = {};
9958 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9959 VkSubpassDescription subpass = {};
9960 subpass.inputAttachmentCount = 1;
9961 subpass.pInputAttachments = &attach;
9962 VkRenderPassCreateInfo rpci = {};
9963 rpci.subpassCount = 1;
9964 rpci.pSubpasses = &subpass;
9965 rpci.attachmentCount = 1;
9966 VkAttachmentDescription attach_desc = {};
9967 attach_desc.format = VK_FORMAT_UNDEFINED;
9968 // Set loadOp to CLEAR
9969 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9970 rpci.pAttachments = &attach_desc;
9971 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9972 VkRenderPass rp;
9973 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9974
9975 VkCommandBufferInheritanceInfo hinfo = {};
9976 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9977 hinfo.renderPass = VK_NULL_HANDLE;
9978 hinfo.subpass = 0;
9979 hinfo.framebuffer = VK_NULL_HANDLE;
9980 hinfo.occlusionQueryEnable = VK_FALSE;
9981 hinfo.queryFlags = 0;
9982 hinfo.pipelineStatistics = 0;
9983 VkCommandBufferBeginInfo info = {};
9984 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9985 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9986 info.pInheritanceInfo = &hinfo;
9987
9988 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9989 VkRenderPassBeginInfo rp_begin = {};
9990 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9991 rp_begin.pNext = NULL;
9992 rp_begin.renderPass = renderPass();
9993 rp_begin.framebuffer = framebuffer();
9994 rp_begin.clearValueCount = 0; // Should be 1
9995
9996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7f0416c2016-07-15 16:01:13 -06009997 " has a clearValueCount of 0 but "
9998 "there must be at least 1 entries in "
9999 "pClearValues array to account for ");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -060010000
10001 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
10002 VK_SUBPASS_CONTENTS_INLINE);
10003
10004 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -060010005
10006 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -060010007}
10008
Cody Northrop3bb4d962016-05-09 16:15:57 -060010009TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
10010
10011 TEST_DESCRIPTION("End a command buffer with an active render pass");
10012
10013 m_errorMonitor->SetDesiredFailureMsg(
10014 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10015 "It is invalid to issue this call inside an active render pass");
10016
10017 ASSERT_NO_FATAL_FAILURE(InitState());
10018 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10019
10020 // The framework's BeginCommandBuffer calls CreateRenderPass
10021 BeginCommandBuffer();
10022
10023 // Call directly into vkEndCommandBuffer instead of the
10024 // the framework's EndCommandBuffer, which inserts a
10025 // vkEndRenderPass
10026 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
10027
10028 m_errorMonitor->VerifyFound();
10029
10030 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
10031 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
10032}
10033
Karl Schultz6addd812016-02-02 17:17:23 -070010034TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010035 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -070010036 m_errorMonitor->SetDesiredFailureMsg(
10037 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010038 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010039
10040 ASSERT_NO_FATAL_FAILURE(InitState());
10041 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010042
10043 // Renderpass is started here
10044 BeginCommandBuffer();
10045
10046 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010047 vk_testing::Buffer dstBuffer;
10048 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010049
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010050 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010051
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010052 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010053}
10054
Karl Schultz6addd812016-02-02 17:17:23 -070010055TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010056 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -070010057 m_errorMonitor->SetDesiredFailureMsg(
10058 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010059 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010060
10061 ASSERT_NO_FATAL_FAILURE(InitState());
10062 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010063
10064 // Renderpass is started here
10065 BeginCommandBuffer();
10066
10067 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010068 vk_testing::Buffer dstBuffer;
10069 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010070
Karl Schultz6addd812016-02-02 17:17:23 -070010071 VkDeviceSize dstOffset = 0;
10072 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -060010073 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010074
Karl Schultz6addd812016-02-02 17:17:23 -070010075 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
10076 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010077
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010078 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010079}
10080
Karl Schultz6addd812016-02-02 17:17:23 -070010081TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010082 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010083 m_errorMonitor->SetDesiredFailureMsg(
10084 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010085 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010086
10087 ASSERT_NO_FATAL_FAILURE(InitState());
10088 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010089
10090 // Renderpass is started here
10091 BeginCommandBuffer();
10092
Michael Lentine0a369f62016-02-03 16:51:46 -060010093 VkClearColorValue clear_color;
10094 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -070010095 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
10096 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
10097 const int32_t tex_width = 32;
10098 const int32_t tex_height = 32;
10099 VkImageCreateInfo image_create_info = {};
10100 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10101 image_create_info.pNext = NULL;
10102 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10103 image_create_info.format = tex_format;
10104 image_create_info.extent.width = tex_width;
10105 image_create_info.extent.height = tex_height;
10106 image_create_info.extent.depth = 1;
10107 image_create_info.mipLevels = 1;
10108 image_create_info.arrayLayers = 1;
10109 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10110 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
10111 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010112
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010113 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -070010114 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
10115 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010116
Karl Schultz6addd812016-02-02 17:17:23 -070010117 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
10118 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010119
Karl Schultz6addd812016-02-02 17:17:23 -070010120 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
10121 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010122
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010123 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010124}
10125
Karl Schultz6addd812016-02-02 17:17:23 -070010126TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010127 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010128 m_errorMonitor->SetDesiredFailureMsg(
10129 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010130 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010131
10132 ASSERT_NO_FATAL_FAILURE(InitState());
10133 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010134
10135 // Renderpass is started here
10136 BeginCommandBuffer();
10137
10138 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -070010139 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010140 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
10141 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10142 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
10143 image_create_info.extent.width = 64;
10144 image_create_info.extent.height = 64;
10145 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10146 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010147
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010148 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -070010149 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
10150 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010151
Karl Schultz6addd812016-02-02 17:17:23 -070010152 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
10153 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010154
Karl Schultz6addd812016-02-02 17:17:23 -070010155 vkCmdClearDepthStencilImage(
10156 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
10157 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
10158 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010159
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010160 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010161}
10162
Karl Schultz6addd812016-02-02 17:17:23 -070010163TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010164 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010165 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010166
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -060010168 "vkCmdClearAttachments(): This call "
Karl Schultz6addd812016-02-02 17:17:23 -070010169 "must be issued inside an active "
10170 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010171
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010172 ASSERT_NO_FATAL_FAILURE(InitState());
10173 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010174
10175 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010176 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010177 ASSERT_VK_SUCCESS(err);
10178
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010179 VkClearAttachment color_attachment;
10180 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10181 color_attachment.clearValue.color.float32[0] = 0;
10182 color_attachment.clearValue.color.float32[1] = 0;
10183 color_attachment.clearValue.color.float32[2] = 0;
10184 color_attachment.clearValue.color.float32[3] = 0;
10185 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010186 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
10187 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
10188 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010189
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010190 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010191}
10192
Karl Schultz9e66a292016-04-21 15:57:51 -060010193TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
10194 // Try to add a buffer memory barrier with no buffer.
10195 m_errorMonitor->SetDesiredFailureMsg(
10196 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10197 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
10198
10199 ASSERT_NO_FATAL_FAILURE(InitState());
10200 BeginCommandBuffer();
10201
10202 VkBufferMemoryBarrier buf_barrier = {};
10203 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
10204 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10205 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10206 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10207 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10208 buf_barrier.buffer = VK_NULL_HANDLE;
10209 buf_barrier.offset = 0;
10210 buf_barrier.size = VK_WHOLE_SIZE;
10211 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10212 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
10213 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
10214
10215 m_errorMonitor->VerifyFound();
10216}
10217
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010218TEST_F(VkLayerTest, InvalidBarriers) {
10219 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
10220
10221 m_errorMonitor->SetDesiredFailureMsg(
10222 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
10223
10224 ASSERT_NO_FATAL_FAILURE(InitState());
10225 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10226
10227 VkMemoryBarrier mem_barrier = {};
10228 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
10229 mem_barrier.pNext = NULL;
10230 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10231 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10232 BeginCommandBuffer();
10233 // BeginCommandBuffer() starts a render pass
10234 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10235 VK_PIPELINE_STAGE_HOST_BIT,
10236 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
10237 &mem_barrier, 0, nullptr, 0, nullptr);
10238 m_errorMonitor->VerifyFound();
10239
10240 m_errorMonitor->SetDesiredFailureMsg(
10241 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10242 "Image Layout cannot be transitioned to UNDEFINED");
10243 VkImageObj image(m_device);
10244 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
10245 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10246 ASSERT_TRUE(image.initialized());
10247 VkImageMemoryBarrier img_barrier = {};
10248 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10249 img_barrier.pNext = NULL;
10250 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10251 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10252 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10253 // New layout can't be UNDEFINED
10254 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
10255 img_barrier.image = image.handle();
10256 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10257 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10258 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10259 img_barrier.subresourceRange.baseArrayLayer = 0;
10260 img_barrier.subresourceRange.baseMipLevel = 0;
10261 img_barrier.subresourceRange.layerCount = 1;
10262 img_barrier.subresourceRange.levelCount = 1;
10263 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10264 VK_PIPELINE_STAGE_HOST_BIT,
10265 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10266 nullptr, 1, &img_barrier);
10267 m_errorMonitor->VerifyFound();
10268 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10269
10270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10271 "Subresource must have the sum of the "
10272 "baseArrayLayer");
10273 // baseArrayLayer + layerCount must be <= image's arrayLayers
10274 img_barrier.subresourceRange.baseArrayLayer = 1;
10275 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10276 VK_PIPELINE_STAGE_HOST_BIT,
10277 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10278 nullptr, 1, &img_barrier);
10279 m_errorMonitor->VerifyFound();
10280 img_barrier.subresourceRange.baseArrayLayer = 0;
10281
10282 m_errorMonitor->SetDesiredFailureMsg(
10283 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10284 "Subresource must have the sum of the baseMipLevel");
10285 // baseMipLevel + levelCount must be <= image's mipLevels
10286 img_barrier.subresourceRange.baseMipLevel = 1;
10287 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10288 VK_PIPELINE_STAGE_HOST_BIT,
10289 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10290 nullptr, 1, &img_barrier);
10291 m_errorMonitor->VerifyFound();
10292 img_barrier.subresourceRange.baseMipLevel = 0;
10293
10294 m_errorMonitor->SetDesiredFailureMsg(
10295 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10296 "Buffer Barriers cannot be used during a render pass");
10297 vk_testing::Buffer buffer;
10298 buffer.init(*m_device, 256);
10299 VkBufferMemoryBarrier buf_barrier = {};
10300 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
10301 buf_barrier.pNext = NULL;
10302 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10303 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10304 buf_barrier.buffer = buffer.handle();
10305 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10306 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10307 buf_barrier.offset = 0;
10308 buf_barrier.size = VK_WHOLE_SIZE;
10309 // Can't send buffer barrier during a render pass
10310 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10311 VK_PIPELINE_STAGE_HOST_BIT,
10312 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10313 &buf_barrier, 0, nullptr);
10314 m_errorMonitor->VerifyFound();
10315 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
10316
10317 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10318 "which is not less than total size");
10319 buf_barrier.offset = 257;
10320 // Offset greater than total size
10321 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10322 VK_PIPELINE_STAGE_HOST_BIT,
10323 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10324 &buf_barrier, 0, nullptr);
10325 m_errorMonitor->VerifyFound();
10326 buf_barrier.offset = 0;
10327
10328 m_errorMonitor->SetDesiredFailureMsg(
10329 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
10330 buf_barrier.size = 257;
10331 // Size greater than total size
10332 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10333 VK_PIPELINE_STAGE_HOST_BIT,
10334 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10335 &buf_barrier, 0, nullptr);
10336 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010337
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010338 // Now exercise barrier aspect bit errors, first DS
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010339 m_errorMonitor->SetDesiredFailureMsg(
10340 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10341 "Image is a depth and stencil format and thus must "
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010342 "have either one or both of VK_IMAGE_ASPECT_DEPTH_BIT and "
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010343 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
10344 VkDepthStencilObj ds_image(m_device);
10345 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
10346 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010347 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10348 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010349 img_barrier.image = ds_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010350 // Use of COLOR aspect on DS image is error
10351 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010352 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10353 VK_PIPELINE_STAGE_HOST_BIT,
10354 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10355 nullptr, 1, &img_barrier);
10356 m_errorMonitor->VerifyFound();
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010357 // Now test depth-only
10358 VkFormatProperties format_props;
10359
10360 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(),
10361 VK_FORMAT_D16_UNORM, &format_props);
10362 if (format_props.optimalTilingFeatures &
10363 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
10364 m_errorMonitor->SetDesiredFailureMsg(
10365 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10366 "Image is a depth-only format and thus must "
10367 "have VK_IMAGE_ASPECT_DEPTH_BIT set.");
10368 VkDepthStencilObj d_image(m_device);
10369 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
10370 ASSERT_TRUE(d_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010371 img_barrier.oldLayout =
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010372 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -060010373 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010374 img_barrier.image = d_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010375 // Use of COLOR aspect on depth image is error
10376 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010377 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10378 VK_PIPELINE_STAGE_HOST_BIT,
10379 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
10380 0, nullptr, 1, &img_barrier);
10381 m_errorMonitor->VerifyFound();
10382 }
10383 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(),
10384 VK_FORMAT_S8_UINT, &format_props);
10385 if (format_props.optimalTilingFeatures &
10386 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
10387 // Now test stencil-only
10388 m_errorMonitor->SetDesiredFailureMsg(
10389 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10390 "Image is a stencil-only format and thus must "
10391 "have VK_IMAGE_ASPECT_STENCIL_BIT set.");
10392 VkDepthStencilObj s_image(m_device);
10393 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
10394 ASSERT_TRUE(s_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010395 img_barrier.oldLayout =
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010396 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -060010397 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010398 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010399 // Use of COLOR aspect on depth image is error
10400 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010401 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10402 VK_PIPELINE_STAGE_HOST_BIT,
10403 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
10404 0, nullptr, 1, &img_barrier);
10405 m_errorMonitor->VerifyFound();
10406 }
10407 // Finally test color
10408 m_errorMonitor->SetDesiredFailureMsg(
10409 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image is a color format and thus must "
10410 "have VK_IMAGE_ASPECT_COLOR_BIT set.");
10411 VkImageObj c_image(m_device);
10412 c_image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
10413 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10414 0);
10415 ASSERT_TRUE(c_image.initialized());
10416 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10417 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
10418 img_barrier.image = c_image.handle();
10419 // Set aspect to depth (non-color)
10420 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
10421 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10422 VK_PIPELINE_STAGE_HOST_BIT,
10423 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10424 nullptr, 1, &img_barrier);
10425 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010426}
10427
Karl Schultz6addd812016-02-02 17:17:23 -070010428TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010429 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010430 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010431
Karl Schultz6addd812016-02-02 17:17:23 -070010432 m_errorMonitor->SetDesiredFailureMsg(
10433 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010434 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
10435
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010436 ASSERT_NO_FATAL_FAILURE(InitState());
10437 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010438 uint32_t qfi = 0;
10439 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010440 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10441 buffCI.size = 1024;
10442 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10443 buffCI.queueFamilyIndexCount = 1;
10444 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010445
10446 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010447 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010448 ASSERT_VK_SUCCESS(err);
10449
10450 BeginCommandBuffer();
10451 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -070010452 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10453 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010454 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -070010455 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
10456 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010457
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010458 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010459
Chia-I Wuf7458c52015-10-26 21:10:41 +080010460 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010461}
10462
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010463TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
10464 // Create an out-of-range queueFamilyIndex
10465 m_errorMonitor->SetDesiredFailureMsg(
10466 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -060010467 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
10468 "of the indices specified when the device was created, via the "
10469 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010470
10471 ASSERT_NO_FATAL_FAILURE(InitState());
10472 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10473 VkBufferCreateInfo buffCI = {};
10474 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10475 buffCI.size = 1024;
10476 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10477 buffCI.queueFamilyIndexCount = 1;
10478 // Introduce failure by specifying invalid queue_family_index
10479 uint32_t qfi = 777;
10480 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -060010481 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010482
10483 VkBuffer ib;
10484 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
10485
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010486 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060010487 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010488}
10489
Karl Schultz6addd812016-02-02 17:17:23 -070010490TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010491 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands w/ a primary cmd buffer"
10492 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010493
Karl Schultz6addd812016-02-02 17:17:23 -070010494 m_errorMonitor->SetDesiredFailureMsg(
10495 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010496 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010497
10498 ASSERT_NO_FATAL_FAILURE(InitState());
10499 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010500
10501 BeginCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010502
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010503 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
10504 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010505
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010506 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010507}
10508
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010509TEST_F(VkLayerTest, DSUsageBitsErrors) {
10510 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
10511 "that do not have correct usage bits sets.");
10512 VkResult err;
10513
10514 ASSERT_NO_FATAL_FAILURE(InitState());
10515 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10516 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10517 ds_type_count[i].type = VkDescriptorType(i);
10518 ds_type_count[i].descriptorCount = 1;
10519 }
10520 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10521 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10522 ds_pool_ci.pNext = NULL;
10523 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10524 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10525 ds_pool_ci.pPoolSizes = ds_type_count;
10526
10527 VkDescriptorPool ds_pool;
10528 err =
10529 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10530 ASSERT_VK_SUCCESS(err);
10531
10532 // Create 10 layouts where each has a single descriptor of different type
10533 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] =
10534 {};
10535 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10536 dsl_binding[i].binding = 0;
10537 dsl_binding[i].descriptorType = VkDescriptorType(i);
10538 dsl_binding[i].descriptorCount = 1;
10539 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
10540 dsl_binding[i].pImmutableSamplers = NULL;
10541 }
10542
10543 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10544 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10545 ds_layout_ci.pNext = NULL;
10546 ds_layout_ci.bindingCount = 1;
10547 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
10548 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10549 ds_layout_ci.pBindings = dsl_binding + i;
10550 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
10551 NULL, ds_layouts + i);
10552 ASSERT_VK_SUCCESS(err);
10553 }
10554 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10555 VkDescriptorSetAllocateInfo alloc_info = {};
10556 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10557 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10558 alloc_info.descriptorPool = ds_pool;
10559 alloc_info.pSetLayouts = ds_layouts;
10560 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10561 descriptor_sets);
10562 ASSERT_VK_SUCCESS(err);
10563
10564 // Create a buffer & bufferView to be used for invalid updates
10565 VkBufferCreateInfo buff_ci = {};
10566 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10567 // This usage is not valid for any descriptor type
10568 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
10569 buff_ci.size = 256;
10570 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10571 VkBuffer buffer;
10572 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10573 ASSERT_VK_SUCCESS(err);
10574
10575 VkBufferViewCreateInfo buff_view_ci = {};
10576 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
10577 buff_view_ci.buffer = buffer;
10578 buff_view_ci.format = VK_FORMAT_R8_UNORM;
10579 buff_view_ci.range = VK_WHOLE_SIZE;
10580 VkBufferView buff_view;
10581 err =
10582 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
10583 ASSERT_VK_SUCCESS(err);
10584
10585 // Create an image to be used for invalid updates
10586 VkImageCreateInfo image_ci = {};
10587 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10588 image_ci.imageType = VK_IMAGE_TYPE_2D;
10589 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
10590 image_ci.extent.width = 64;
10591 image_ci.extent.height = 64;
10592 image_ci.extent.depth = 1;
10593 image_ci.mipLevels = 1;
10594 image_ci.arrayLayers = 1;
10595 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
10596 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10597 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10598 // This usage is not valid for any descriptor type
10599 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10600 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10601 VkImage image;
10602 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10603 ASSERT_VK_SUCCESS(err);
10604 // Bind memory to image
10605 VkMemoryRequirements mem_reqs;
10606 VkDeviceMemory image_mem;
10607 bool pass;
10608 VkMemoryAllocateInfo mem_alloc = {};
10609 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10610 mem_alloc.pNext = NULL;
10611 mem_alloc.allocationSize = 0;
10612 mem_alloc.memoryTypeIndex = 0;
10613 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10614 mem_alloc.allocationSize = mem_reqs.size;
10615 pass =
10616 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10617 ASSERT_TRUE(pass);
10618 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10619 ASSERT_VK_SUCCESS(err);
10620 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10621 ASSERT_VK_SUCCESS(err);
10622 // Now create view for image
10623 VkImageViewCreateInfo image_view_ci = {};
10624 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10625 image_view_ci.image = image;
10626 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
10627 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10628 image_view_ci.subresourceRange.layerCount = 1;
10629 image_view_ci.subresourceRange.baseArrayLayer = 0;
10630 image_view_ci.subresourceRange.levelCount = 1;
10631 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10632 VkImageView image_view;
10633 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10634 &image_view);
10635 ASSERT_VK_SUCCESS(err);
10636
10637 VkDescriptorBufferInfo buff_info = {};
10638 buff_info.buffer = buffer;
10639 VkDescriptorImageInfo img_info = {};
10640 img_info.imageView = image_view;
10641 VkWriteDescriptorSet descriptor_write = {};
10642 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10643 descriptor_write.dstBinding = 0;
10644 descriptor_write.descriptorCount = 1;
10645 descriptor_write.pTexelBufferView = &buff_view;
10646 descriptor_write.pBufferInfo = &buff_info;
10647 descriptor_write.pImageInfo = &img_info;
10648
10649 // These error messages align with VkDescriptorType struct
10650 const char *error_msgs[] = {
10651 "", // placeholder, no error for SAMPLER descriptor
10652 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
10653 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
10654 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
10655 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
10656 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
10657 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
10658 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
10659 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
10660 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
10661 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
10662 // Start loop at 1 as SAMPLER desc type has no usage bit error
10663 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10664 descriptor_write.descriptorType = VkDescriptorType(i);
10665 descriptor_write.dstSet = descriptor_sets[i];
10666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10667 error_msgs[i]);
10668
10669 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
10670 NULL);
10671
10672 m_errorMonitor->VerifyFound();
10673 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
10674 }
10675 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
10676 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010677 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010678 vkDestroyImageView(m_device->device(), image_view, NULL);
10679 vkDestroyBuffer(m_device->device(), buffer, NULL);
10680 vkDestroyBufferView(m_device->device(), buff_view, NULL);
10681 vkFreeDescriptorSets(m_device->device(), ds_pool,
10682 VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
10683 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10684}
10685
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010686TEST_F(VkLayerTest, DSBufferInfoErrors) {
10687 TEST_DESCRIPTION(
10688 "Attempt to update buffer descriptor set that has incorrect "
10689 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
10690 "1. offset value greater than buffer size\n"
10691 "2. range value of 0\n"
10692 "3. range value greater than buffer (size - offset)");
10693 VkResult err;
10694
10695 ASSERT_NO_FATAL_FAILURE(InitState());
10696 VkDescriptorPoolSize ds_type_count = {};
10697 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10698 ds_type_count.descriptorCount = 1;
10699
10700 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10701 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10702 ds_pool_ci.pNext = NULL;
10703 ds_pool_ci.maxSets = 1;
10704 ds_pool_ci.poolSizeCount = 1;
10705 ds_pool_ci.pPoolSizes = &ds_type_count;
10706
10707 VkDescriptorPool ds_pool;
10708 err =
10709 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10710 ASSERT_VK_SUCCESS(err);
10711
10712 // Create layout with single uniform buffer descriptor
10713 VkDescriptorSetLayoutBinding dsl_binding = {};
10714 dsl_binding.binding = 0;
10715 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10716 dsl_binding.descriptorCount = 1;
10717 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10718 dsl_binding.pImmutableSamplers = NULL;
10719
10720 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10721 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10722 ds_layout_ci.pNext = NULL;
10723 ds_layout_ci.bindingCount = 1;
10724 ds_layout_ci.pBindings = &dsl_binding;
10725 VkDescriptorSetLayout ds_layout;
10726 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10727 &ds_layout);
10728 ASSERT_VK_SUCCESS(err);
10729
10730 VkDescriptorSet descriptor_set = {};
10731 VkDescriptorSetAllocateInfo alloc_info = {};
10732 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10733 alloc_info.descriptorSetCount = 1;
10734 alloc_info.descriptorPool = ds_pool;
10735 alloc_info.pSetLayouts = &ds_layout;
10736 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10737 &descriptor_set);
10738 ASSERT_VK_SUCCESS(err);
10739
10740 // Create a buffer to be used for invalid updates
10741 VkBufferCreateInfo buff_ci = {};
10742 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10743 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10744 buff_ci.size = 256;
10745 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10746 VkBuffer buffer;
10747 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10748 ASSERT_VK_SUCCESS(err);
10749 // Have to bind memory to buffer before descriptor update
10750 VkMemoryAllocateInfo mem_alloc = {};
10751 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10752 mem_alloc.pNext = NULL;
10753 mem_alloc.allocationSize = 256;
10754 mem_alloc.memoryTypeIndex = 0;
10755
10756 VkMemoryRequirements mem_reqs;
10757 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
10758 bool pass =
10759 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10760 if (!pass) {
10761 vkDestroyBuffer(m_device->device(), buffer, NULL);
10762 return;
10763 }
10764
10765 VkDeviceMemory mem;
10766 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
10767 ASSERT_VK_SUCCESS(err);
10768 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10769 ASSERT_VK_SUCCESS(err);
10770
10771 VkDescriptorBufferInfo buff_info = {};
10772 buff_info.buffer = buffer;
10773 // First make offset 1 larger than buffer size
10774 buff_info.offset = 257;
10775 buff_info.range = VK_WHOLE_SIZE;
10776 VkWriteDescriptorSet descriptor_write = {};
10777 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10778 descriptor_write.dstBinding = 0;
10779 descriptor_write.descriptorCount = 1;
10780 descriptor_write.pTexelBufferView = nullptr;
10781 descriptor_write.pBufferInfo = &buff_info;
10782 descriptor_write.pImageInfo = nullptr;
10783
10784 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10785 descriptor_write.dstSet = descriptor_set;
10786 m_errorMonitor->SetDesiredFailureMsg(
10787 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10788 " offset of 257 is greater than buffer ");
10789
10790 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10791
10792 m_errorMonitor->VerifyFound();
10793 // Now cause error due to range of 0
10794 buff_info.offset = 0;
10795 buff_info.range = 0;
10796 m_errorMonitor->SetDesiredFailureMsg(
10797 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10798 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
10799
10800 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10801
10802 m_errorMonitor->VerifyFound();
10803 // Now cause error due to range exceeding buffer size - offset
10804 buff_info.offset = 128;
10805 buff_info.range = 200;
10806 m_errorMonitor->SetDesiredFailureMsg(
10807 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10808 " range is 200 which is greater than buffer size ");
10809
10810 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10811
10812 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010813 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010814 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10815 vkDestroyBuffer(m_device->device(), buffer, NULL);
10816 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10817 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10818}
10819
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010820TEST_F(VkLayerTest, DSAspectBitsErrors) {
10821 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10822 // are set, but could expand this test to hit more cases.
10823 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
10824 "that do not have correct aspect bits sets.");
10825 VkResult err;
10826
10827 ASSERT_NO_FATAL_FAILURE(InitState());
10828 VkDescriptorPoolSize ds_type_count = {};
10829 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10830 ds_type_count.descriptorCount = 1;
10831
10832 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10833 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10834 ds_pool_ci.pNext = NULL;
10835 ds_pool_ci.maxSets = 5;
10836 ds_pool_ci.poolSizeCount = 1;
10837 ds_pool_ci.pPoolSizes = &ds_type_count;
10838
10839 VkDescriptorPool ds_pool;
10840 err =
10841 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10842 ASSERT_VK_SUCCESS(err);
10843
10844 VkDescriptorSetLayoutBinding dsl_binding = {};
10845 dsl_binding.binding = 0;
10846 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10847 dsl_binding.descriptorCount = 1;
10848 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10849 dsl_binding.pImmutableSamplers = NULL;
10850
10851 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10852 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10853 ds_layout_ci.pNext = NULL;
10854 ds_layout_ci.bindingCount = 1;
10855 ds_layout_ci.pBindings = &dsl_binding;
10856 VkDescriptorSetLayout ds_layout;
10857 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10858 &ds_layout);
10859 ASSERT_VK_SUCCESS(err);
10860
10861 VkDescriptorSet descriptor_set = {};
10862 VkDescriptorSetAllocateInfo alloc_info = {};
10863 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10864 alloc_info.descriptorSetCount = 1;
10865 alloc_info.descriptorPool = ds_pool;
10866 alloc_info.pSetLayouts = &ds_layout;
10867 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10868 &descriptor_set);
10869 ASSERT_VK_SUCCESS(err);
10870
10871 // Create an image to be used for invalid updates
10872 VkImageCreateInfo image_ci = {};
10873 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10874 image_ci.imageType = VK_IMAGE_TYPE_2D;
10875 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10876 image_ci.extent.width = 64;
10877 image_ci.extent.height = 64;
10878 image_ci.extent.depth = 1;
10879 image_ci.mipLevels = 1;
10880 image_ci.arrayLayers = 1;
10881 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
10882 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10883 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10884 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10885 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10886 VkImage image;
10887 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10888 ASSERT_VK_SUCCESS(err);
10889 // Bind memory to image
10890 VkMemoryRequirements mem_reqs;
10891 VkDeviceMemory image_mem;
10892 bool pass;
10893 VkMemoryAllocateInfo mem_alloc = {};
10894 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10895 mem_alloc.pNext = NULL;
10896 mem_alloc.allocationSize = 0;
10897 mem_alloc.memoryTypeIndex = 0;
10898 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10899 mem_alloc.allocationSize = mem_reqs.size;
10900 pass =
10901 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10902 ASSERT_TRUE(pass);
10903 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10904 ASSERT_VK_SUCCESS(err);
10905 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10906 ASSERT_VK_SUCCESS(err);
10907 // Now create view for image
10908 VkImageViewCreateInfo image_view_ci = {};
10909 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10910 image_view_ci.image = image;
10911 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10912 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10913 image_view_ci.subresourceRange.layerCount = 1;
10914 image_view_ci.subresourceRange.baseArrayLayer = 0;
10915 image_view_ci.subresourceRange.levelCount = 1;
10916 // Setting both depth & stencil aspect bits is illegal for descriptor
10917 image_view_ci.subresourceRange.aspectMask =
10918 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
10919
10920 VkImageView image_view;
10921 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10922 &image_view);
10923 ASSERT_VK_SUCCESS(err);
10924
10925 VkDescriptorImageInfo img_info = {};
10926 img_info.imageView = image_view;
10927 VkWriteDescriptorSet descriptor_write = {};
10928 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10929 descriptor_write.dstBinding = 0;
10930 descriptor_write.descriptorCount = 1;
10931 descriptor_write.pTexelBufferView = NULL;
10932 descriptor_write.pBufferInfo = NULL;
10933 descriptor_write.pImageInfo = &img_info;
10934 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10935 descriptor_write.dstSet = descriptor_set;
10936 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10937 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
10938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10939 error_msg);
10940
10941 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10942
10943 m_errorMonitor->VerifyFound();
10944 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10945 vkDestroyImage(m_device->device(), image, NULL);
10946 vkFreeMemory(m_device->device(), image_mem, NULL);
10947 vkDestroyImageView(m_device->device(), image_view, NULL);
10948 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10949 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10950}
10951
Karl Schultz6addd812016-02-02 17:17:23 -070010952TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010953 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010954 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010955
Karl Schultz6addd812016-02-02 17:17:23 -070010956 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010957 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10958 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10959 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010960
Tobin Ehlis3b780662015-05-28 12:11:26 -060010961 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010962 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010963 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010964 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10965 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010966
10967 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010968 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10969 ds_pool_ci.pNext = NULL;
10970 ds_pool_ci.maxSets = 1;
10971 ds_pool_ci.poolSizeCount = 1;
10972 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010973
Tobin Ehlis3b780662015-05-28 12:11:26 -060010974 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010975 err =
10976 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010977 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010978 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010979 dsl_binding.binding = 0;
10980 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10981 dsl_binding.descriptorCount = 1;
10982 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10983 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010984
Tony Barboureb254902015-07-15 12:50:33 -060010985 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010986 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10987 ds_layout_ci.pNext = NULL;
10988 ds_layout_ci.bindingCount = 1;
10989 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010990
Tobin Ehlis3b780662015-05-28 12:11:26 -060010991 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010992 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10993 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010994 ASSERT_VK_SUCCESS(err);
10995
10996 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010997 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010998 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010999 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011000 alloc_info.descriptorPool = ds_pool;
11001 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011002 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11003 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011004 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011005
Tobin Ehlis30db8f82016-05-05 08:19:48 -060011006 VkSamplerCreateInfo sampler_ci = {};
11007 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11008 sampler_ci.pNext = NULL;
11009 sampler_ci.magFilter = VK_FILTER_NEAREST;
11010 sampler_ci.minFilter = VK_FILTER_NEAREST;
11011 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11012 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11013 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11014 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11015 sampler_ci.mipLodBias = 1.0;
11016 sampler_ci.anisotropyEnable = VK_FALSE;
11017 sampler_ci.maxAnisotropy = 1;
11018 sampler_ci.compareEnable = VK_FALSE;
11019 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11020 sampler_ci.minLod = 1.0;
11021 sampler_ci.maxLod = 1.0;
11022 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11023 sampler_ci.unnormalizedCoordinates = VK_FALSE;
11024 VkSampler sampler;
11025 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11026 ASSERT_VK_SUCCESS(err);
11027
11028 VkDescriptorImageInfo info = {};
11029 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011030
11031 VkWriteDescriptorSet descriptor_write;
11032 memset(&descriptor_write, 0, sizeof(descriptor_write));
11033 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011034 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011035 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011036 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011037 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011038 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011039
11040 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11041
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011042 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011043
Chia-I Wuf7458c52015-10-26 21:10:41 +080011044 vkDestroySampler(m_device->device(), sampler, NULL);
11045 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11046 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011047}
11048
Karl Schultz6addd812016-02-02 17:17:23 -070011049TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011050 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070011051 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011052
Karl Schultz6addd812016-02-02 17:17:23 -070011053 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011054 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11055 " binding #0 with 1 total descriptors but update of 1 descriptors "
11056 "starting at binding offset of 0 combined with update array element "
11057 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011058
Tobin Ehlis3b780662015-05-28 12:11:26 -060011059 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011060 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011061 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011062 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11063 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011064
11065 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011066 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11067 ds_pool_ci.pNext = NULL;
11068 ds_pool_ci.maxSets = 1;
11069 ds_pool_ci.poolSizeCount = 1;
11070 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011071
Tobin Ehlis3b780662015-05-28 12:11:26 -060011072 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011073 err =
11074 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011075 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011076
Tony Barboureb254902015-07-15 12:50:33 -060011077 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011078 dsl_binding.binding = 0;
11079 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11080 dsl_binding.descriptorCount = 1;
11081 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11082 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060011083
11084 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011085 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11086 ds_layout_ci.pNext = NULL;
11087 ds_layout_ci.bindingCount = 1;
11088 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011089
Tobin Ehlis3b780662015-05-28 12:11:26 -060011090 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011091 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11092 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011093 ASSERT_VK_SUCCESS(err);
11094
11095 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011096 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011097 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011098 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011099 alloc_info.descriptorPool = ds_pool;
11100 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011101 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11102 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011103 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011104
Tobin Ehlis30db8f82016-05-05 08:19:48 -060011105 // Correctly update descriptor to avoid "NOT_UPDATED" error
11106 VkDescriptorBufferInfo buff_info = {};
11107 buff_info.buffer =
11108 VkBuffer(0); // Don't care about buffer handle for this test
11109 buff_info.offset = 0;
11110 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011111
11112 VkWriteDescriptorSet descriptor_write;
11113 memset(&descriptor_write, 0, sizeof(descriptor_write));
11114 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011115 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011116 descriptor_write.dstArrayElement =
11117 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080011118 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011119 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11120 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011121
11122 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11123
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011124 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011125
Chia-I Wuf7458c52015-10-26 21:10:41 +080011126 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11127 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011128}
11129
Karl Schultz6addd812016-02-02 17:17:23 -070011130TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
11131 // Create layout w/ count of 1 and attempt update to that layout w/ binding
11132 // index 2
11133 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011134
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011135 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11136 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011137
Tobin Ehlis3b780662015-05-28 12:11:26 -060011138 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011139 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011140 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011141 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11142 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011143
11144 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011145 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11146 ds_pool_ci.pNext = NULL;
11147 ds_pool_ci.maxSets = 1;
11148 ds_pool_ci.poolSizeCount = 1;
11149 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011150
Tobin Ehlis3b780662015-05-28 12:11:26 -060011151 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011152 err =
11153 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011154 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011155
Tony Barboureb254902015-07-15 12:50:33 -060011156 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011157 dsl_binding.binding = 0;
11158 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11159 dsl_binding.descriptorCount = 1;
11160 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11161 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060011162
11163 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011164 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11165 ds_layout_ci.pNext = NULL;
11166 ds_layout_ci.bindingCount = 1;
11167 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011168 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011169 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11170 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011171 ASSERT_VK_SUCCESS(err);
11172
11173 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011174 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011175 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011176 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011177 alloc_info.descriptorPool = ds_pool;
11178 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011179 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11180 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011181 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011182
Tony Barboureb254902015-07-15 12:50:33 -060011183 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011184 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11185 sampler_ci.pNext = NULL;
11186 sampler_ci.magFilter = VK_FILTER_NEAREST;
11187 sampler_ci.minFilter = VK_FILTER_NEAREST;
11188 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11189 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11190 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11191 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11192 sampler_ci.mipLodBias = 1.0;
11193 sampler_ci.anisotropyEnable = VK_FALSE;
11194 sampler_ci.maxAnisotropy = 1;
11195 sampler_ci.compareEnable = VK_FALSE;
11196 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11197 sampler_ci.minLod = 1.0;
11198 sampler_ci.maxLod = 1.0;
11199 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11200 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060011201
Tobin Ehlis3b780662015-05-28 12:11:26 -060011202 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011203 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011204 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011205
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011206 VkDescriptorImageInfo info = {};
11207 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011208
11209 VkWriteDescriptorSet descriptor_write;
11210 memset(&descriptor_write, 0, sizeof(descriptor_write));
11211 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011212 descriptor_write.dstSet = descriptorSet;
11213 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011214 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011215 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011216 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011217 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011218
11219 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11220
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011221 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011222
Chia-I Wuf7458c52015-10-26 21:10:41 +080011223 vkDestroySampler(m_device->device(), sampler, NULL);
11224 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11225 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011226}
11227
Karl Schultz6addd812016-02-02 17:17:23 -070011228TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
11229 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
11230 // types
11231 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011232
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis660bcdc2016-05-17 10:39:46 -060011234 ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011235
Tobin Ehlis3b780662015-05-28 12:11:26 -060011236 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011237
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011238 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011239 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11240 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011241
11242 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011243 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11244 ds_pool_ci.pNext = NULL;
11245 ds_pool_ci.maxSets = 1;
11246 ds_pool_ci.poolSizeCount = 1;
11247 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011248
Tobin Ehlis3b780662015-05-28 12:11:26 -060011249 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011250 err =
11251 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011252 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060011253 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011254 dsl_binding.binding = 0;
11255 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11256 dsl_binding.descriptorCount = 1;
11257 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11258 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011259
Tony Barboureb254902015-07-15 12:50:33 -060011260 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011261 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11262 ds_layout_ci.pNext = NULL;
11263 ds_layout_ci.bindingCount = 1;
11264 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011265
Tobin Ehlis3b780662015-05-28 12:11:26 -060011266 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011267 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11268 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011269 ASSERT_VK_SUCCESS(err);
11270
11271 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011272 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011273 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011274 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011275 alloc_info.descriptorPool = ds_pool;
11276 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011277 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11278 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011279 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011280
Tony Barboureb254902015-07-15 12:50:33 -060011281 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011282 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11283 sampler_ci.pNext = NULL;
11284 sampler_ci.magFilter = VK_FILTER_NEAREST;
11285 sampler_ci.minFilter = VK_FILTER_NEAREST;
11286 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11287 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11288 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11289 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11290 sampler_ci.mipLodBias = 1.0;
11291 sampler_ci.anisotropyEnable = VK_FALSE;
11292 sampler_ci.maxAnisotropy = 1;
11293 sampler_ci.compareEnable = VK_FALSE;
11294 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11295 sampler_ci.minLod = 1.0;
11296 sampler_ci.maxLod = 1.0;
11297 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11298 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011299 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011300 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011301 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011302
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011303 VkDescriptorImageInfo info = {};
11304 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011305
11306 VkWriteDescriptorSet descriptor_write;
11307 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -070011308 descriptor_write.sType =
11309 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011310 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011311 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011312 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011313 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011314 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011315
11316 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11317
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011318 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011319
Chia-I Wuf7458c52015-10-26 21:10:41 +080011320 vkDestroySampler(m_device->device(), sampler, NULL);
11321 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11322 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011323}
11324
Karl Schultz6addd812016-02-02 17:17:23 -070011325TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011326 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070011327 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011328
Karl Schultz6addd812016-02-02 17:17:23 -070011329 m_errorMonitor->SetDesiredFailureMsg(
11330 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011331 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011332
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011333 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011334 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
11335 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011336 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011337 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11338 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011339
11340 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011341 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11342 ds_pool_ci.pNext = NULL;
11343 ds_pool_ci.maxSets = 1;
11344 ds_pool_ci.poolSizeCount = 1;
11345 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011346
11347 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011348 err =
11349 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011350 ASSERT_VK_SUCCESS(err);
11351
11352 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011353 dsl_binding.binding = 0;
11354 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11355 dsl_binding.descriptorCount = 1;
11356 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11357 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011358
11359 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011360 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11361 ds_layout_ci.pNext = NULL;
11362 ds_layout_ci.bindingCount = 1;
11363 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011364 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011365 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11366 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011367 ASSERT_VK_SUCCESS(err);
11368
11369 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011370 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011371 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011372 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011373 alloc_info.descriptorPool = ds_pool;
11374 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011375 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11376 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011377 ASSERT_VK_SUCCESS(err);
11378
Karl Schultz6addd812016-02-02 17:17:23 -070011379 VkSampler sampler =
11380 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011381
11382 VkDescriptorImageInfo descriptor_info;
11383 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11384 descriptor_info.sampler = sampler;
11385
11386 VkWriteDescriptorSet descriptor_write;
11387 memset(&descriptor_write, 0, sizeof(descriptor_write));
11388 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011389 descriptor_write.dstSet = descriptorSet;
11390 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011391 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011392 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11393 descriptor_write.pImageInfo = &descriptor_info;
11394
11395 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11396
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011397 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011398
Chia-I Wuf7458c52015-10-26 21:10:41 +080011399 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11400 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011401}
11402
Karl Schultz6addd812016-02-02 17:17:23 -070011403TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
11404 // Create a single combined Image/Sampler descriptor and send it an invalid
11405 // imageView
11406 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011407
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11409 "Attempted write update to combined "
11410 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -060011411 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011412
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011413 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011414 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011415 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11416 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011417
11418 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011419 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11420 ds_pool_ci.pNext = NULL;
11421 ds_pool_ci.maxSets = 1;
11422 ds_pool_ci.poolSizeCount = 1;
11423 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011424
11425 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011426 err =
11427 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011428 ASSERT_VK_SUCCESS(err);
11429
11430 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011431 dsl_binding.binding = 0;
11432 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11433 dsl_binding.descriptorCount = 1;
11434 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11435 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011436
11437 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011438 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11439 ds_layout_ci.pNext = NULL;
11440 ds_layout_ci.bindingCount = 1;
11441 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011442 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011443 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11444 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011445 ASSERT_VK_SUCCESS(err);
11446
11447 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011448 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011449 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011450 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011451 alloc_info.descriptorPool = ds_pool;
11452 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011453 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11454 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011455 ASSERT_VK_SUCCESS(err);
11456
11457 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011458 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11459 sampler_ci.pNext = NULL;
11460 sampler_ci.magFilter = VK_FILTER_NEAREST;
11461 sampler_ci.minFilter = VK_FILTER_NEAREST;
11462 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11463 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11464 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11465 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11466 sampler_ci.mipLodBias = 1.0;
11467 sampler_ci.anisotropyEnable = VK_FALSE;
11468 sampler_ci.maxAnisotropy = 1;
11469 sampler_ci.compareEnable = VK_FALSE;
11470 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11471 sampler_ci.minLod = 1.0;
11472 sampler_ci.maxLod = 1.0;
11473 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11474 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011475
11476 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011477 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011478 ASSERT_VK_SUCCESS(err);
11479
Karl Schultz6addd812016-02-02 17:17:23 -070011480 VkImageView view =
11481 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011482
11483 VkDescriptorImageInfo descriptor_info;
11484 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11485 descriptor_info.sampler = sampler;
11486 descriptor_info.imageView = view;
11487
11488 VkWriteDescriptorSet descriptor_write;
11489 memset(&descriptor_write, 0, sizeof(descriptor_write));
11490 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011491 descriptor_write.dstSet = descriptorSet;
11492 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011493 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011494 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11495 descriptor_write.pImageInfo = &descriptor_info;
11496
11497 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11498
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011499 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011500
Chia-I Wuf7458c52015-10-26 21:10:41 +080011501 vkDestroySampler(m_device->device(), sampler, NULL);
11502 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11503 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011504}
11505
Karl Schultz6addd812016-02-02 17:17:23 -070011506TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
11507 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
11508 // into the other
11509 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011510
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011511 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11512 " binding #1 with type "
11513 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
11514 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011515
Tobin Ehlis04356f92015-10-27 16:35:27 -060011516 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011517 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011518 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011519 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11520 ds_type_count[0].descriptorCount = 1;
11521 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
11522 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011523
11524 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011525 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11526 ds_pool_ci.pNext = NULL;
11527 ds_pool_ci.maxSets = 1;
11528 ds_pool_ci.poolSizeCount = 2;
11529 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011530
11531 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011532 err =
11533 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011534 ASSERT_VK_SUCCESS(err);
11535 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011536 dsl_binding[0].binding = 0;
11537 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11538 dsl_binding[0].descriptorCount = 1;
11539 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
11540 dsl_binding[0].pImmutableSamplers = NULL;
11541 dsl_binding[1].binding = 1;
11542 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11543 dsl_binding[1].descriptorCount = 1;
11544 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
11545 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011546
11547 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011548 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11549 ds_layout_ci.pNext = NULL;
11550 ds_layout_ci.bindingCount = 2;
11551 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011552
11553 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011554 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11555 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011556 ASSERT_VK_SUCCESS(err);
11557
11558 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011559 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011560 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011561 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011562 alloc_info.descriptorPool = ds_pool;
11563 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011564 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11565 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011566 ASSERT_VK_SUCCESS(err);
11567
11568 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011569 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11570 sampler_ci.pNext = NULL;
11571 sampler_ci.magFilter = VK_FILTER_NEAREST;
11572 sampler_ci.minFilter = VK_FILTER_NEAREST;
11573 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11574 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11575 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11576 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11577 sampler_ci.mipLodBias = 1.0;
11578 sampler_ci.anisotropyEnable = VK_FALSE;
11579 sampler_ci.maxAnisotropy = 1;
11580 sampler_ci.compareEnable = VK_FALSE;
11581 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11582 sampler_ci.minLod = 1.0;
11583 sampler_ci.maxLod = 1.0;
11584 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11585 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011586
11587 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011588 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011589 ASSERT_VK_SUCCESS(err);
11590
11591 VkDescriptorImageInfo info = {};
11592 info.sampler = sampler;
11593
11594 VkWriteDescriptorSet descriptor_write;
11595 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11596 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011597 descriptor_write.dstSet = descriptorSet;
11598 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011599 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011600 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11601 descriptor_write.pImageInfo = &info;
11602 // This write update should succeed
11603 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11604 // Now perform a copy update that fails due to type mismatch
11605 VkCopyDescriptorSet copy_ds_update;
11606 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11607 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11608 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -060011609 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011610 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011611 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +080011612 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011613 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11614
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011615 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011616 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070011617 m_errorMonitor->SetDesiredFailureMsg(
11618 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011619 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060011620 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11621 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11622 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011623 copy_ds_update.srcBinding =
11624 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011625 copy_ds_update.dstSet = descriptorSet;
11626 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -060011627 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011628 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11629
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011630 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011631
Tobin Ehlis04356f92015-10-27 16:35:27 -060011632 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070011633 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011634 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
11635 "update array offset of 0 and update of "
11636 "5 descriptors oversteps total number "
11637 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011638
Tobin Ehlis04356f92015-10-27 16:35:27 -060011639 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11640 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11641 copy_ds_update.srcSet = descriptorSet;
11642 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011643 copy_ds_update.dstSet = descriptorSet;
11644 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011645 copy_ds_update.descriptorCount =
11646 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011647 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11648
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011649 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011650
Chia-I Wuf7458c52015-10-26 21:10:41 +080011651 vkDestroySampler(m_device->device(), sampler, NULL);
11652 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11653 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011654}
11655
Karl Schultz6addd812016-02-02 17:17:23 -070011656TEST_F(VkLayerTest, NumSamplesMismatch) {
11657 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11658 // sampleCount
11659 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011660
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011662 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011663
Tobin Ehlis3b780662015-05-28 12:11:26 -060011664 ASSERT_NO_FATAL_FAILURE(InitState());
11665 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011666 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011667 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011668 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011669
11670 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011671 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11672 ds_pool_ci.pNext = NULL;
11673 ds_pool_ci.maxSets = 1;
11674 ds_pool_ci.poolSizeCount = 1;
11675 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011676
Tobin Ehlis3b780662015-05-28 12:11:26 -060011677 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011678 err =
11679 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011680 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011681
Tony Barboureb254902015-07-15 12:50:33 -060011682 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011683 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011684 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011685 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011686 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11687 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011688
Tony Barboureb254902015-07-15 12:50:33 -060011689 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11690 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11691 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011692 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011693 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011694
Tobin Ehlis3b780662015-05-28 12:11:26 -060011695 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011696 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11697 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011698 ASSERT_VK_SUCCESS(err);
11699
11700 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011701 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011702 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011703 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011704 alloc_info.descriptorPool = ds_pool;
11705 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011706 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11707 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011708 ASSERT_VK_SUCCESS(err);
11709
Tony Barboureb254902015-07-15 12:50:33 -060011710 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011711 pipe_ms_state_ci.sType =
11712 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11713 pipe_ms_state_ci.pNext = NULL;
11714 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11715 pipe_ms_state_ci.sampleShadingEnable = 0;
11716 pipe_ms_state_ci.minSampleShading = 1.0;
11717 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011718
Tony Barboureb254902015-07-15 12:50:33 -060011719 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011720 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11721 pipeline_layout_ci.pNext = NULL;
11722 pipeline_layout_ci.setLayoutCount = 1;
11723 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011724
11725 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011726 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11727 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011728 ASSERT_VK_SUCCESS(err);
11729
Karl Schultz6addd812016-02-02 17:17:23 -070011730 VkShaderObj vs(m_device, bindStateVertShaderText,
11731 VK_SHADER_STAGE_VERTEX_BIT, this);
11732 VkShaderObj fs(m_device, bindStateFragShaderText,
11733 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011734 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011735 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011736 VkPipelineObj pipe(m_device);
11737 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011738 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011739 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011740 pipe.SetMSAA(&pipe_ms_state_ci);
11741 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011742
Tony Barbourfe3351b2015-07-28 10:17:20 -060011743 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011744 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11745 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011746
Mark Young29927482016-05-04 14:38:51 -060011747 // Render triangle (the error should trigger on the attempt to draw).
11748 Draw(3, 1, 0, 0);
11749
11750 // Finalize recording of the command buffer
11751 EndCommandBuffer();
11752
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011753 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011754
Chia-I Wuf7458c52015-10-26 21:10:41 +080011755 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11756 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11757 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011758}
Mark Young29927482016-05-04 14:38:51 -060011759
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011760TEST_F(VkLayerTest, RenderPassIncompatible) {
11761 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
11762 "Initial case is drawing with an active renderpass that's "
11763 "not compatible with the bound PSO's creation renderpass");
11764 VkResult err;
11765
11766 ASSERT_NO_FATAL_FAILURE(InitState());
11767 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11768
11769 VkDescriptorSetLayoutBinding dsl_binding = {};
11770 dsl_binding.binding = 0;
11771 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11772 dsl_binding.descriptorCount = 1;
11773 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11774 dsl_binding.pImmutableSamplers = NULL;
11775
11776 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11777 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11778 ds_layout_ci.pNext = NULL;
11779 ds_layout_ci.bindingCount = 1;
11780 ds_layout_ci.pBindings = &dsl_binding;
11781
11782 VkDescriptorSetLayout ds_layout;
11783 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11784 &ds_layout);
11785 ASSERT_VK_SUCCESS(err);
11786
11787 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11788 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11789 pipeline_layout_ci.pNext = NULL;
11790 pipeline_layout_ci.setLayoutCount = 1;
11791 pipeline_layout_ci.pSetLayouts = &ds_layout;
11792
11793 VkPipelineLayout pipeline_layout;
11794 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11795 &pipeline_layout);
11796 ASSERT_VK_SUCCESS(err);
11797
11798 VkShaderObj vs(m_device, bindStateVertShaderText,
11799 VK_SHADER_STAGE_VERTEX_BIT, this);
11800 VkShaderObj fs(m_device, bindStateFragShaderText,
11801 VK_SHADER_STAGE_FRAGMENT_BIT,
11802 this); // We shouldn't need a fragment shader
11803 // but add it to be able to run on more devices
11804 // Create a renderpass that will be incompatible with default renderpass
11805 VkAttachmentReference attach = {};
11806 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11807 VkAttachmentReference color_att = {};
11808 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11809 VkSubpassDescription subpass = {};
11810 subpass.inputAttachmentCount = 1;
11811 subpass.pInputAttachments = &attach;
11812 subpass.colorAttachmentCount = 1;
11813 subpass.pColorAttachments = &color_att;
11814 VkRenderPassCreateInfo rpci = {};
11815 rpci.subpassCount = 1;
11816 rpci.pSubpasses = &subpass;
11817 rpci.attachmentCount = 1;
11818 VkAttachmentDescription attach_desc = {};
11819 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011820 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11821 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011822 rpci.pAttachments = &attach_desc;
11823 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11824 VkRenderPass rp;
11825 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11826 VkPipelineObj pipe(m_device);
11827 pipe.AddShader(&vs);
11828 pipe.AddShader(&fs);
11829 pipe.AddColorAttachment();
11830 VkViewport view_port = {};
11831 m_viewports.push_back(view_port);
11832 pipe.SetViewport(m_viewports);
11833 VkRect2D rect = {};
11834 m_scissors.push_back(rect);
11835 pipe.SetScissor(m_scissors);
11836 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11837
11838 VkCommandBufferInheritanceInfo cbii = {};
11839 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11840 cbii.renderPass = rp;
11841 cbii.subpass = 0;
11842 VkCommandBufferBeginInfo cbbi = {};
11843 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11844 cbbi.pInheritanceInfo = &cbii;
11845 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11846 VkRenderPassBeginInfo rpbi = {};
11847 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11848 rpbi.framebuffer = m_framebuffer;
11849 rpbi.renderPass = rp;
11850 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi,
11851 VK_SUBPASS_CONTENTS_INLINE);
11852 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11853 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11854
11855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11856 " is incompatible w/ gfx pipeline ");
11857 // Render triangle (the error should trigger on the attempt to draw).
11858 Draw(3, 1, 0, 0);
11859
11860 // Finalize recording of the command buffer
11861 EndCommandBuffer();
11862
11863 m_errorMonitor->VerifyFound();
11864
11865 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11866 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11867 vkDestroyRenderPass(m_device->device(), rp, NULL);
11868}
11869
Mark Youngc89c6312016-03-31 16:03:20 -060011870TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11871 // Create Pipeline where the number of blend attachments doesn't match the
11872 // number of color attachments. In this case, we don't add any color
11873 // blend attachments even though we have a color attachment.
11874 VkResult err;
11875
11876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -060011877 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060011878
11879 ASSERT_NO_FATAL_FAILURE(InitState());
11880 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11881 VkDescriptorPoolSize ds_type_count = {};
11882 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11883 ds_type_count.descriptorCount = 1;
11884
11885 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11886 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11887 ds_pool_ci.pNext = NULL;
11888 ds_pool_ci.maxSets = 1;
11889 ds_pool_ci.poolSizeCount = 1;
11890 ds_pool_ci.pPoolSizes = &ds_type_count;
11891
11892 VkDescriptorPool ds_pool;
11893 err =
11894 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11895 ASSERT_VK_SUCCESS(err);
11896
11897 VkDescriptorSetLayoutBinding dsl_binding = {};
11898 dsl_binding.binding = 0;
11899 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11900 dsl_binding.descriptorCount = 1;
11901 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11902 dsl_binding.pImmutableSamplers = NULL;
11903
11904 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11905 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11906 ds_layout_ci.pNext = NULL;
11907 ds_layout_ci.bindingCount = 1;
11908 ds_layout_ci.pBindings = &dsl_binding;
11909
11910 VkDescriptorSetLayout ds_layout;
11911 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11912 &ds_layout);
11913 ASSERT_VK_SUCCESS(err);
11914
11915 VkDescriptorSet descriptorSet;
11916 VkDescriptorSetAllocateInfo alloc_info = {};
11917 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11918 alloc_info.descriptorSetCount = 1;
11919 alloc_info.descriptorPool = ds_pool;
11920 alloc_info.pSetLayouts = &ds_layout;
11921 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11922 &descriptorSet);
11923 ASSERT_VK_SUCCESS(err);
11924
11925 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11926 pipe_ms_state_ci.sType =
11927 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11928 pipe_ms_state_ci.pNext = NULL;
11929 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11930 pipe_ms_state_ci.sampleShadingEnable = 0;
11931 pipe_ms_state_ci.minSampleShading = 1.0;
11932 pipe_ms_state_ci.pSampleMask = NULL;
11933
11934 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11935 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11936 pipeline_layout_ci.pNext = NULL;
11937 pipeline_layout_ci.setLayoutCount = 1;
11938 pipeline_layout_ci.pSetLayouts = &ds_layout;
11939
11940 VkPipelineLayout pipeline_layout;
11941 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11942 &pipeline_layout);
11943 ASSERT_VK_SUCCESS(err);
11944
11945 VkShaderObj vs(m_device, bindStateVertShaderText,
11946 VK_SHADER_STAGE_VERTEX_BIT, this);
11947 VkShaderObj fs(m_device, bindStateFragShaderText,
11948 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011949 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -060011950 // but add it to be able to run on more devices
11951 VkPipelineObj pipe(m_device);
11952 pipe.AddShader(&vs);
11953 pipe.AddShader(&fs);
11954 pipe.SetMSAA(&pipe_ms_state_ci);
11955 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11956
11957 BeginCommandBuffer();
11958 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11959 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11960
Mark Young29927482016-05-04 14:38:51 -060011961 // Render triangle (the error should trigger on the attempt to draw).
11962 Draw(3, 1, 0, 0);
11963
11964 // Finalize recording of the command buffer
11965 EndCommandBuffer();
11966
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011967 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011968
11969 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11970 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11971 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11972}
Mark Young29927482016-05-04 14:38:51 -060011973
Mark Muellerd4914412016-06-13 17:52:06 -060011974TEST_F(VkLayerTest, MissingClearAttachment) {
11975 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
11976 "structure passed to vkCmdClearAttachments");
11977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11978 "vkCmdClearAttachments() attachment index 1 not found in attachment "
11979 "reference array of active subpass 0");
11980
11981 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11982 m_errorMonitor->VerifyFound();
11983}
11984
Karl Schultz6addd812016-02-02 17:17:23 -070011985TEST_F(VkLayerTest, ClearCmdNoDraw) {
11986 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
11987 // to issuing a Draw
11988 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011989
Karl Schultz6addd812016-02-02 17:17:23 -070011990 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -070011991 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011992 "vkCmdClearAttachments() issued on CB object ");
11993
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011994 ASSERT_NO_FATAL_FAILURE(InitState());
11995 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011996
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011997 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011998 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11999 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012000
12001 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012002 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12003 ds_pool_ci.pNext = NULL;
12004 ds_pool_ci.maxSets = 1;
12005 ds_pool_ci.poolSizeCount = 1;
12006 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060012007
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012008 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070012009 err =
12010 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012011 ASSERT_VK_SUCCESS(err);
12012
Tony Barboureb254902015-07-15 12:50:33 -060012013 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012014 dsl_binding.binding = 0;
12015 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12016 dsl_binding.descriptorCount = 1;
12017 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12018 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012019
Tony Barboureb254902015-07-15 12:50:33 -060012020 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012021 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12022 ds_layout_ci.pNext = NULL;
12023 ds_layout_ci.bindingCount = 1;
12024 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012025
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012026 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012027 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
12028 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012029 ASSERT_VK_SUCCESS(err);
12030
12031 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012032 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012033 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012034 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012035 alloc_info.descriptorPool = ds_pool;
12036 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012037 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
12038 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012039 ASSERT_VK_SUCCESS(err);
12040
Tony Barboureb254902015-07-15 12:50:33 -060012041 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012042 pipe_ms_state_ci.sType =
12043 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12044 pipe_ms_state_ci.pNext = NULL;
12045 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
12046 pipe_ms_state_ci.sampleShadingEnable = 0;
12047 pipe_ms_state_ci.minSampleShading = 1.0;
12048 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012049
Tony Barboureb254902015-07-15 12:50:33 -060012050 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012051 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12052 pipeline_layout_ci.pNext = NULL;
12053 pipeline_layout_ci.setLayoutCount = 1;
12054 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012055
12056 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012057 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
12058 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012059 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012060
Karl Schultz6addd812016-02-02 17:17:23 -070012061 VkShaderObj vs(m_device, bindStateVertShaderText,
12062 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060012063 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070012064 // on more devices
12065 VkShaderObj fs(m_device, bindStateFragShaderText,
12066 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012067
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012068 VkPipelineObj pipe(m_device);
12069 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012070 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012071 pipe.SetMSAA(&pipe_ms_state_ci);
12072 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012073
12074 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012075
Karl Schultz6addd812016-02-02 17:17:23 -070012076 // Main thing we care about for this test is that the VkImage obj we're
12077 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012078 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060012079 VkClearAttachment color_attachment;
12080 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12081 color_attachment.clearValue.color.float32[0] = 1.0;
12082 color_attachment.clearValue.color.float32[1] = 1.0;
12083 color_attachment.clearValue.color.float32[2] = 1.0;
12084 color_attachment.clearValue.color.float32[3] = 1.0;
12085 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070012086 VkClearRect clear_rect = {
12087 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012088
Karl Schultz6addd812016-02-02 17:17:23 -070012089 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
12090 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012091
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012092 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012093
Chia-I Wuf7458c52015-10-26 21:10:41 +080012094 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12095 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12096 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012097}
12098
Karl Schultz6addd812016-02-02 17:17:23 -070012099TEST_F(VkLayerTest, VtxBufferBadIndex) {
12100 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012101
Karl Schultz6addd812016-02-02 17:17:23 -070012102 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012103 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -070012104 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012105
Tobin Ehlis502480b2015-06-24 15:53:07 -060012106 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060012107 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060012108 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060012109
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012110 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012111 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12112 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012113
12114 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012115 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12116 ds_pool_ci.pNext = NULL;
12117 ds_pool_ci.maxSets = 1;
12118 ds_pool_ci.poolSizeCount = 1;
12119 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060012120
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060012121 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070012122 err =
12123 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012124 ASSERT_VK_SUCCESS(err);
12125
Tony Barboureb254902015-07-15 12:50:33 -060012126 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012127 dsl_binding.binding = 0;
12128 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12129 dsl_binding.descriptorCount = 1;
12130 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12131 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012132
Tony Barboureb254902015-07-15 12:50:33 -060012133 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012134 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12135 ds_layout_ci.pNext = NULL;
12136 ds_layout_ci.bindingCount = 1;
12137 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060012138
Tobin Ehlis502480b2015-06-24 15:53:07 -060012139 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012140 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
12141 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012142 ASSERT_VK_SUCCESS(err);
12143
12144 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012145 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012146 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012147 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012148 alloc_info.descriptorPool = ds_pool;
12149 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012150 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
12151 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012152 ASSERT_VK_SUCCESS(err);
12153
Tony Barboureb254902015-07-15 12:50:33 -060012154 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012155 pipe_ms_state_ci.sType =
12156 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12157 pipe_ms_state_ci.pNext = NULL;
12158 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12159 pipe_ms_state_ci.sampleShadingEnable = 0;
12160 pipe_ms_state_ci.minSampleShading = 1.0;
12161 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012162
Tony Barboureb254902015-07-15 12:50:33 -060012163 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012164 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12165 pipeline_layout_ci.pNext = NULL;
12166 pipeline_layout_ci.setLayoutCount = 1;
12167 pipeline_layout_ci.pSetLayouts = &ds_layout;
12168 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012169
Karl Schultz6addd812016-02-02 17:17:23 -070012170 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
12171 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012172 ASSERT_VK_SUCCESS(err);
12173
Karl Schultz6addd812016-02-02 17:17:23 -070012174 VkShaderObj vs(m_device, bindStateVertShaderText,
12175 VK_SHADER_STAGE_VERTEX_BIT, this);
12176 VkShaderObj fs(m_device, bindStateFragShaderText,
12177 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060012178 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070012179 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012180 VkPipelineObj pipe(m_device);
12181 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012182 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060012183 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012184 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060012185 pipe.SetViewport(m_viewports);
12186 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012187 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012188
12189 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070012190 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
12191 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060012192 // Don't care about actual data, just need to get to draw to flag error
12193 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -070012194 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
12195 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060012196 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060012197 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012198
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012199 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012200
Chia-I Wuf7458c52015-10-26 21:10:41 +080012201 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12202 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12203 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012204}
Mark Muellerdfe37552016-07-07 14:47:42 -060012205
Mark Mueller2ee294f2016-08-04 12:59:48 -060012206TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
12207 TEST_DESCRIPTION("Use an invalid count in a vkEnumeratePhysicalDevices call."
12208 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour6514a6b2016-08-12 09:37:19 -060012209 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Mueller2ee294f2016-08-04 12:59:48 -060012210
12211 const char *mismatch_count_message =
12212 "Call to vkEnumeratePhysicalDevices() "
12213 "w/ pPhysicalDeviceCount value ";
12214
12215 const char *invalid_queueFamilyIndex_message =
12216 "Invalid queue create request in vkCreateDevice(). Invalid "
12217 "queueFamilyIndex ";
12218
12219 const char *unavailable_feature_message =
12220 "While calling vkCreateDevice(), requesting feature #";
12221
12222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
12223 mismatch_count_message);
Mark Mueller880fce52016-08-17 15:23:23 -060012224 // The following test fails with recent NVidia drivers.
12225 // By the time core_validation is reached, the NVidia
12226 // driver has sanitized the invalid condition and core_validation
12227 // is not introduced to the failure condition. This is not the case
12228 // with AMD and Mesa drivers. Futher investigation is required
12229// uint32_t count = static_cast<uint32_t>(~0);
12230// VkPhysicalDevice physical_device;
12231// vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
12232// m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060012233
12234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12235 invalid_queueFamilyIndex_message);
12236 float queue_priority = 0.0;
12237
12238 VkDeviceQueueCreateInfo queue_create_info = {};
12239 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
12240 queue_create_info.queueCount = 1;
12241 queue_create_info.pQueuePriorities = &queue_priority;
12242 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
12243
12244 VkPhysicalDeviceFeatures features = m_device->phy().features();
12245 VkDevice testDevice;
12246 VkDeviceCreateInfo device_create_info = {};
12247 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
12248 device_create_info.queueCreateInfoCount = 1;
12249 device_create_info.pQueueCreateInfos = &queue_create_info;
12250 device_create_info.pEnabledFeatures = &features;
12251 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12252 m_errorMonitor->VerifyFound();
12253
12254 queue_create_info.queueFamilyIndex = 1;
12255
12256 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
12257 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
12258 for (unsigned i = 0; i < feature_count; i++) {
12259 if (VK_FALSE == feature_array[i]) {
12260 feature_array[i] = VK_TRUE;
12261 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12262 unavailable_feature_message);
12263 device_create_info.pEnabledFeatures = &features;
12264 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12265 m_errorMonitor->VerifyFound();
12266 break;
12267 }
12268 }
12269}
12270
12271TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
12272 TEST_DESCRIPTION("Use an invalid queue index in a vkCmdWaitEvents call."
12273 "End a command buffer with a query still in progress.");
12274
12275 const char *invalid_queue_index =
12276 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
12277 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
12278 "must be.";
12279
12280 const char *invalid_query =
12281 "Ending command buffer with in progress query: queryPool 0x";
12282
12283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12284 invalid_queue_index);
12285
12286 ASSERT_NO_FATAL_FAILURE(InitState());
12287
12288 VkEvent event;
12289 VkEventCreateInfo event_create_info{};
12290 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12291 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12292
12293
12294 VkQueue queue = VK_NULL_HANDLE;
12295 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
12296 0, &queue);
12297
12298 BeginCommandBuffer();
12299
12300 VkImageObj image(m_device);
12301 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
12302 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12303 ASSERT_TRUE(image.initialized());
12304 VkImageMemoryBarrier img_barrier = {};
12305 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12306 img_barrier.pNext = NULL;
12307 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
12308 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
12309 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12310 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12311 img_barrier.image = image.handle();
12312 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060012313
12314 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
12315 // that layer validation catches the case when it is not.
12316 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012317 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12318 img_barrier.subresourceRange.baseArrayLayer = 0;
12319 img_barrier.subresourceRange.baseMipLevel = 0;
12320 img_barrier.subresourceRange.layerCount = 1;
12321 img_barrier.subresourceRange.levelCount = 1;
12322 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event,
12323 VK_PIPELINE_STAGE_HOST_BIT,
12324 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
12325 nullptr, 1, &img_barrier);
12326 m_errorMonitor->VerifyFound();
12327
12328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12329 invalid_query);
12330
12331 VkQueryPool query_pool;
12332 VkQueryPoolCreateInfo query_pool_create_info = {};
12333 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12334 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
12335 query_pool_create_info.queryCount = 1;
12336 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
12337 &query_pool);
12338
12339 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/,
12340 1 /*queryCount*/);
12341 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
12342
12343 vkEndCommandBuffer(m_commandBuffer->handle());
12344 m_errorMonitor->VerifyFound();
12345
12346 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
12347 vkDestroyEvent(m_device->device(), event, nullptr);
12348}
12349
Mark Muellerdfe37552016-07-07 14:47:42 -060012350TEST_F(VkLayerTest, VertexBufferInvalid) {
12351 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
12352 "delete a buffer twice, use an invalid offset for each "
12353 "buffer type, and attempt to bind a null buffer");
12354
12355 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
12356 "using deleted buffer ";
12357 const char *double_destroy_message = "Cannot free buffer 0x";
12358 const char *invalid_offset_message = "vkBindBufferMemory(): "
12359 "memoryOffset is 0x";
12360 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
12361 "storage memoryOffset "
12362 "is 0x";
12363 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
12364 "texel memoryOffset "
12365 "is 0x";
12366 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
12367 "uniform memoryOffset "
12368 "is 0x";
12369 const char *bind_null_buffer_message = "In vkBindBufferMemory, attempting"
12370 " to Bind Obj(0x";
12371 const char *free_invalid_buffer_message = "Request to delete memory "
12372 "object 0x";
12373
12374 ASSERT_NO_FATAL_FAILURE(InitState());
12375 ASSERT_NO_FATAL_FAILURE(InitViewport());
12376 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12377
12378 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
12379 pipe_ms_state_ci.sType =
12380 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12381 pipe_ms_state_ci.pNext = NULL;
12382 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12383 pipe_ms_state_ci.sampleShadingEnable = 0;
12384 pipe_ms_state_ci.minSampleShading = 1.0;
12385 pipe_ms_state_ci.pSampleMask = nullptr;
12386
12387 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12388 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12389 VkPipelineLayout pipeline_layout;
12390
12391 VkResult err = vkCreatePipelineLayout(m_device->device(),
12392 &pipeline_layout_ci, nullptr,
12393 &pipeline_layout);
12394 ASSERT_VK_SUCCESS(err);
12395
12396 VkShaderObj vs(m_device, bindStateVertShaderText,
12397 VK_SHADER_STAGE_VERTEX_BIT, this);
12398 VkShaderObj fs(m_device, bindStateFragShaderText,
12399 VK_SHADER_STAGE_FRAGMENT_BIT,
12400 this);
12401 VkPipelineObj pipe(m_device);
12402 pipe.AddShader(&vs);
12403 pipe.AddShader(&fs);
12404 pipe.AddColorAttachment();
12405 pipe.SetMSAA(&pipe_ms_state_ci);
12406 pipe.SetViewport(m_viewports);
12407 pipe.SetScissor(m_scissors);
12408 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12409
12410 BeginCommandBuffer();
12411 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
12412 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12413
12414 {
12415 // Create and bind a vertex buffer in a reduced scope, which will cause
12416 // it to be deleted upon leaving this scope
12417 const float vbo_data[3] = {1.f, 0.f, 1.f};
12418 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data),
12419 3, vbo_data);
12420 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
12421 draw_verticies.AddVertexInputToPipe(pipe);
12422 }
12423
12424 Draw(1, 0, 0, 0);
12425
12426 EndCommandBuffer();
12427
12428 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12429 deleted_buffer_in_command_buffer);
12430 QueueCommandBuffer(false);
12431 m_errorMonitor->VerifyFound();
12432
12433 {
12434 // Create and bind a vertex buffer in a reduced scope, and delete it
12435 // twice, the second through the destructor
12436 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12437 VkBufferTest::eDoubleDelete);
12438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12439 double_destroy_message);
12440 buffer_test.TestDoubleDestroy();
12441 }
12442 m_errorMonitor->VerifyFound();
12443
12444 if (VkBufferTest::
12445 GetTestConditionValid(m_device,
12446 VkBufferTest::eInvalidMemoryOffset)) {
12447 // Create and bind a memory buffer with an invalid offset.
12448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12449 invalid_offset_message);
12450 VkBufferTest buffer_test(m_device,
12451 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
12452 VkBufferTest::eInvalidMemoryOffset);
12453 (void) buffer_test;
12454 m_errorMonitor->VerifyFound();
12455 }
12456
12457 if (VkBufferTest::
12458 GetTestConditionValid(m_device,
12459 VkBufferTest::eInvalidDeviceOffset,
12460 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
12461 // Create and bind a memory buffer with an invalid offset again,
12462 // but look for a texel buffer message.
12463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12464 invalid_texel_buffer_offset_message);
12465 VkBufferTest buffer_test(m_device,
12466 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
12467 VkBufferTest::eInvalidDeviceOffset);
12468 (void) buffer_test;
12469 m_errorMonitor->VerifyFound();
12470 }
12471
12472 if (VkBufferTest::
12473 GetTestConditionValid(m_device,
12474 VkBufferTest::eInvalidDeviceOffset,
12475 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
12476 // Create and bind a memory buffer with an invalid offset again, but
12477 // look for a uniform buffer message.
12478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12479 invalid_uniform_buffer_offset_message);
12480 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
12481 VkBufferTest::eInvalidDeviceOffset);
12482 (void) buffer_test;
12483 m_errorMonitor->VerifyFound();
12484 }
12485
12486 if (VkBufferTest::
12487 GetTestConditionValid(m_device,
12488 VkBufferTest::eInvalidDeviceOffset,
12489 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
12490 // Create and bind a memory buffer with an invalid offset again, but
12491 // look for a storage buffer message.
12492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12493 invalid_storage_buffer_offset_message);
12494 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12495 VkBufferTest::eInvalidDeviceOffset);
12496 (void) buffer_test;
12497 m_errorMonitor->VerifyFound();
12498 }
12499
12500 {
12501 // Attempt to bind a null buffer.
12502 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12503 bind_null_buffer_message);
12504 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12505 VkBufferTest::eBindNullBuffer);
12506 (void) buffer_test;
12507 m_errorMonitor->VerifyFound();
12508 }
12509
12510 {
12511 // Attempt to use an invalid handle to delete a buffer.
12512 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12513 free_invalid_buffer_message);
12514 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12515 VkBufferTest::eFreeInvalidHandle);
12516 (void) buffer_test;
12517 }
12518 m_errorMonitor->VerifyFound();
12519
12520 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12521}
12522
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012523// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
12524TEST_F(VkLayerTest, InvalidImageLayout) {
12525 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
12526 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
12527 "images in the wrong layout when they're copied or transitioned.");
12528 // 3 in ValidateCmdBufImageLayouts
12529 // * -1 Attempt to submit cmd buf w/ deleted image
12530 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
12531 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
12532 m_errorMonitor->SetDesiredFailureMsg(
12533 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12534 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12535
12536 ASSERT_NO_FATAL_FAILURE(InitState());
12537 // Create src & dst images to use for copy operations
12538 VkImage src_image;
12539 VkImage dst_image;
12540
12541 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
12542 const int32_t tex_width = 32;
12543 const int32_t tex_height = 32;
12544
12545 VkImageCreateInfo image_create_info = {};
12546 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12547 image_create_info.pNext = NULL;
12548 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12549 image_create_info.format = tex_format;
12550 image_create_info.extent.width = tex_width;
12551 image_create_info.extent.height = tex_height;
12552 image_create_info.extent.depth = 1;
12553 image_create_info.mipLevels = 1;
12554 image_create_info.arrayLayers = 4;
12555 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12556 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12557 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
12558 image_create_info.flags = 0;
12559
12560 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
12561 ASSERT_VK_SUCCESS(err);
12562 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
12563 ASSERT_VK_SUCCESS(err);
12564
12565 BeginCommandBuffer();
12566 VkImageCopy copyRegion;
12567 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12568 copyRegion.srcSubresource.mipLevel = 0;
12569 copyRegion.srcSubresource.baseArrayLayer = 0;
12570 copyRegion.srcSubresource.layerCount = 1;
12571 copyRegion.srcOffset.x = 0;
12572 copyRegion.srcOffset.y = 0;
12573 copyRegion.srcOffset.z = 0;
12574 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12575 copyRegion.dstSubresource.mipLevel = 0;
12576 copyRegion.dstSubresource.baseArrayLayer = 0;
12577 copyRegion.dstSubresource.layerCount = 1;
12578 copyRegion.dstOffset.x = 0;
12579 copyRegion.dstOffset.y = 0;
12580 copyRegion.dstOffset.z = 0;
12581 copyRegion.extent.width = 1;
12582 copyRegion.extent.height = 1;
12583 copyRegion.extent.depth = 1;
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 source 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_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12591 m_errorMonitor->VerifyFound();
12592 // Final src error is due to bad layout type
12593 m_errorMonitor->SetDesiredFailureMsg(
12594 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12595 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
12596 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12597 m_errorMonitor->VerifyFound();
12598 // Now verify same checks for dst
12599 m_errorMonitor->SetDesiredFailureMsg(
12600 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12601 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
12602 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12603 m_errorMonitor->VerifyFound();
12604 // Now cause error due to src image layout changing
12605 m_errorMonitor->SetDesiredFailureMsg(
12606 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12607 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
12608 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
12609 m_errorMonitor->VerifyFound();
12610 m_errorMonitor->SetDesiredFailureMsg(
12611 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12612 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
12613 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
12614 m_errorMonitor->VerifyFound();
12615 // Now cause error due to bad image layout transition in PipelineBarrier
12616 VkImageMemoryBarrier image_barrier[1] = {};
12617 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12618 image_barrier[0].image = src_image;
12619 image_barrier[0].subresourceRange.layerCount = 2;
12620 image_barrier[0].subresourceRange.levelCount = 2;
12621 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12622 m_errorMonitor->SetDesiredFailureMsg(
12623 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12624 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
12625 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
12626 m_errorMonitor->VerifyFound();
12627
12628 // Finally some layout errors at RenderPass create time
12629 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12630 VkAttachmentReference attach = {};
12631 // perf warning for GENERAL layout w/ non-DS input attachment
12632 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12633 VkSubpassDescription subpass = {};
12634 subpass.inputAttachmentCount = 1;
12635 subpass.pInputAttachments = &attach;
12636 VkRenderPassCreateInfo rpci = {};
12637 rpci.subpassCount = 1;
12638 rpci.pSubpasses = &subpass;
12639 rpci.attachmentCount = 1;
12640 VkAttachmentDescription attach_desc = {};
12641 attach_desc.format = VK_FORMAT_UNDEFINED;
12642 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012643 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012644 VkRenderPass rp;
12645 m_errorMonitor->SetDesiredFailureMsg(
12646 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12647 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
12648 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12649 m_errorMonitor->VerifyFound();
12650 // error w/ non-general layout
12651 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12652
12653 m_errorMonitor->SetDesiredFailureMsg(
12654 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12655 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12656 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12657 m_errorMonitor->VerifyFound();
12658 subpass.inputAttachmentCount = 0;
12659 subpass.colorAttachmentCount = 1;
12660 subpass.pColorAttachments = &attach;
12661 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12662 // perf warning for GENERAL layout on color attachment
12663 m_errorMonitor->SetDesiredFailureMsg(
12664 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12665 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
12666 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12667 m_errorMonitor->VerifyFound();
12668 // error w/ non-color opt or GENERAL layout for color attachment
12669 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12670 m_errorMonitor->SetDesiredFailureMsg(
12671 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12672 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12673 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12674 m_errorMonitor->VerifyFound();
12675 subpass.colorAttachmentCount = 0;
12676 subpass.pDepthStencilAttachment = &attach;
12677 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12678 // perf warning for GENERAL layout on DS attachment
12679 m_errorMonitor->SetDesiredFailureMsg(
12680 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Chris Forbesc5dd9bc2016-08-09 08:17:14 +120012681 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012682 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12683 m_errorMonitor->VerifyFound();
12684 // error w/ non-ds opt or GENERAL layout for color attachment
12685 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12686 m_errorMonitor->SetDesiredFailureMsg(
12687 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesc5dd9bc2016-08-09 08:17:14 +120012688 "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 -060012689 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12690 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012691 // For this error we need a valid renderpass so create default one
12692 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12693 attach.attachment = 0;
12694 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
12695 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12696 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12697 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12698 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12699 // Can't do a CLEAR load on READ_ONLY initialLayout
12700 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12701 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12702 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12704 " with invalid first layout "
12705 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
12706 "ONLY_OPTIMAL");
12707 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12708 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012709
12710 vkDestroyImage(m_device->device(), src_image, NULL);
12711 vkDestroyImage(m_device->device(), dst_image, NULL);
12712}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012713
12714TEST_F(VkLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
12715 TEST_DESCRIPTION("Positive test where we create a renderpass with an "
12716 "attachment that uses LOAD_OP_CLEAR, the first subpass "
12717 "has a valid layout, and a second subpass then uses a "
12718 "valid *READ_ONLY* layout.");
12719 m_errorMonitor->ExpectSuccess();
12720 ASSERT_NO_FATAL_FAILURE(InitState());
12721
12722 VkAttachmentReference attach[2] = {};
12723 attach[0].attachment = 0;
12724 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
12725 attach[1].attachment = 0;
12726 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12727 VkSubpassDescription subpasses[2] = {};
12728 // First subpass clears DS attach on load
12729 subpasses[0].pDepthStencilAttachment = &attach[0];
12730 // 2nd subpass reads in DS as input attachment
12731 subpasses[1].inputAttachmentCount = 1;
12732 subpasses[1].pInputAttachments = &attach[1];
12733 VkAttachmentDescription attach_desc = {};
12734 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
12735 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12736 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12737 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12738 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12739 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12740 attach_desc.initialLayout =
12741 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
12742 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12743 VkRenderPassCreateInfo rpci = {};
12744 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
12745 rpci.attachmentCount = 1;
12746 rpci.pAttachments = &attach_desc;
12747 rpci.subpassCount = 2;
12748 rpci.pSubpasses = subpasses;
12749
12750 // Now create RenderPass and verify no errors
12751 VkRenderPass rp;
12752 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12753 m_errorMonitor->VerifyNotFound();
12754
12755 vkDestroyRenderPass(m_device->device(), rp, NULL);
12756}
Tobin Ehlis4af23302016-07-19 10:50:30 -060012757
12758TEST_F(VkLayerTest, FramebufferIncompatible) {
12759 TEST_DESCRIPTION("Bind a secondary command buffer with with a framebuffer "
12760 "that does not match the framebuffer for the active "
12761 "renderpass.");
12762 ASSERT_NO_FATAL_FAILURE(InitState());
12763 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12764
12765 // A renderpass with one color attachment.
12766 VkAttachmentDescription attachment = {
12767 0,
12768 VK_FORMAT_B8G8R8A8_UNORM,
12769 VK_SAMPLE_COUNT_1_BIT,
12770 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12771 VK_ATTACHMENT_STORE_OP_STORE,
12772 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12773 VK_ATTACHMENT_STORE_OP_DONT_CARE,
12774 VK_IMAGE_LAYOUT_UNDEFINED,
12775 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
12776
12777 VkAttachmentReference att_ref = {0,
12778 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
12779
12780 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS,
12781 0, nullptr,
12782 1, &att_ref,
12783 nullptr, nullptr,
12784 0, nullptr};
12785
12786 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
12787 nullptr,
12788 0,
12789 1,
12790 &attachment,
12791 1,
12792 &subpass,
12793 0,
12794 nullptr};
12795
12796 VkRenderPass rp;
12797 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
12798 ASSERT_VK_SUCCESS(err);
12799
12800 // A compatible framebuffer.
12801 VkImageObj image(m_device);
12802 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM,
12803 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12804 ASSERT_TRUE(image.initialized());
12805
12806 VkImageViewCreateInfo ivci = {
12807 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
12808 nullptr,
12809 0,
12810 image.handle(),
12811 VK_IMAGE_VIEW_TYPE_2D,
12812 VK_FORMAT_B8G8R8A8_UNORM,
12813 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
12814 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
12815 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
12816 };
12817 VkImageView view;
12818 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
12819 ASSERT_VK_SUCCESS(err);
12820
12821 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
12822 nullptr,
12823 0,
12824 rp,
12825 1,
12826 &view,
12827 32,
12828 32,
12829 1};
12830 VkFramebuffer fb;
12831 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
12832 ASSERT_VK_SUCCESS(err);
12833
12834 VkCommandBufferAllocateInfo cbai = {};
12835 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12836 cbai.commandPool = m_commandPool;
12837 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12838 cbai.commandBufferCount = 1;
12839
12840 VkCommandBuffer sec_cb;
12841 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
12842 ASSERT_VK_SUCCESS(err);
12843 VkCommandBufferBeginInfo cbbi = {};
12844 VkCommandBufferInheritanceInfo cbii = {};
12845 cbii.renderPass = renderPass();
12846 cbii.framebuffer = fb;
12847 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12848 cbbi.pNext = NULL;
12849 cbbi.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
12850 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
12851 cbbi.pInheritanceInfo = &cbii;
12852 vkBeginCommandBuffer(sec_cb, &cbbi);
12853 vkEndCommandBuffer(sec_cb);
12854
12855 BeginCommandBuffer();
12856
12857 m_errorMonitor->SetDesiredFailureMsg(
12858 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12859 " that is not the same as the primaryCB's current active framebuffer ");
12860 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
12861 m_errorMonitor->VerifyFound();
12862 // Cleanup
12863 vkDestroyImageView(m_device->device(), view, NULL);
12864 vkDestroyRenderPass(m_device->device(), rp, NULL);
12865 vkDestroyFramebuffer(m_device->device(), fb, NULL);
12866}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012867
12868TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
12869 TEST_DESCRIPTION("If logicOp is available on the device, set it to an "
12870 "invalid value. If logicOp is not available, attempt to "
12871 "use it and verify that we see the correct error.");
12872 ASSERT_NO_FATAL_FAILURE(InitState());
12873 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12874
12875 auto features = m_device->phy().features();
12876 // Set the expected error depending on whether or not logicOp available
12877 if (VK_FALSE == features.logicOp) {
12878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12879 "If logic operations feature not "
12880 "enabled, logicOpEnable must be "
12881 "VK_FALSE");
12882 } else {
12883 m_errorMonitor->SetDesiredFailureMsg(
12884 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12885 ", logicOp must be a valid VkLogicOp value");
12886 }
12887 // Create a pipeline using logicOp
12888 VkResult err;
12889
12890 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12891 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12892
12893 VkPipelineLayout pipeline_layout;
12894 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
12895 &pipeline_layout);
12896 ASSERT_VK_SUCCESS(err);
12897
12898 VkPipelineViewportStateCreateInfo vp_state_ci = {};
12899 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
12900 vp_state_ci.viewportCount = 1;
12901 VkViewport vp = {}; // Just need dummy vp to point to
12902 vp_state_ci.pViewports = &vp;
12903 vp_state_ci.scissorCount = 1;
12904 VkRect2D scissors = {}; // Dummy scissors to point to
12905 vp_state_ci.pScissors = &scissors;
12906 // No dynamic state
12907 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
12908 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
12909
12910 VkPipelineShaderStageCreateInfo shaderStages[2];
12911 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
12912
12913 VkShaderObj vs(m_device, bindStateVertShaderText,
12914 VK_SHADER_STAGE_VERTEX_BIT, this);
12915 VkShaderObj fs(m_device, bindStateFragShaderText,
12916 VK_SHADER_STAGE_FRAGMENT_BIT,
12917 this);
12918 shaderStages[0] = vs.GetStageCreateInfo();
12919 shaderStages[1] = fs.GetStageCreateInfo();
12920
12921 VkPipelineVertexInputStateCreateInfo vi_ci = {};
12922 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
12923
12924 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
12925 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
12926 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
12927
12928 VkPipelineRasterizationStateCreateInfo rs_ci = {};
12929 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
12930
12931 VkPipelineColorBlendAttachmentState att = {};
12932 att.blendEnable = VK_FALSE;
12933 att.colorWriteMask = 0xf;
12934
12935 VkPipelineColorBlendStateCreateInfo cb_ci = {};
12936 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
12937 // Enable logicOp & set logicOp to value 1 beyond allowed entries
12938 cb_ci.logicOpEnable = VK_TRUE;
12939 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
12940 cb_ci.attachmentCount = 1;
12941 cb_ci.pAttachments = &att;
12942
12943 VkGraphicsPipelineCreateInfo gp_ci = {};
12944 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
12945 gp_ci.stageCount = 2;
12946 gp_ci.pStages = shaderStages;
12947 gp_ci.pVertexInputState = &vi_ci;
12948 gp_ci.pInputAssemblyState = &ia_ci;
12949 gp_ci.pViewportState = &vp_state_ci;
12950 gp_ci.pRasterizationState = &rs_ci;
12951 gp_ci.pColorBlendState = &cb_ci;
12952 gp_ci.pDynamicState = &dyn_state_ci;
12953 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
12954 gp_ci.layout = pipeline_layout;
12955 gp_ci.renderPass = renderPass();
12956
12957 VkPipelineCacheCreateInfo pc_ci = {};
12958 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
12959
12960 VkPipeline pipeline;
12961 VkPipelineCache pipelineCache;
12962 err =
12963 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
12964 ASSERT_VK_SUCCESS(err);
12965
12966 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
12967 &gp_ci, NULL, &pipeline);
12968 m_errorMonitor->VerifyFound();
12969 if (VK_SUCCESS == err) {
12970 vkDestroyPipeline(m_device->device(), pipeline, NULL);
12971 }
12972 m_errorMonitor->VerifyFound();
12973 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
12974 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12975}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012976#endif // DRAW_STATE_TESTS
12977
Tobin Ehlis0788f522015-05-26 16:11:58 -060012978#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060012979#if GTEST_IS_THREADSAFE
12980struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012981 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012982 VkEvent event;
12983 bool bailout;
12984};
12985
Karl Schultz6addd812016-02-02 17:17:23 -070012986extern "C" void *AddToCommandBuffer(void *arg) {
12987 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012988
Mike Stroyana6d14942016-07-13 15:10:05 -060012989 for (int i = 0; i < 80000; i++) {
Karl Schultz6addd812016-02-02 17:17:23 -070012990 vkCmdSetEvent(data->commandBuffer, data->event,
12991 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012992 if (data->bailout) {
12993 break;
12994 }
12995 }
12996 return NULL;
12997}
12998
Karl Schultz6addd812016-02-02 17:17:23 -070012999TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013000 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013001
Karl Schultz6addd812016-02-02 17:17:23 -070013002 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13003 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013004
Mike Stroyanaccf7692015-05-12 16:00:45 -060013005 ASSERT_NO_FATAL_FAILURE(InitState());
13006 ASSERT_NO_FATAL_FAILURE(InitViewport());
13007 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13008
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013009 // Calls AllocateCommandBuffers
13010 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013011
13012 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013013 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013014
13015 VkEventCreateInfo event_info;
13016 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013017 VkResult err;
13018
13019 memset(&event_info, 0, sizeof(event_info));
13020 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13021
Chia-I Wuf7458c52015-10-26 21:10:41 +080013022 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013023 ASSERT_VK_SUCCESS(err);
13024
Mike Stroyanaccf7692015-05-12 16:00:45 -060013025 err = vkResetEvent(device(), event);
13026 ASSERT_VK_SUCCESS(err);
13027
13028 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013029 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013030 data.event = event;
13031 data.bailout = false;
13032 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013033
13034 // First do some correct operations using multiple threads.
13035 // Add many entries to command buffer from another thread.
13036 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13037 // Make non-conflicting calls from this thread at the same time.
13038 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013039 uint32_t count;
13040 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013041 }
13042 test_platform_thread_join(thread, NULL);
13043
13044 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013045 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013046 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013047 // Add many entries to command buffer from this thread at the same time.
13048 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013049
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013050 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013051 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013052
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013053 m_errorMonitor->SetBailout(NULL);
13054
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013055 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013056
Chia-I Wuf7458c52015-10-26 21:10:41 +080013057 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013058}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013059#endif // GTEST_IS_THREADSAFE
13060#endif // THREADING_TESTS
13061
Chris Forbes9f7ff632015-05-25 11:13:08 +120013062#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070013063TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013064 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
13065 "with an impossible code size");
13066
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013067 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013068 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013069
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013070 ASSERT_NO_FATAL_FAILURE(InitState());
13071 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13072
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013073 VkShaderModule module;
13074 VkShaderModuleCreateInfo moduleCreateInfo;
13075 struct icd_spv_header spv;
13076
13077 spv.magic = ICD_SPV_MAGIC;
13078 spv.version = ICD_SPV_VERSION;
13079 spv.gen_magic = 0;
13080
13081 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13082 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013083 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013084 moduleCreateInfo.codeSize = 4;
13085 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013086 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013087
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013088 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013089}
13090
Karl Schultz6addd812016-02-02 17:17:23 -070013091TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013092 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
13093 "with a bad magic number");
13094
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013096 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013097
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013098 ASSERT_NO_FATAL_FAILURE(InitState());
13099 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13100
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013101 VkShaderModule module;
13102 VkShaderModuleCreateInfo moduleCreateInfo;
13103 struct icd_spv_header spv;
13104
13105 spv.magic = ~ICD_SPV_MAGIC;
13106 spv.version = ICD_SPV_VERSION;
13107 spv.gen_magic = 0;
13108
13109 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13110 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013111 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013112 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13113 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013114 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013115
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013116 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013117}
13118
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013119#if 0
13120// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013121TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013122 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013123 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013124
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013125 ASSERT_NO_FATAL_FAILURE(InitState());
13126 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13127
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013128 VkShaderModule module;
13129 VkShaderModuleCreateInfo moduleCreateInfo;
13130 struct icd_spv_header spv;
13131
13132 spv.magic = ICD_SPV_MAGIC;
13133 spv.version = ~ICD_SPV_VERSION;
13134 spv.gen_magic = 0;
13135
13136 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13137 moduleCreateInfo.pNext = NULL;
13138
Karl Schultz6addd812016-02-02 17:17:23 -070013139 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013140 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13141 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013142 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013143
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013144 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013145}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013146#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013147
Karl Schultz6addd812016-02-02 17:17:23 -070013148TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013149 TEST_DESCRIPTION("Test that a warning is produced for a vertex output that "
13150 "is not consumed by the fragment stage");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013151 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013152 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013153
Chris Forbes9f7ff632015-05-25 11:13:08 +120013154 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013155 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013156
13157 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013158 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120013159 "\n"
13160 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070013161 "out gl_PerVertex {\n"
13162 " vec4 gl_Position;\n"
13163 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120013164 "void main(){\n"
13165 " gl_Position = vec4(1);\n"
13166 " x = 0;\n"
13167 "}\n";
13168 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013169 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120013170 "\n"
13171 "layout(location=0) out vec4 color;\n"
13172 "void main(){\n"
13173 " color = vec4(1);\n"
13174 "}\n";
13175
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013176 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13177 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013178
13179 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013180 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013181 pipe.AddShader(&vs);
13182 pipe.AddShader(&fs);
13183
Chris Forbes9f7ff632015-05-25 11:13:08 +120013184 VkDescriptorSetObj descriptorSet(m_device);
13185 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013186 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013187
Tony Barbour5781e8f2015-08-04 16:23:11 -060013188 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013189
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013190 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013191}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013192
Karl Schultz6addd812016-02-02 17:17:23 -070013193TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013194 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
13195 "which is not present in the outputs of the previous stage");
13196
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013197 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013198 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013199
Chris Forbes59cb88d2015-05-25 11:13:13 +120013200 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013201 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013202
13203 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013204 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120013205 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013206 "out gl_PerVertex {\n"
13207 " vec4 gl_Position;\n"
13208 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120013209 "void main(){\n"
13210 " gl_Position = vec4(1);\n"
13211 "}\n";
13212 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013213 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120013214 "\n"
13215 "layout(location=0) in float x;\n"
13216 "layout(location=0) out vec4 color;\n"
13217 "void main(){\n"
13218 " color = vec4(x);\n"
13219 "}\n";
13220
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013221 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13222 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120013223
13224 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013225 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120013226 pipe.AddShader(&vs);
13227 pipe.AddShader(&fs);
13228
Chris Forbes59cb88d2015-05-25 11:13:13 +120013229 VkDescriptorSetObj descriptorSet(m_device);
13230 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013231 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120013232
Tony Barbour5781e8f2015-08-04 16:23:11 -060013233 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013234
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013235 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120013236}
13237
Karl Schultz6addd812016-02-02 17:17:23 -070013238TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013239 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
13240 "within an interace block, which is not present in the outputs "
13241 "of the previous stage.");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013243 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013244
13245 ASSERT_NO_FATAL_FAILURE(InitState());
13246 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13247
13248 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013249 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013250 "\n"
13251 "out gl_PerVertex {\n"
13252 " vec4 gl_Position;\n"
13253 "};\n"
13254 "void main(){\n"
13255 " gl_Position = vec4(1);\n"
13256 "}\n";
13257 char const *fsSource =
13258 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013259 "\n"
13260 "in block { layout(location=0) float x; } ins;\n"
13261 "layout(location=0) out vec4 color;\n"
13262 "void main(){\n"
13263 " color = vec4(ins.x);\n"
13264 "}\n";
13265
13266 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13267 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13268
13269 VkPipelineObj pipe(m_device);
13270 pipe.AddColorAttachment();
13271 pipe.AddShader(&vs);
13272 pipe.AddShader(&fs);
13273
13274 VkDescriptorSetObj descriptorSet(m_device);
13275 descriptorSet.AppendDummy();
13276 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13277
13278 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13279
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013280 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013281}
13282
Karl Schultz6addd812016-02-02 17:17:23 -070013283TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013284 TEST_DESCRIPTION("Test that an error is produced for mismatched array sizes "
13285 "across the VS->FS interface");
Chris Forbes0036fd12016-01-26 14:19:49 +130013286 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +130013287 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -070013288 "output arr[2] of float32' vs 'ptr to "
13289 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130013290
13291 ASSERT_NO_FATAL_FAILURE(InitState());
13292 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13293
13294 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013295 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130013296 "\n"
13297 "layout(location=0) out float x[2];\n"
13298 "out gl_PerVertex {\n"
13299 " vec4 gl_Position;\n"
13300 "};\n"
13301 "void main(){\n"
13302 " x[0] = 0; x[1] = 0;\n"
13303 " gl_Position = vec4(1);\n"
13304 "}\n";
13305 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013306 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130013307 "\n"
13308 "layout(location=0) in float x[3];\n"
13309 "layout(location=0) out vec4 color;\n"
13310 "void main(){\n"
13311 " color = vec4(x[0] + x[1] + x[2]);\n"
13312 "}\n";
13313
13314 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13315 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13316
13317 VkPipelineObj pipe(m_device);
13318 pipe.AddColorAttachment();
13319 pipe.AddShader(&vs);
13320 pipe.AddShader(&fs);
13321
13322 VkDescriptorSetObj descriptorSet(m_device);
13323 descriptorSet.AppendDummy();
13324 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13325
13326 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13327
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013328 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130013329}
13330
Karl Schultz6addd812016-02-02 17:17:23 -070013331TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013332 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
13333 "the VS->FS interface");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013335 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013336
Chris Forbesb56af562015-05-25 11:13:17 +120013337 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013338 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120013339
13340 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013341 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120013342 "\n"
13343 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070013344 "out gl_PerVertex {\n"
13345 " vec4 gl_Position;\n"
13346 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +120013347 "void main(){\n"
13348 " x = 0;\n"
13349 " gl_Position = vec4(1);\n"
13350 "}\n";
13351 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013352 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120013353 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013354 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +120013355 "layout(location=0) out vec4 color;\n"
13356 "void main(){\n"
13357 " color = vec4(x);\n"
13358 "}\n";
13359
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013360 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13361 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120013362
13363 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013364 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120013365 pipe.AddShader(&vs);
13366 pipe.AddShader(&fs);
13367
Chris Forbesb56af562015-05-25 11:13:17 +120013368 VkDescriptorSetObj descriptorSet(m_device);
13369 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013370 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120013371
Tony Barbour5781e8f2015-08-04 16:23:11 -060013372 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120013373
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013374 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120013375}
13376
Karl Schultz6addd812016-02-02 17:17:23 -070013377TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013378 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
13379 "the VS->FS interface, when the variable is contained within "
13380 "an interface block");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013381 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013382 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013383
13384 ASSERT_NO_FATAL_FAILURE(InitState());
13385 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13386
13387 char const *vsSource =
13388 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013389 "\n"
13390 "out block { layout(location=0) int x; } outs;\n"
13391 "out gl_PerVertex {\n"
13392 " vec4 gl_Position;\n"
13393 "};\n"
13394 "void main(){\n"
13395 " outs.x = 0;\n"
13396 " gl_Position = vec4(1);\n"
13397 "}\n";
13398 char const *fsSource =
13399 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013400 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013401 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +130013402 "layout(location=0) out vec4 color;\n"
13403 "void main(){\n"
13404 " color = vec4(ins.x);\n"
13405 "}\n";
13406
13407 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13408 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13409
13410 VkPipelineObj pipe(m_device);
13411 pipe.AddColorAttachment();
13412 pipe.AddShader(&vs);
13413 pipe.AddShader(&fs);
13414
13415 VkDescriptorSetObj descriptorSet(m_device);
13416 descriptorSet.AppendDummy();
13417 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13418
13419 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13420
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013421 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013422}
13423
13424TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013425 TEST_DESCRIPTION("Test that an error is produced for location mismatches across "
13426 "the VS->FS interface; This should manifest as a not-written/not-consumed "
13427 "pair, but flushes out broken walking of the interfaces");
Chris Forbese9928822016-02-17 14:44:52 +130013428 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13429 "location 0.0 which is not written by vertex shader");
13430
13431 ASSERT_NO_FATAL_FAILURE(InitState());
13432 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13433
13434 char const *vsSource =
13435 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013436 "\n"
13437 "out block { layout(location=1) float x; } outs;\n"
13438 "out gl_PerVertex {\n"
13439 " vec4 gl_Position;\n"
13440 "};\n"
13441 "void main(){\n"
13442 " outs.x = 0;\n"
13443 " gl_Position = vec4(1);\n"
13444 "}\n";
13445 char const *fsSource =
13446 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013447 "\n"
13448 "in block { layout(location=0) float x; } ins;\n"
13449 "layout(location=0) out vec4 color;\n"
13450 "void main(){\n"
13451 " color = vec4(ins.x);\n"
13452 "}\n";
13453
13454 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13455 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13456
13457 VkPipelineObj pipe(m_device);
13458 pipe.AddColorAttachment();
13459 pipe.AddShader(&vs);
13460 pipe.AddShader(&fs);
13461
13462 VkDescriptorSetObj descriptorSet(m_device);
13463 descriptorSet.AppendDummy();
13464 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13465
13466 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13467
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013468 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013469}
13470
13471TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013472 TEST_DESCRIPTION("Test that an error is produced for component mismatches across the "
13473 "VS->FS interface. It's not enough to have the same set of locations in "
13474 "use; matching is defined in terms of spirv variables.");
Chris Forbese9928822016-02-17 14:44:52 +130013475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13476 "location 0.1 which is not written by vertex shader");
13477
13478 ASSERT_NO_FATAL_FAILURE(InitState());
13479 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13480
13481 char const *vsSource =
13482 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013483 "\n"
13484 "out block { layout(location=0, component=0) float x; } outs;\n"
13485 "out gl_PerVertex {\n"
13486 " vec4 gl_Position;\n"
13487 "};\n"
13488 "void main(){\n"
13489 " outs.x = 0;\n"
13490 " gl_Position = vec4(1);\n"
13491 "}\n";
13492 char const *fsSource =
13493 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013494 "\n"
13495 "in block { layout(location=0, component=1) float x; } ins;\n"
13496 "layout(location=0) out vec4 color;\n"
13497 "void main(){\n"
13498 " color = vec4(ins.x);\n"
13499 "}\n";
13500
13501 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13502 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13503
13504 VkPipelineObj pipe(m_device);
13505 pipe.AddColorAttachment();
13506 pipe.AddShader(&vs);
13507 pipe.AddShader(&fs);
13508
13509 VkDescriptorSetObj descriptorSet(m_device);
13510 descriptorSet.AppendDummy();
13511 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13512
13513 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13514
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013515 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013516}
13517
Karl Schultz6addd812016-02-02 17:17:23 -070013518TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013519 TEST_DESCRIPTION("Test that a warning is produced for a vertex attribute which is "
13520 "not consumed by the vertex shader");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013522 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013523
Chris Forbesde136e02015-05-25 11:13:28 +120013524 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013525 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120013526
13527 VkVertexInputBindingDescription input_binding;
13528 memset(&input_binding, 0, sizeof(input_binding));
13529
13530 VkVertexInputAttributeDescription input_attrib;
13531 memset(&input_attrib, 0, sizeof(input_attrib));
13532 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13533
13534 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013535 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120013536 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013537 "out gl_PerVertex {\n"
13538 " vec4 gl_Position;\n"
13539 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +120013540 "void main(){\n"
13541 " gl_Position = vec4(1);\n"
13542 "}\n";
13543 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013544 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120013545 "\n"
13546 "layout(location=0) out vec4 color;\n"
13547 "void main(){\n"
13548 " color = vec4(1);\n"
13549 "}\n";
13550
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013551 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13552 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120013553
13554 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013555 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120013556 pipe.AddShader(&vs);
13557 pipe.AddShader(&fs);
13558
13559 pipe.AddVertexInputBindings(&input_binding, 1);
13560 pipe.AddVertexInputAttribs(&input_attrib, 1);
13561
Chris Forbesde136e02015-05-25 11:13:28 +120013562 VkDescriptorSetObj descriptorSet(m_device);
13563 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013564 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120013565
Tony Barbour5781e8f2015-08-04 16:23:11 -060013566 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120013567
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013568 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120013569}
13570
Karl Schultz6addd812016-02-02 17:17:23 -070013571TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013572 TEST_DESCRIPTION("Test that a warning is produced for a location mismatch on "
13573 "vertex attributes. This flushes out bad behavior in the interface walker");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013574 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013575 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +130013576
13577 ASSERT_NO_FATAL_FAILURE(InitState());
13578 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13579
13580 VkVertexInputBindingDescription input_binding;
13581 memset(&input_binding, 0, sizeof(input_binding));
13582
13583 VkVertexInputAttributeDescription input_attrib;
13584 memset(&input_attrib, 0, sizeof(input_attrib));
13585 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13586
13587 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013588 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130013589 "\n"
13590 "layout(location=1) in float x;\n"
13591 "out gl_PerVertex {\n"
13592 " vec4 gl_Position;\n"
13593 "};\n"
13594 "void main(){\n"
13595 " gl_Position = vec4(x);\n"
13596 "}\n";
13597 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013598 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130013599 "\n"
13600 "layout(location=0) out vec4 color;\n"
13601 "void main(){\n"
13602 " color = vec4(1);\n"
13603 "}\n";
13604
13605 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13606 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13607
13608 VkPipelineObj pipe(m_device);
13609 pipe.AddColorAttachment();
13610 pipe.AddShader(&vs);
13611 pipe.AddShader(&fs);
13612
13613 pipe.AddVertexInputBindings(&input_binding, 1);
13614 pipe.AddVertexInputAttribs(&input_attrib, 1);
13615
13616 VkDescriptorSetObj descriptorSet(m_device);
13617 descriptorSet.AppendDummy();
13618 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13619
13620 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13621
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013622 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130013623}
13624
Karl Schultz6addd812016-02-02 17:17:23 -070013625TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013626 TEST_DESCRIPTION("Test that an error is produced for a VS input which is not "
13627 "provided by a vertex attribute");
Karl Schultz6addd812016-02-02 17:17:23 -070013628 m_errorMonitor->SetDesiredFailureMsg(
13629 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013630 "VS consumes input at location 0 but not provided");
13631
Chris Forbes62e8e502015-05-25 11:13:29 +120013632 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013633 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120013634
13635 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013636 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120013637 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013638 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -070013639 "out gl_PerVertex {\n"
13640 " vec4 gl_Position;\n"
13641 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120013642 "void main(){\n"
13643 " gl_Position = x;\n"
13644 "}\n";
13645 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013646 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120013647 "\n"
13648 "layout(location=0) out vec4 color;\n"
13649 "void main(){\n"
13650 " color = vec4(1);\n"
13651 "}\n";
13652
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013653 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13654 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120013655
13656 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013657 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120013658 pipe.AddShader(&vs);
13659 pipe.AddShader(&fs);
13660
Chris Forbes62e8e502015-05-25 11:13:29 +120013661 VkDescriptorSetObj descriptorSet(m_device);
13662 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013663 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120013664
Tony Barbour5781e8f2015-08-04 16:23:11 -060013665 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120013666
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013667 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120013668}
13669
Karl Schultz6addd812016-02-02 17:17:23 -070013670TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013671 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the "
13672 "fundamental type (float/int/uint) of an attribute and the "
13673 "VS input that consumes it");
Karl Schultz6addd812016-02-02 17:17:23 -070013674 m_errorMonitor->SetDesiredFailureMsg(
13675 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013676 "location 0 does not match VS input type");
13677
Chris Forbesc97d98e2015-05-25 11:13:31 +120013678 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013679 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013680
13681 VkVertexInputBindingDescription input_binding;
13682 memset(&input_binding, 0, sizeof(input_binding));
13683
13684 VkVertexInputAttributeDescription input_attrib;
13685 memset(&input_attrib, 0, sizeof(input_attrib));
13686 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13687
13688 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013689 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120013690 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013691 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070013692 "out gl_PerVertex {\n"
13693 " vec4 gl_Position;\n"
13694 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120013695 "void main(){\n"
13696 " gl_Position = vec4(x);\n"
13697 "}\n";
13698 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013699 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120013700 "\n"
13701 "layout(location=0) out vec4 color;\n"
13702 "void main(){\n"
13703 " color = vec4(1);\n"
13704 "}\n";
13705
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013706 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13707 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013708
13709 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013710 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013711 pipe.AddShader(&vs);
13712 pipe.AddShader(&fs);
13713
13714 pipe.AddVertexInputBindings(&input_binding, 1);
13715 pipe.AddVertexInputAttribs(&input_attrib, 1);
13716
Chris Forbesc97d98e2015-05-25 11:13:31 +120013717 VkDescriptorSetObj descriptorSet(m_device);
13718 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013719 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013720
Tony Barbour5781e8f2015-08-04 16:23:11 -060013721 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013722
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013723 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013724}
13725
Chris Forbesc68b43c2016-04-06 11:18:47 +120013726TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013727 TEST_DESCRIPTION("Test that an error is produced for a pipeline containing multiple "
13728 "shaders for the same stage");
Chris Forbesc68b43c2016-04-06 11:18:47 +120013729 m_errorMonitor->SetDesiredFailureMsg(
13730 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13731 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
13732
13733 ASSERT_NO_FATAL_FAILURE(InitState());
13734 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13735
13736 char const *vsSource =
13737 "#version 450\n"
13738 "\n"
13739 "out gl_PerVertex {\n"
13740 " vec4 gl_Position;\n"
13741 "};\n"
13742 "void main(){\n"
13743 " gl_Position = vec4(1);\n"
13744 "}\n";
13745 char const *fsSource =
13746 "#version 450\n"
13747 "\n"
13748 "layout(location=0) out vec4 color;\n"
13749 "void main(){\n"
13750 " color = vec4(1);\n"
13751 "}\n";
13752
13753 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13754 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13755
13756 VkPipelineObj pipe(m_device);
13757 pipe.AddColorAttachment();
13758 pipe.AddShader(&vs);
13759 pipe.AddShader(&vs);
13760 pipe.AddShader(&fs);
13761
13762 VkDescriptorSetObj descriptorSet(m_device);
13763 descriptorSet.AppendDummy();
13764 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13765
13766 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13767
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013768 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120013769}
13770
Karl Schultz6addd812016-02-02 17:17:23 -070013771TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013772 TEST_DESCRIPTION("Test that pipeline validation accepts matrices passed "
13773 "as vertex attributes");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013774 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130013775
13776 ASSERT_NO_FATAL_FAILURE(InitState());
13777 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13778
13779 VkVertexInputBindingDescription input_binding;
13780 memset(&input_binding, 0, sizeof(input_binding));
13781
13782 VkVertexInputAttributeDescription input_attribs[2];
13783 memset(input_attribs, 0, sizeof(input_attribs));
13784
13785 for (int i = 0; i < 2; i++) {
13786 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13787 input_attribs[i].location = i;
13788 }
13789
13790 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013791 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013792 "\n"
13793 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070013794 "out gl_PerVertex {\n"
13795 " vec4 gl_Position;\n"
13796 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013797 "void main(){\n"
13798 " gl_Position = x[0] + x[1];\n"
13799 "}\n";
13800 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013801 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013802 "\n"
13803 "layout(location=0) out vec4 color;\n"
13804 "void main(){\n"
13805 " color = vec4(1);\n"
13806 "}\n";
13807
13808 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13809 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13810
13811 VkPipelineObj pipe(m_device);
13812 pipe.AddColorAttachment();
13813 pipe.AddShader(&vs);
13814 pipe.AddShader(&fs);
13815
13816 pipe.AddVertexInputBindings(&input_binding, 1);
13817 pipe.AddVertexInputAttribs(input_attribs, 2);
13818
13819 VkDescriptorSetObj descriptorSet(m_device);
13820 descriptorSet.AppendDummy();
13821 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13822
13823 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13824
13825 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013826 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130013827}
13828
Chris Forbes2682b242015-11-24 11:13:14 +130013829TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
13830{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013831 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130013832
13833 ASSERT_NO_FATAL_FAILURE(InitState());
13834 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13835
13836 VkVertexInputBindingDescription input_binding;
13837 memset(&input_binding, 0, sizeof(input_binding));
13838
13839 VkVertexInputAttributeDescription input_attribs[2];
13840 memset(input_attribs, 0, sizeof(input_attribs));
13841
13842 for (int i = 0; i < 2; i++) {
13843 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13844 input_attribs[i].location = i;
13845 }
13846
13847 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013848 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013849 "\n"
13850 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -070013851 "out gl_PerVertex {\n"
13852 " vec4 gl_Position;\n"
13853 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013854 "void main(){\n"
13855 " gl_Position = x[0] + x[1];\n"
13856 "}\n";
13857 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013858 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013859 "\n"
13860 "layout(location=0) out vec4 color;\n"
13861 "void main(){\n"
13862 " color = vec4(1);\n"
13863 "}\n";
13864
13865 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13866 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13867
13868 VkPipelineObj pipe(m_device);
13869 pipe.AddColorAttachment();
13870 pipe.AddShader(&vs);
13871 pipe.AddShader(&fs);
13872
13873 pipe.AddVertexInputBindings(&input_binding, 1);
13874 pipe.AddVertexInputAttribs(input_attribs, 2);
13875
13876 VkDescriptorSetObj descriptorSet(m_device);
13877 descriptorSet.AppendDummy();
13878 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13879
13880 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13881
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013882 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130013883}
Chris Forbes2682b242015-11-24 11:13:14 +130013884
Chris Forbesbc290ce2016-07-06 12:01:49 +120013885TEST_F(VkLayerTest, CreatePipelineAttribComponents)
13886{
Chris Forbes1cc79542016-07-20 11:13:44 +120013887 TEST_DESCRIPTION("Test that pipeline validation accepts consuming a vertex attribute "
13888 "through multiple VS inputs, each consuming a different subset of the "
13889 "components.");
Chris Forbesbc290ce2016-07-06 12:01:49 +120013890 m_errorMonitor->ExpectSuccess();
13891
13892 ASSERT_NO_FATAL_FAILURE(InitState());
13893 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13894
13895 VkVertexInputBindingDescription input_binding;
13896 memset(&input_binding, 0, sizeof(input_binding));
13897
13898 VkVertexInputAttributeDescription input_attribs[3];
13899 memset(input_attribs, 0, sizeof(input_attribs));
13900
13901 for (int i = 0; i < 3; i++) {
13902 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13903 input_attribs[i].location = i;
13904 }
13905
13906 char const *vsSource =
13907 "#version 450\n"
13908 "\n"
13909 "layout(location=0) in vec4 x;\n"
13910 "layout(location=1) in vec3 y1;\n"
13911 "layout(location=1, component=3) in float y2;\n"
13912 "layout(location=2) in vec4 z;\n"
13913 "out gl_PerVertex {\n"
13914 " vec4 gl_Position;\n"
13915 "};\n"
13916 "void main(){\n"
13917 " gl_Position = x + vec4(y1, y2) + z;\n"
13918 "}\n";
13919 char const *fsSource =
13920 "#version 450\n"
13921 "\n"
13922 "layout(location=0) out vec4 color;\n"
13923 "void main(){\n"
13924 " color = vec4(1);\n"
13925 "}\n";
13926
13927 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13928 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13929
13930 VkPipelineObj pipe(m_device);
13931 pipe.AddColorAttachment();
13932 pipe.AddShader(&vs);
13933 pipe.AddShader(&fs);
13934
13935 pipe.AddVertexInputBindings(&input_binding, 1);
13936 pipe.AddVertexInputAttribs(input_attribs, 3);
13937
13938 VkDescriptorSetObj descriptorSet(m_device);
13939 descriptorSet.AppendDummy();
13940 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13941
13942 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13943
13944 m_errorMonitor->VerifyNotFound();
13945}
13946
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013947TEST_F(VkLayerTest, CreatePipelineSimplePositive)
13948{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013949 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013950
13951 ASSERT_NO_FATAL_FAILURE(InitState());
13952 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13953
13954 char const *vsSource =
13955 "#version 450\n"
13956 "out gl_PerVertex {\n"
13957 " vec4 gl_Position;\n"
13958 "};\n"
13959 "void main(){\n"
13960 " gl_Position = vec4(0);\n"
13961 "}\n";
13962 char const *fsSource =
13963 "#version 450\n"
13964 "\n"
13965 "layout(location=0) out vec4 color;\n"
13966 "void main(){\n"
13967 " color = vec4(1);\n"
13968 "}\n";
13969
13970 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13971 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13972
13973 VkPipelineObj pipe(m_device);
13974 pipe.AddColorAttachment();
13975 pipe.AddShader(&vs);
13976 pipe.AddShader(&fs);
13977
13978 VkDescriptorSetObj descriptorSet(m_device);
13979 descriptorSet.AppendDummy();
13980 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13981
13982 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13983
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013984 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013985}
13986
Chris Forbes912c9192016-04-05 17:50:35 +120013987TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
13988{
Chris Forbes1cc79542016-07-20 11:13:44 +120013989 TEST_DESCRIPTION("Test that pipeline validation accepts the relaxed type matching rules "
13990 "set out in 14.1.3: fundamental type must match, and producer side must "
13991 "have at least as many components");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013992 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +120013993
13994 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
13995
13996 ASSERT_NO_FATAL_FAILURE(InitState());
13997 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13998
13999 char const *vsSource =
14000 "#version 450\n"
14001 "out gl_PerVertex {\n"
14002 " vec4 gl_Position;\n"
14003 "};\n"
14004 "layout(location=0) out vec3 x;\n"
14005 "layout(location=1) out ivec3 y;\n"
14006 "layout(location=2) out vec3 z;\n"
14007 "void main(){\n"
14008 " gl_Position = vec4(0);\n"
14009 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
14010 "}\n";
14011 char const *fsSource =
14012 "#version 450\n"
14013 "\n"
14014 "layout(location=0) out vec4 color;\n"
14015 "layout(location=0) in float x;\n"
14016 "layout(location=1) flat in int y;\n"
14017 "layout(location=2) in vec2 z;\n"
14018 "void main(){\n"
14019 " color = vec4(1 + x + y + z.x);\n"
14020 "}\n";
14021
14022 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14023 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14024
14025 VkPipelineObj pipe(m_device);
14026 pipe.AddColorAttachment();
14027 pipe.AddShader(&vs);
14028 pipe.AddShader(&fs);
14029
14030 VkDescriptorSetObj descriptorSet(m_device);
14031 descriptorSet.AppendDummy();
14032 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14033
Mike Stroyan255e9582016-06-24 09:49:32 -060014034 VkResult err = VK_SUCCESS;
14035 err =
14036 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14037 ASSERT_VK_SUCCESS(err);
14038
Chris Forbes912c9192016-04-05 17:50:35 +120014039
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014040 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +120014041}
14042
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014043TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
14044{
Chris Forbes1cc79542016-07-20 11:13:44 +120014045 TEST_DESCRIPTION("Test that pipeline validation accepts per-vertex variables "
14046 "passed between the TCS and TES stages");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014047 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014048
14049 ASSERT_NO_FATAL_FAILURE(InitState());
14050 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14051
Chris Forbesc1e852d2016-04-04 19:26:42 +120014052 if (!m_device->phy().features().tessellationShader) {
14053 printf("Device does not support tessellation shaders; skipped.\n");
14054 return;
14055 }
14056
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014057 char const *vsSource =
14058 "#version 450\n"
14059 "void main(){}\n";
14060 char const *tcsSource =
14061 "#version 450\n"
14062 "layout(location=0) out int x[];\n"
14063 "layout(vertices=3) out;\n"
14064 "void main(){\n"
14065 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14066 " gl_TessLevelInner[0] = 1;\n"
14067 " x[gl_InvocationID] = gl_InvocationID;\n"
14068 "}\n";
14069 char const *tesSource =
14070 "#version 450\n"
14071 "layout(triangles, equal_spacing, cw) in;\n"
14072 "layout(location=0) in int x[];\n"
14073 "out gl_PerVertex { vec4 gl_Position; };\n"
14074 "void main(){\n"
14075 " gl_Position.xyz = gl_TessCoord;\n"
14076 " gl_Position.w = x[0] + x[1] + x[2];\n"
14077 "}\n";
14078 char const *fsSource =
14079 "#version 450\n"
14080 "layout(location=0) out vec4 color;\n"
14081 "void main(){\n"
14082 " color = vec4(1);\n"
14083 "}\n";
14084
14085 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14086 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14087 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14088 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14089
14090 VkPipelineInputAssemblyStateCreateInfo iasci{
14091 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
14092 nullptr,
14093 0,
14094 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
14095 VK_FALSE};
14096
Chris Forbesb4cacb62016-04-04 19:15:00 +120014097 VkPipelineTessellationStateCreateInfo tsci{
14098 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
14099 nullptr,
14100 0,
14101 3};
14102
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014103 VkPipelineObj pipe(m_device);
14104 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +120014105 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014106 pipe.AddColorAttachment();
14107 pipe.AddShader(&vs);
14108 pipe.AddShader(&tcs);
14109 pipe.AddShader(&tes);
14110 pipe.AddShader(&fs);
14111
14112 VkDescriptorSetObj descriptorSet(m_device);
14113 descriptorSet.AppendDummy();
14114 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14115
14116 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14117
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014118 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014119}
14120
Chris Forbesa0ab8152016-04-20 13:34:27 +120014121TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
14122{
Chris Forbes1cc79542016-07-20 11:13:44 +120014123 TEST_DESCRIPTION("Test that pipeline validation accepts a user-defined "
14124 "interface block passed into the geometry shader. This "
14125 "is interesting because the 'extra' array level is not "
14126 "present on the member type, but on the block instance.");
Chris Forbesa0ab8152016-04-20 13:34:27 +120014127 m_errorMonitor->ExpectSuccess();
14128
14129 ASSERT_NO_FATAL_FAILURE(InitState());
14130 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14131
14132 if (!m_device->phy().features().geometryShader) {
14133 printf("Device does not support geometry shaders; skipped.\n");
14134 return;
14135 }
14136
14137 char const *vsSource =
14138 "#version 450\n"
14139 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
14140 "void main(){\n"
14141 " vs_out.x = vec4(1);\n"
14142 "}\n";
14143 char const *gsSource =
14144 "#version 450\n"
14145 "layout(triangles) in;\n"
14146 "layout(triangle_strip, max_vertices=3) out;\n"
14147 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
14148 "out gl_PerVertex { vec4 gl_Position; };\n"
14149 "void main() {\n"
14150 " gl_Position = gs_in[0].x;\n"
14151 " EmitVertex();\n"
14152 "}\n";
14153 char const *fsSource =
14154 "#version 450\n"
14155 "layout(location=0) out vec4 color;\n"
14156 "void main(){\n"
14157 " color = vec4(1);\n"
14158 "}\n";
14159
14160 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14161 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
14162 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14163
14164 VkPipelineObj pipe(m_device);
14165 pipe.AddColorAttachment();
14166 pipe.AddShader(&vs);
14167 pipe.AddShader(&gs);
14168 pipe.AddShader(&fs);
14169
14170 VkDescriptorSetObj descriptorSet(m_device);
14171 descriptorSet.AppendDummy();
14172 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14173
14174 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14175
14176 m_errorMonitor->VerifyNotFound();
14177}
14178
Chris Forbesa0193bc2016-04-04 19:19:47 +120014179TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
14180{
Chris Forbes1cc79542016-07-20 11:13:44 +120014181 TEST_DESCRIPTION("Test that an error is produced for a variable output from "
14182 "the TCS without the patch decoration, but consumed in the TES "
14183 "with the decoration.");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14185 "is per-vertex in tessellation control shader stage "
14186 "but per-patch in tessellation evaluation shader stage");
14187
14188 ASSERT_NO_FATAL_FAILURE(InitState());
14189 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14190
Chris Forbesc1e852d2016-04-04 19:26:42 +120014191 if (!m_device->phy().features().tessellationShader) {
14192 printf("Device does not support tessellation shaders; skipped.\n");
14193 return;
14194 }
14195
Chris Forbesa0193bc2016-04-04 19:19:47 +120014196 char const *vsSource =
14197 "#version 450\n"
14198 "void main(){}\n";
14199 char const *tcsSource =
14200 "#version 450\n"
14201 "layout(location=0) out int x[];\n"
14202 "layout(vertices=3) out;\n"
14203 "void main(){\n"
14204 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14205 " gl_TessLevelInner[0] = 1;\n"
14206 " x[gl_InvocationID] = gl_InvocationID;\n"
14207 "}\n";
14208 char const *tesSource =
14209 "#version 450\n"
14210 "layout(triangles, equal_spacing, cw) in;\n"
14211 "layout(location=0) patch in int x;\n"
14212 "out gl_PerVertex { vec4 gl_Position; };\n"
14213 "void main(){\n"
14214 " gl_Position.xyz = gl_TessCoord;\n"
14215 " gl_Position.w = x;\n"
14216 "}\n";
14217 char const *fsSource =
14218 "#version 450\n"
14219 "layout(location=0) out vec4 color;\n"
14220 "void main(){\n"
14221 " color = vec4(1);\n"
14222 "}\n";
14223
14224 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14225 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14226 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14227 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14228
14229 VkPipelineInputAssemblyStateCreateInfo iasci{
14230 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
14231 nullptr,
14232 0,
14233 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
14234 VK_FALSE};
14235
14236 VkPipelineTessellationStateCreateInfo tsci{
14237 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
14238 nullptr,
14239 0,
14240 3};
14241
14242 VkPipelineObj pipe(m_device);
14243 pipe.SetInputAssembly(&iasci);
14244 pipe.SetTessellation(&tsci);
14245 pipe.AddColorAttachment();
14246 pipe.AddShader(&vs);
14247 pipe.AddShader(&tcs);
14248 pipe.AddShader(&tes);
14249 pipe.AddShader(&fs);
14250
14251 VkDescriptorSetObj descriptorSet(m_device);
14252 descriptorSet.AppendDummy();
14253 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14254
14255 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14256
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014257 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014258}
14259
Karl Schultz6addd812016-02-02 17:17:23 -070014260TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014261 TEST_DESCRIPTION("Test that an error is produced for a vertex attribute setup where multiple "
14262 "bindings provide the same location");
Karl Schultz6addd812016-02-02 17:17:23 -070014263 m_errorMonitor->SetDesiredFailureMsg(
14264 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014265 "Duplicate vertex input binding descriptions for binding 0");
14266
Chris Forbes280ba2c2015-06-12 11:16:41 +120014267 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014268 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014269
14270 /* Two binding descriptions for binding 0 */
14271 VkVertexInputBindingDescription input_bindings[2];
14272 memset(input_bindings, 0, sizeof(input_bindings));
14273
14274 VkVertexInputAttributeDescription input_attrib;
14275 memset(&input_attrib, 0, sizeof(input_attrib));
14276 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14277
14278 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014279 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120014280 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070014281 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070014282 "out gl_PerVertex {\n"
14283 " vec4 gl_Position;\n"
14284 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120014285 "void main(){\n"
14286 " gl_Position = vec4(x);\n"
14287 "}\n";
14288 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014289 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120014290 "\n"
14291 "layout(location=0) out vec4 color;\n"
14292 "void main(){\n"
14293 " color = vec4(1);\n"
14294 "}\n";
14295
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014296 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14297 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014298
14299 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014300 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014301 pipe.AddShader(&vs);
14302 pipe.AddShader(&fs);
14303
14304 pipe.AddVertexInputBindings(input_bindings, 2);
14305 pipe.AddVertexInputAttribs(&input_attrib, 1);
14306
Chris Forbes280ba2c2015-06-12 11:16:41 +120014307 VkDescriptorSetObj descriptorSet(m_device);
14308 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014309 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014310
Tony Barbour5781e8f2015-08-04 16:23:11 -060014311 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014312
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014313 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014314}
Chris Forbes8f68b562015-05-25 11:13:32 +120014315
Chris Forbes35efec72016-04-21 14:32:08 +120014316TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014317 TEST_DESCRIPTION("Test that pipeline validation accepts basic use of 64bit vertex "
14318 "attributes. This is interesting because they consume multiple "
14319 "locations.");
Chris Forbes35efec72016-04-21 14:32:08 +120014320 m_errorMonitor->ExpectSuccess();
14321
14322 ASSERT_NO_FATAL_FAILURE(InitState());
14323 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14324
Chris Forbes91cf3a82016-06-28 17:51:35 +120014325 if (!m_device->phy().features().shaderFloat64) {
Chris Forbes35efec72016-04-21 14:32:08 +120014326 printf("Device does not support 64bit vertex attributes; skipped.\n");
14327 return;
14328 }
14329
14330 VkVertexInputBindingDescription input_bindings[1];
14331 memset(input_bindings, 0, sizeof(input_bindings));
14332
14333 VkVertexInputAttributeDescription input_attribs[4];
14334 memset(input_attribs, 0, sizeof(input_attribs));
14335 input_attribs[0].location = 0;
14336 input_attribs[0].offset = 0;
14337 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14338 input_attribs[1].location = 2;
14339 input_attribs[1].offset = 32;
14340 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14341 input_attribs[2].location = 4;
14342 input_attribs[2].offset = 64;
14343 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14344 input_attribs[3].location = 6;
14345 input_attribs[3].offset = 96;
14346 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14347
14348 char const *vsSource =
14349 "#version 450\n"
14350 "\n"
14351 "layout(location=0) in dmat4 x;\n"
14352 "out gl_PerVertex {\n"
14353 " vec4 gl_Position;\n"
14354 "};\n"
14355 "void main(){\n"
14356 " gl_Position = vec4(x[0][0]);\n"
14357 "}\n";
14358 char const *fsSource =
14359 "#version 450\n"
14360 "\n"
14361 "layout(location=0) out vec4 color;\n"
14362 "void main(){\n"
14363 " color = vec4(1);\n"
14364 "}\n";
14365
14366 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14367 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14368
14369 VkPipelineObj pipe(m_device);
14370 pipe.AddColorAttachment();
14371 pipe.AddShader(&vs);
14372 pipe.AddShader(&fs);
14373
14374 pipe.AddVertexInputBindings(input_bindings, 1);
14375 pipe.AddVertexInputAttribs(input_attribs, 4);
14376
14377 VkDescriptorSetObj descriptorSet(m_device);
14378 descriptorSet.AppendDummy();
14379 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14380
14381 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14382
14383 m_errorMonitor->VerifyNotFound();
14384}
14385
Karl Schultz6addd812016-02-02 17:17:23 -070014386TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014387 TEST_DESCRIPTION("Test that an error is produced for a FS which does not "
14388 "provide an output for one of the pipeline's color attachments");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014389 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014390 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014391
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014392 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014393
14394 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014395 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014396 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014397 "out gl_PerVertex {\n"
14398 " vec4 gl_Position;\n"
14399 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014400 "void main(){\n"
14401 " gl_Position = vec4(1);\n"
14402 "}\n";
14403 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014404 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014405 "\n"
14406 "void main(){\n"
14407 "}\n";
14408
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014409 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14410 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014411
14412 VkPipelineObj pipe(m_device);
14413 pipe.AddShader(&vs);
14414 pipe.AddShader(&fs);
14415
Chia-I Wu08accc62015-07-07 11:50:03 +080014416 /* set up CB 0, not written */
14417 pipe.AddColorAttachment();
14418 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014419
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014420 VkDescriptorSetObj descriptorSet(m_device);
14421 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014422 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014423
Tony Barbour5781e8f2015-08-04 16:23:11 -060014424 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014425
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014426 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014427}
14428
Karl Schultz6addd812016-02-02 17:17:23 -070014429TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014430 TEST_DESCRIPTION("Test that a warning is produced for a FS which provides a spurious "
14431 "output with no matching attachment");
Karl Schultz6addd812016-02-02 17:17:23 -070014432 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070014433 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014434 "FS writes to output location 1 with no matching attachment");
14435
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014436 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014437
14438 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014439 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014440 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014441 "out gl_PerVertex {\n"
14442 " vec4 gl_Position;\n"
14443 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014444 "void main(){\n"
14445 " gl_Position = vec4(1);\n"
14446 "}\n";
14447 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014448 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014449 "\n"
14450 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -070014451 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014452 "void main(){\n"
14453 " x = vec4(1);\n"
14454 " y = vec4(1);\n"
14455 "}\n";
14456
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014457 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14458 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014459
14460 VkPipelineObj pipe(m_device);
14461 pipe.AddShader(&vs);
14462 pipe.AddShader(&fs);
14463
Chia-I Wu08accc62015-07-07 11:50:03 +080014464 /* set up CB 0, not written */
14465 pipe.AddColorAttachment();
14466 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014467 /* FS writes CB 1, but we don't configure it */
14468
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014469 VkDescriptorSetObj descriptorSet(m_device);
14470 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014471 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014472
Tony Barbour5781e8f2015-08-04 16:23:11 -060014473 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014474
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014475 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014476}
14477
Karl Schultz6addd812016-02-02 17:17:23 -070014478TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014479 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the fundamental "
14480 "type of an FS output variable, and the format of the corresponding attachment");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014482 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014483
Chris Forbesa36d69e2015-05-25 11:13:44 +120014484 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014485
14486 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014487 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120014488 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014489 "out gl_PerVertex {\n"
14490 " vec4 gl_Position;\n"
14491 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120014492 "void main(){\n"
14493 " gl_Position = vec4(1);\n"
14494 "}\n";
14495 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014496 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120014497 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070014498 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +120014499 "void main(){\n"
14500 " x = ivec4(1);\n"
14501 "}\n";
14502
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014503 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14504 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014505
14506 VkPipelineObj pipe(m_device);
14507 pipe.AddShader(&vs);
14508 pipe.AddShader(&fs);
14509
Chia-I Wu08accc62015-07-07 11:50:03 +080014510 /* set up CB 0; type is UNORM by default */
14511 pipe.AddColorAttachment();
14512 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014513
Chris Forbesa36d69e2015-05-25 11:13:44 +120014514 VkDescriptorSetObj descriptorSet(m_device);
14515 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014516 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014517
Tony Barbour5781e8f2015-08-04 16:23:11 -060014518 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014519
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014520 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014521}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014522
Karl Schultz6addd812016-02-02 17:17:23 -070014523TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014524 TEST_DESCRIPTION("Test that an error is produced for a shader consuming a uniform "
14525 "block which has no corresponding binding in the pipeline layout");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014526 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014527 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014528
Chris Forbes556c76c2015-08-14 12:04:59 +120014529 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120014530
14531 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014532 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120014533 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014534 "out gl_PerVertex {\n"
14535 " vec4 gl_Position;\n"
14536 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120014537 "void main(){\n"
14538 " gl_Position = vec4(1);\n"
14539 "}\n";
14540 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014541 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120014542 "\n"
14543 "layout(location=0) out vec4 x;\n"
14544 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
14545 "void main(){\n"
14546 " x = vec4(bar.y);\n"
14547 "}\n";
14548
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014549 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14550 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120014551
Chris Forbes556c76c2015-08-14 12:04:59 +120014552 VkPipelineObj pipe(m_device);
14553 pipe.AddShader(&vs);
14554 pipe.AddShader(&fs);
14555
14556 /* set up CB 0; type is UNORM by default */
14557 pipe.AddColorAttachment();
14558 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14559
14560 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014561 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120014562
14563 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14564
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014565 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120014566}
14567
Chris Forbes5c59e902016-02-26 16:56:09 +130014568TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014569 TEST_DESCRIPTION("Test that an error is produced for a shader consuming push constants "
14570 "which are not provided in the pipeline layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130014571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14572 "not declared in layout");
14573
14574 ASSERT_NO_FATAL_FAILURE(InitState());
14575
14576 char const *vsSource =
14577 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130014578 "\n"
14579 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14580 "out gl_PerVertex {\n"
14581 " vec4 gl_Position;\n"
14582 "};\n"
14583 "void main(){\n"
14584 " gl_Position = vec4(consts.x);\n"
14585 "}\n";
14586 char const *fsSource =
14587 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130014588 "\n"
14589 "layout(location=0) out vec4 x;\n"
14590 "void main(){\n"
14591 " x = vec4(1);\n"
14592 "}\n";
14593
14594 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14595 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14596
14597 VkPipelineObj pipe(m_device);
14598 pipe.AddShader(&vs);
14599 pipe.AddShader(&fs);
14600
14601 /* set up CB 0; type is UNORM by default */
14602 pipe.AddColorAttachment();
14603 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14604
14605 VkDescriptorSetObj descriptorSet(m_device);
14606 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14607
14608 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14609
14610 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014611 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130014612}
14613
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014614TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014615 TEST_DESCRIPTION("Test that an error is produced for a compute pipeline consuming a "
14616 "descriptor which is not provided in the pipeline layout");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014617 m_errorMonitor->SetDesiredFailureMsg(
14618 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14619 "Shader uses descriptor slot 0.0");
14620
14621 ASSERT_NO_FATAL_FAILURE(InitState());
14622
14623 char const *csSource =
14624 "#version 450\n"
14625 "\n"
14626 "layout(local_size_x=1) in;\n"
14627 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14628 "void main(){\n"
14629 " x = vec4(1);\n"
14630 "}\n";
14631
14632 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14633
14634 VkDescriptorSetObj descriptorSet(m_device);
14635 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14636
14637 VkComputePipelineCreateInfo cpci = {
14638 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14639 nullptr, 0, {
14640 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14641 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14642 cs.handle(), "main", nullptr
14643 },
14644 descriptorSet.GetPipelineLayout(),
14645 VK_NULL_HANDLE, -1
14646 };
14647
14648 VkPipeline pipe;
14649 VkResult err = vkCreateComputePipelines(
14650 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14651
14652 m_errorMonitor->VerifyFound();
14653
14654 if (err == VK_SUCCESS) {
14655 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14656 }
14657}
14658
14659TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014660 TEST_DESCRIPTION("Test that pipeline validation accepts a compute pipeline which declares a "
14661 "descriptor-backed resource which is not provided, but the shader does not "
14662 "statically use it. This is interesting because it requires compute pipelines "
14663 "to have a proper descriptor use walk, which they didn't for some time.");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014664 m_errorMonitor->ExpectSuccess();
14665
14666 ASSERT_NO_FATAL_FAILURE(InitState());
14667
14668 char const *csSource =
14669 "#version 450\n"
14670 "\n"
14671 "layout(local_size_x=1) in;\n"
14672 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14673 "void main(){\n"
14674 " // x is not used.\n"
14675 "}\n";
14676
14677 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14678
14679 VkDescriptorSetObj descriptorSet(m_device);
14680 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14681
14682 VkComputePipelineCreateInfo cpci = {
14683 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14684 nullptr, 0, {
14685 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14686 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14687 cs.handle(), "main", nullptr
14688 },
14689 descriptorSet.GetPipelineLayout(),
14690 VK_NULL_HANDLE, -1
14691 };
14692
14693 VkPipeline pipe;
14694 VkResult err = vkCreateComputePipelines(
14695 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14696
14697 m_errorMonitor->VerifyNotFound();
14698
14699 if (err == VK_SUCCESS) {
14700 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14701 }
14702}
14703
Chris Forbes22a9b092016-07-19 14:34:05 +120014704TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014705 TEST_DESCRIPTION("Test that an error is produced for a pipeline consuming a "
14706 "descriptor-backed resource of a mismatched type");
Chris Forbes22a9b092016-07-19 14:34:05 +120014707 m_errorMonitor->SetDesiredFailureMsg(
14708 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14709 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
14710
14711 ASSERT_NO_FATAL_FAILURE(InitState());
14712
14713 VkDescriptorSetLayoutBinding binding = {
14714 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14715 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14716 };
14717 VkDescriptorSetLayoutCreateInfo dslci = {
14718 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14719 0, 1, &binding
14720 };
14721 VkDescriptorSetLayout dsl;
14722 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14723 nullptr, &dsl);
14724 ASSERT_VK_SUCCESS(err);
14725
14726 VkPipelineLayoutCreateInfo plci = {
14727 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14728 0, 1, &dsl, 0, nullptr
14729 };
14730 VkPipelineLayout pl;
14731 err = vkCreatePipelineLayout(m_device->device(), &plci,
14732 nullptr, &pl);
14733 ASSERT_VK_SUCCESS(err);
14734
14735 char const *csSource =
14736 "#version 450\n"
14737 "\n"
14738 "layout(local_size_x=1) in;\n"
14739 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14740 "void main() {\n"
14741 " x.x = 1.0f;\n"
14742 "}\n";
14743 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14744
14745 VkComputePipelineCreateInfo cpci = {
14746 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14747 0, {
14748 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14749 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14750 cs.handle(), "main", nullptr
14751 },
14752 pl, VK_NULL_HANDLE, -1
14753 };
14754
14755 VkPipeline pipe;
14756 err = vkCreateComputePipelines(
14757 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14758
14759 m_errorMonitor->VerifyFound();
14760
14761 if (err == VK_SUCCESS) {
14762 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14763 }
14764
14765 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14766 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14767}
14768
Chris Forbese10a51f2016-07-19 14:42:51 +120014769TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014770 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
14771 "sampler portion of a combined image + sampler");
Chris Forbese10a51f2016-07-19 14:42:51 +120014772 m_errorMonitor->ExpectSuccess();
14773
14774 ASSERT_NO_FATAL_FAILURE(InitState());
14775
14776 VkDescriptorSetLayoutBinding bindings[] = {
14777 {
14778 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14779 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14780 },
14781 {
14782 1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
14783 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14784 },
14785 {
14786 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
14787 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14788 },
14789 };
14790 VkDescriptorSetLayoutCreateInfo dslci = {
14791 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14792 0, 3, bindings
14793 };
14794 VkDescriptorSetLayout dsl;
14795 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14796 nullptr, &dsl);
14797 ASSERT_VK_SUCCESS(err);
14798
14799 VkPipelineLayoutCreateInfo plci = {
14800 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14801 0, 1, &dsl, 0, nullptr
14802 };
14803 VkPipelineLayout pl;
14804 err = vkCreatePipelineLayout(m_device->device(), &plci,
14805 nullptr, &pl);
14806 ASSERT_VK_SUCCESS(err);
14807
14808 char const *csSource =
14809 "#version 450\n"
14810 "\n"
14811 "layout(local_size_x=1) in;\n"
14812 "layout(set=0, binding=0) uniform sampler s;\n"
14813 "layout(set=0, binding=1) uniform texture2D t;\n"
14814 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
14815 "void main() {\n"
14816 " x = texture(sampler2D(t, s), vec2(0));\n"
14817 "}\n";
14818 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14819
14820 VkComputePipelineCreateInfo cpci = {
14821 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14822 0, {
14823 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14824 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14825 cs.handle(), "main", nullptr
14826 },
14827 pl, VK_NULL_HANDLE, -1
14828 };
14829
14830 VkPipeline pipe;
14831 err = vkCreateComputePipelines(
14832 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14833
14834 m_errorMonitor->VerifyNotFound();
14835
14836 if (err == VK_SUCCESS) {
14837 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14838 }
14839
14840 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14841 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14842}
14843
Chris Forbes91c3b2a2016-07-19 14:46:38 +120014844TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014845 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
14846 "image portion of a combined image + sampler");
Chris Forbes91c3b2a2016-07-19 14:46:38 +120014847 m_errorMonitor->ExpectSuccess();
14848
14849 ASSERT_NO_FATAL_FAILURE(InitState());
14850
14851 VkDescriptorSetLayoutBinding bindings[] = {
14852 {
14853 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14854 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14855 },
14856 {
14857 1, VK_DESCRIPTOR_TYPE_SAMPLER,
14858 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14859 },
14860 {
14861 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
14862 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14863 },
14864 };
14865 VkDescriptorSetLayoutCreateInfo dslci = {
14866 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14867 0, 3, bindings
14868 };
14869 VkDescriptorSetLayout dsl;
14870 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14871 nullptr, &dsl);
14872 ASSERT_VK_SUCCESS(err);
14873
14874 VkPipelineLayoutCreateInfo plci = {
14875 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14876 0, 1, &dsl, 0, nullptr
14877 };
14878 VkPipelineLayout pl;
14879 err = vkCreatePipelineLayout(m_device->device(), &plci,
14880 nullptr, &pl);
14881 ASSERT_VK_SUCCESS(err);
14882
14883 char const *csSource =
14884 "#version 450\n"
14885 "\n"
14886 "layout(local_size_x=1) in;\n"
14887 "layout(set=0, binding=0) uniform texture2D t;\n"
14888 "layout(set=0, binding=1) uniform sampler s;\n"
14889 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
14890 "void main() {\n"
14891 " x = texture(sampler2D(t, s), vec2(0));\n"
14892 "}\n";
14893 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14894
14895 VkComputePipelineCreateInfo cpci = {
14896 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14897 0, {
14898 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14899 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14900 cs.handle(), "main", nullptr
14901 },
14902 pl, VK_NULL_HANDLE, -1
14903 };
14904
14905 VkPipeline pipe;
14906 err = vkCreateComputePipelines(
14907 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14908
14909 m_errorMonitor->VerifyNotFound();
14910
14911 if (err == VK_SUCCESS) {
14912 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14913 }
14914
14915 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14916 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14917}
14918
Chris Forbes6a4991a2016-07-19 15:07:32 +120014919TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014920 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming "
14921 "both the sampler and the image of a combined image+sampler "
14922 "but via separate variables");
Chris Forbes6a4991a2016-07-19 15:07:32 +120014923 m_errorMonitor->ExpectSuccess();
14924
14925 ASSERT_NO_FATAL_FAILURE(InitState());
14926
14927 VkDescriptorSetLayoutBinding bindings[] = {
14928 {
14929 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14930 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14931 },
14932 {
14933 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
14934 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14935 },
14936 };
14937 VkDescriptorSetLayoutCreateInfo dslci = {
14938 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14939 0, 2, bindings
14940 };
14941 VkDescriptorSetLayout dsl;
14942 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14943 nullptr, &dsl);
14944 ASSERT_VK_SUCCESS(err);
14945
14946 VkPipelineLayoutCreateInfo plci = {
14947 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14948 0, 1, &dsl, 0, nullptr
14949 };
14950 VkPipelineLayout pl;
14951 err = vkCreatePipelineLayout(m_device->device(), &plci,
14952 nullptr, &pl);
14953 ASSERT_VK_SUCCESS(err);
14954
14955 char const *csSource =
14956 "#version 450\n"
14957 "\n"
14958 "layout(local_size_x=1) in;\n"
14959 "layout(set=0, binding=0) uniform texture2D t;\n"
14960 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
14961 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
14962 "void main() {\n"
14963 " x = texture(sampler2D(t, s), vec2(0));\n"
14964 "}\n";
14965 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14966
14967 VkComputePipelineCreateInfo cpci = {
14968 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14969 0, {
14970 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14971 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14972 cs.handle(), "main", nullptr
14973 },
14974 pl, VK_NULL_HANDLE, -1
14975 };
14976
14977 VkPipeline pipe;
14978 err = vkCreateComputePipelines(
14979 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14980
14981 m_errorMonitor->VerifyNotFound();
14982
14983 if (err == VK_SUCCESS) {
14984 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14985 }
14986
14987 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14988 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14989}
14990
Chris Forbes50020592016-07-27 13:52:41 +120014991TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
14992 TEST_DESCRIPTION("Test that an error is produced when an image view type "
14993 "does not match the dimensionality declared in the shader");
14994
14995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14996 "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
14997
14998 ASSERT_NO_FATAL_FAILURE(InitState());
14999 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15000
15001 char const *vsSource =
15002 "#version 450\n"
15003 "\n"
15004 "out gl_PerVertex { vec4 gl_Position; };\n"
15005 "void main() { gl_Position = vec4(0); }\n";
15006 char const *fsSource =
15007 "#version 450\n"
15008 "\n"
15009 "layout(set=0, binding=0) uniform sampler3D s;\n"
15010 "layout(location=0) out vec4 color;\n"
15011 "void main() {\n"
15012 " color = texture(s, vec3(0));\n"
15013 "}\n";
15014 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15015 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15016
15017 VkPipelineObj pipe(m_device);
15018 pipe.AddShader(&vs);
15019 pipe.AddShader(&fs);
15020 pipe.AddColorAttachment();
15021
15022 VkTextureObj texture(m_device, nullptr);
15023 VkSamplerObj sampler(m_device);
15024
15025 VkDescriptorSetObj descriptorSet(m_device);
15026 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15027 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15028
15029 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15030 ASSERT_VK_SUCCESS(err);
15031
15032 BeginCommandBuffer();
15033
15034 m_commandBuffer->BindPipeline(pipe);
15035 m_commandBuffer->BindDescriptorSet(descriptorSet);
15036
15037 VkViewport viewport = { 0, 0, 16, 16, 0, 1 };
15038 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
15039 VkRect2D scissor = { { 0, 0 }, { 16, 16 } };
15040 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15041
15042 // error produced here.
15043 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15044
15045 m_errorMonitor->VerifyFound();
15046
15047 EndCommandBuffer();
15048}
15049
Chris Forbes5533bfc2016-07-27 14:12:34 +120015050TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
15051 TEST_DESCRIPTION("Test that an error is produced when a multisampled images "
15052 "are consumed via singlesample images types in the shader, or vice versa.");
15053
15054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15055 "requires bound image to have multiple samples");
15056
15057 ASSERT_NO_FATAL_FAILURE(InitState());
15058 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15059
15060 char const *vsSource =
15061 "#version 450\n"
15062 "\n"
15063 "out gl_PerVertex { vec4 gl_Position; };\n"
15064 "void main() { gl_Position = vec4(0); }\n";
15065 char const *fsSource =
15066 "#version 450\n"
15067 "\n"
15068 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15069 "layout(location=0) out vec4 color;\n"
15070 "void main() {\n"
15071 " color = texelFetch(s, ivec2(0), 0);\n"
15072 "}\n";
15073 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15074 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15075
15076 VkPipelineObj pipe(m_device);
15077 pipe.AddShader(&vs);
15078 pipe.AddShader(&fs);
15079 pipe.AddColorAttachment();
15080
15081 VkTextureObj texture(m_device, nullptr);
15082 VkSamplerObj sampler(m_device);
15083
15084 VkDescriptorSetObj descriptorSet(m_device);
15085 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15086 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15087
15088 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15089 ASSERT_VK_SUCCESS(err);
15090
15091 BeginCommandBuffer();
15092
15093 m_commandBuffer->BindPipeline(pipe);
15094 m_commandBuffer->BindDescriptorSet(descriptorSet);
15095
15096 VkViewport viewport = { 0, 0, 16, 16, 0, 1 };
15097 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
15098 VkRect2D scissor = { { 0, 0 }, { 16, 16 } };
15099 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15100
15101 // error produced here.
15102 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15103
15104 m_errorMonitor->VerifyFound();
15105
15106 EndCommandBuffer();
15107}
15108
Mark Lobodzinski209b5292015-09-17 09:44:05 -060015109#endif // SHADER_CHECKER_TESTS
15110
15111#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060015112TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -070015113 m_errorMonitor->SetDesiredFailureMsg(
15114 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015115 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015116
15117 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015118
15119 // Create an image
15120 VkImage image;
15121
Karl Schultz6addd812016-02-02 17:17:23 -070015122 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15123 const int32_t tex_width = 32;
15124 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015125
15126 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015127 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15128 image_create_info.pNext = NULL;
15129 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15130 image_create_info.format = tex_format;
15131 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015132 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070015133 image_create_info.extent.depth = 1;
15134 image_create_info.mipLevels = 1;
15135 image_create_info.arrayLayers = 1;
15136 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15137 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15138 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15139 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015140
15141 // Introduce error by sending down a bogus width extent
15142 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080015143 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015144
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015145 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015146}
15147
Mark Youngc48c4c12016-04-11 14:26:49 -060015148TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
15149 m_errorMonitor->SetDesiredFailureMsg(
15150 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15151 "CreateImage extents is 0 for at least one required dimension");
15152
15153 ASSERT_NO_FATAL_FAILURE(InitState());
15154
15155 // Create an image
15156 VkImage image;
15157
15158 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15159 const int32_t tex_width = 32;
15160 const int32_t tex_height = 32;
15161
15162 VkImageCreateInfo image_create_info = {};
15163 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15164 image_create_info.pNext = NULL;
15165 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15166 image_create_info.format = tex_format;
15167 image_create_info.extent.width = tex_width;
15168 image_create_info.extent.height = tex_height;
15169 image_create_info.extent.depth = 1;
15170 image_create_info.mipLevels = 1;
15171 image_create_info.arrayLayers = 1;
15172 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15173 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15174 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15175 image_create_info.flags = 0;
15176
15177 // Introduce error by sending down a bogus width extent
15178 image_create_info.extent.width = 0;
15179 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15180
15181 m_errorMonitor->VerifyFound();
15182}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060015183#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120015184
Tobin Ehliscde08892015-09-22 10:11:37 -060015185#if IMAGE_TESTS
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015186TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
15187 TEST_DESCRIPTION("Create a render pass with an attachment description "
15188 "format set to VK_FORMAT_UNDEFINED");
15189
15190 ASSERT_NO_FATAL_FAILURE(InitState());
15191 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15192
15193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15194 "format is VK_FORMAT_UNDEFINED");
15195
15196 VkAttachmentReference color_attach = {};
15197 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15198 color_attach.attachment = 0;
15199 VkSubpassDescription subpass = {};
15200 subpass.colorAttachmentCount = 1;
15201 subpass.pColorAttachments = &color_attach;
15202
15203 VkRenderPassCreateInfo rpci = {};
15204 rpci.subpassCount = 1;
15205 rpci.pSubpasses = &subpass;
15206 rpci.attachmentCount = 1;
15207 VkAttachmentDescription attach_desc = {};
15208 attach_desc.format = VK_FORMAT_UNDEFINED;
15209 rpci.pAttachments = &attach_desc;
15210 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15211 VkRenderPass rp;
15212 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15213
15214 m_errorMonitor->VerifyFound();
15215
15216 if (result == VK_SUCCESS) {
15217 vkDestroyRenderPass(m_device->device(), rp, NULL);
15218 }
15219}
15220
Karl Schultz6addd812016-02-02 17:17:23 -070015221TEST_F(VkLayerTest, InvalidImageView) {
15222 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060015223
Karl Schultz6addd812016-02-02 17:17:23 -070015224 m_errorMonitor->SetDesiredFailureMsg(
15225 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015226 "vkCreateImageView called with baseMipLevel 10 ");
15227
Tobin Ehliscde08892015-09-22 10:11:37 -060015228 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060015229
Mike Stroyana3082432015-09-25 13:39:21 -060015230 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015231 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060015232
Karl Schultz6addd812016-02-02 17:17:23 -070015233 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15234 const int32_t tex_width = 32;
15235 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015236
15237 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015238 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15239 image_create_info.pNext = NULL;
15240 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15241 image_create_info.format = tex_format;
15242 image_create_info.extent.width = tex_width;
15243 image_create_info.extent.height = tex_height;
15244 image_create_info.extent.depth = 1;
15245 image_create_info.mipLevels = 1;
15246 image_create_info.arrayLayers = 1;
15247 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15248 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15249 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15250 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015251
Chia-I Wuf7458c52015-10-26 21:10:41 +080015252 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015253 ASSERT_VK_SUCCESS(err);
15254
15255 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015256 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15257 image_view_create_info.image = image;
15258 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15259 image_view_create_info.format = tex_format;
15260 image_view_create_info.subresourceRange.layerCount = 1;
15261 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
15262 image_view_create_info.subresourceRange.levelCount = 1;
15263 image_view_create_info.subresourceRange.aspectMask =
15264 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015265
15266 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070015267 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
15268 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060015269
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015270 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060015271 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015272}
Mike Stroyana3082432015-09-25 13:39:21 -060015273
Mark Youngd339ba32016-05-30 13:28:35 -060015274TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15275 VkResult err;
15276
15277 m_errorMonitor->SetDesiredFailureMsg(
15278 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -060015279 "used without first calling vkBindImageMemory");
Mark Youngd339ba32016-05-30 13:28:35 -060015280
15281 ASSERT_NO_FATAL_FAILURE(InitState());
15282
15283 // Create an image and try to create a view with no memory backing the image
15284 VkImage image;
15285
15286 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15287 const int32_t tex_width = 32;
15288 const int32_t tex_height = 32;
15289
15290 VkImageCreateInfo image_create_info = {};
15291 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15292 image_create_info.pNext = NULL;
15293 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15294 image_create_info.format = tex_format;
15295 image_create_info.extent.width = tex_width;
15296 image_create_info.extent.height = tex_height;
15297 image_create_info.extent.depth = 1;
15298 image_create_info.mipLevels = 1;
15299 image_create_info.arrayLayers = 1;
15300 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15301 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15302 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15303 image_create_info.flags = 0;
15304
15305 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15306 ASSERT_VK_SUCCESS(err);
15307
15308 VkImageViewCreateInfo image_view_create_info = {};
15309 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15310 image_view_create_info.image = image;
15311 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15312 image_view_create_info.format = tex_format;
15313 image_view_create_info.subresourceRange.layerCount = 1;
15314 image_view_create_info.subresourceRange.baseMipLevel = 0;
15315 image_view_create_info.subresourceRange.levelCount = 1;
15316 image_view_create_info.subresourceRange.aspectMask =
15317 VK_IMAGE_ASPECT_COLOR_BIT;
15318
15319 VkImageView view;
15320 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
15321 &view);
15322
15323 m_errorMonitor->VerifyFound();
15324 vkDestroyImage(m_device->device(), image, NULL);
15325 // If last error is success, it still created the view, so delete it.
15326 if (err == VK_SUCCESS) {
15327 vkDestroyImageView(m_device->device(), view, NULL);
15328 }
15329
15330}
15331
Karl Schultz6addd812016-02-02 17:17:23 -070015332TEST_F(VkLayerTest, InvalidImageViewAspect) {
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015333 TEST_DESCRIPTION(
15334 "Create an image and try to create a view with an invalid aspectMask");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070015335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070015336 "vkCreateImageView: Color image "
15337 "formats must have ONLY the "
15338 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015339
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015340 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015341
Karl Schultz6addd812016-02-02 17:17:23 -070015342 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015343 VkImageObj image(m_device);
15344 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT,
15345 VK_IMAGE_TILING_LINEAR, 0);
15346 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015347
15348 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015349 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015350 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015351 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15352 image_view_create_info.format = tex_format;
15353 image_view_create_info.subresourceRange.baseMipLevel = 0;
15354 image_view_create_info.subresourceRange.levelCount = 1;
15355 // Cause an error by setting an invalid image aspect
15356 image_view_create_info.subresourceRange.aspectMask =
15357 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015358
15359 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015360 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015361
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015362 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015363}
15364
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015365TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015366 VkResult err;
15367 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015368
Karl Schultz6addd812016-02-02 17:17:23 -070015369 m_errorMonitor->SetDesiredFailureMsg(
15370 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015371 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015372
Mike Stroyana3082432015-09-25 13:39:21 -060015373 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015374
15375 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015376 VkImage srcImage;
15377 VkImage dstImage;
15378 VkDeviceMemory srcMem;
15379 VkDeviceMemory destMem;
15380 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015381
15382 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015383 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15384 image_create_info.pNext = NULL;
15385 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15386 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15387 image_create_info.extent.width = 32;
15388 image_create_info.extent.height = 32;
15389 image_create_info.extent.depth = 1;
15390 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015391 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015392 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15393 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15394 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15395 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015396
Karl Schultz6addd812016-02-02 17:17:23 -070015397 err =
15398 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015399 ASSERT_VK_SUCCESS(err);
15400
Karl Schultz6addd812016-02-02 17:17:23 -070015401 err =
15402 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015403 ASSERT_VK_SUCCESS(err);
15404
15405 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015406 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015407 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15408 memAlloc.pNext = NULL;
15409 memAlloc.allocationSize = 0;
15410 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015411
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015412 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015413 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015414 pass =
15415 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015416 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015417 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015418 ASSERT_VK_SUCCESS(err);
15419
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015420 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015421 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015422 pass =
15423 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015424 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015425 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015426 ASSERT_VK_SUCCESS(err);
15427
15428 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15429 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015430 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015431 ASSERT_VK_SUCCESS(err);
15432
15433 BeginCommandBuffer();
15434 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015435 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015436 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015437 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015438 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015439 copyRegion.srcOffset.x = 0;
15440 copyRegion.srcOffset.y = 0;
15441 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015442 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015443 copyRegion.dstSubresource.mipLevel = 0;
15444 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015445 // Introduce failure by forcing the dst layerCount to differ from src
15446 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015447 copyRegion.dstOffset.x = 0;
15448 copyRegion.dstOffset.y = 0;
15449 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015450 copyRegion.extent.width = 1;
15451 copyRegion.extent.height = 1;
15452 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015453 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15454 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015455 EndCommandBuffer();
15456
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015457 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015458
Chia-I Wuf7458c52015-10-26 21:10:41 +080015459 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015460 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015461 vkFreeMemory(m_device->device(), srcMem, NULL);
15462 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015463}
15464
Tony Barbourd6673642016-05-05 14:46:39 -060015465TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
15466
15467 TEST_DESCRIPTION("Creating images with unsuported formats ");
15468
15469 ASSERT_NO_FATAL_FAILURE(InitState());
15470 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15471 VkImageObj image(m_device);
15472 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
15473 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
15474 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15475 VK_IMAGE_TILING_OPTIMAL, 0);
15476 ASSERT_TRUE(image.initialized());
15477
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015478 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
15479 VkImageCreateInfo image_create_info;
15480 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15481 image_create_info.pNext = NULL;
15482 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15483 image_create_info.format = VK_FORMAT_UNDEFINED;
15484 image_create_info.extent.width = 32;
15485 image_create_info.extent.height = 32;
15486 image_create_info.extent.depth = 1;
15487 image_create_info.mipLevels = 1;
15488 image_create_info.arrayLayers = 1;
15489 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15490 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15491 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15492 image_create_info.flags = 0;
15493
15494 m_errorMonitor->SetDesiredFailureMsg(
15495 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15496 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
15497
15498 VkImage localImage;
15499 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
15500 m_errorMonitor->VerifyFound();
15501
Tony Barbourd6673642016-05-05 14:46:39 -060015502 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015503 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060015504 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15505 VkFormat format = static_cast<VkFormat>(f);
15506 VkFormatProperties fProps = m_device->format_properties(format);
15507 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
15508 fProps.optimalTilingFeatures == 0) {
15509 unsupported = format;
15510 break;
15511 }
15512 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015513
Tony Barbourd6673642016-05-05 14:46:39 -060015514 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015515 image_create_info.format = unsupported;
Tony Barbourd6673642016-05-05 14:46:39 -060015516 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015517 "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015518
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015519 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060015520 m_errorMonitor->VerifyFound();
15521 }
15522}
15523
15524TEST_F(VkLayerTest, ImageLayerViewTests) {
15525 VkResult ret;
15526 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15527
15528 ASSERT_NO_FATAL_FAILURE(InitState());
15529
15530 VkImageObj image(m_device);
15531 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
15532 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
15533 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15534 VK_IMAGE_TILING_OPTIMAL, 0);
15535 ASSERT_TRUE(image.initialized());
15536
15537 VkImageView imgView;
15538 VkImageViewCreateInfo imgViewInfo = {};
15539 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15540 imgViewInfo.image = image.handle();
15541 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15542 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15543 imgViewInfo.subresourceRange.layerCount = 1;
15544 imgViewInfo.subresourceRange.baseMipLevel = 0;
15545 imgViewInfo.subresourceRange.levelCount = 1;
15546 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15547
15548 m_errorMonitor->SetDesiredFailureMsg(
15549 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15550 "vkCreateImageView called with baseMipLevel");
15551 // View can't have baseMipLevel >= image's mipLevels - Expect
15552 // VIEW_CREATE_ERROR
15553 imgViewInfo.subresourceRange.baseMipLevel = 1;
15554 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15555 m_errorMonitor->VerifyFound();
15556 imgViewInfo.subresourceRange.baseMipLevel = 0;
15557
15558 m_errorMonitor->SetDesiredFailureMsg(
15559 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15560 "vkCreateImageView called with baseArrayLayer");
15561 // View can't have baseArrayLayer >= image's arraySize - Expect
15562 // VIEW_CREATE_ERROR
15563 imgViewInfo.subresourceRange.baseArrayLayer = 1;
15564 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15565 m_errorMonitor->VerifyFound();
15566 imgViewInfo.subresourceRange.baseArrayLayer = 0;
15567
15568 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15569 "vkCreateImageView called with 0 in "
15570 "pCreateInfo->subresourceRange."
15571 "levelCount");
15572 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
15573 imgViewInfo.subresourceRange.levelCount = 0;
15574 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15575 m_errorMonitor->VerifyFound();
15576 imgViewInfo.subresourceRange.levelCount = 1;
15577
15578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15579 "vkCreateImageView called with 0 in "
15580 "pCreateInfo->subresourceRange."
15581 "layerCount");
15582 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
15583 imgViewInfo.subresourceRange.layerCount = 0;
15584 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15585 m_errorMonitor->VerifyFound();
15586 imgViewInfo.subresourceRange.layerCount = 1;
15587
15588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15589 "but both must be color formats");
15590 // Can't use depth format for view into color image - Expect INVALID_FORMAT
15591 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
15592 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15593 m_errorMonitor->VerifyFound();
15594 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15595
15596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15597 "Formats MUST be IDENTICAL unless "
15598 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
15599 "was set on image creation.");
15600 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
15601 // VIEW_CREATE_ERROR
15602 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
15603 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15604 m_errorMonitor->VerifyFound();
15605 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15606
15607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15608 "can support ImageViews with "
15609 "differing formats but they must be "
15610 "in the same compatibility class.");
15611 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
15612 // VIEW_CREATE_ERROR
15613 VkImageCreateInfo mutImgInfo = image.create_info();
15614 VkImage mutImage;
15615 mutImgInfo.format = VK_FORMAT_R8_UINT;
15616 assert(
15617 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
15618 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
15619 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
15620 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15621 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
15622 ASSERT_VK_SUCCESS(ret);
15623 imgViewInfo.image = mutImage;
15624 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15625 m_errorMonitor->VerifyFound();
15626 imgViewInfo.image = image.handle();
15627 vkDestroyImage(m_device->handle(), mutImage, NULL);
15628}
15629
15630TEST_F(VkLayerTest, MiscImageLayerTests) {
15631
15632 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
15633
15634 ASSERT_NO_FATAL_FAILURE(InitState());
15635
15636 VkImageObj image(m_device);
15637 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
15638 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
15639 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15640 VK_IMAGE_TILING_OPTIMAL, 0);
15641 ASSERT_TRUE(image.initialized());
15642
15643 m_errorMonitor->SetDesiredFailureMsg(
15644 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15645 "number of layers in image subresource is zero");
15646 vk_testing::Buffer buffer;
15647 VkMemoryPropertyFlags reqs = 0;
15648 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
15649 VkBufferImageCopy region = {};
15650 region.bufferRowLength = 128;
15651 region.bufferImageHeight = 128;
15652 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15653 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
15654 region.imageSubresource.layerCount = 0;
15655 region.imageExtent.height = 4;
15656 region.imageExtent.width = 4;
15657 region.imageExtent.depth = 1;
15658 m_commandBuffer->BeginCommandBuffer();
15659 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
15660 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
15661 1, &region);
15662 m_errorMonitor->VerifyFound();
15663 region.imageSubresource.layerCount = 1;
15664
15665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15666 "aspectMasks for each region must "
15667 "specify only COLOR or DEPTH or "
15668 "STENCIL");
15669 // Expect MISMATCHED_IMAGE_ASPECT
15670 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
15671 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
15672 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
15673 1, &region);
15674 m_errorMonitor->VerifyFound();
15675 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15676
15677 m_errorMonitor->SetDesiredFailureMsg(
15678 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15679 "If the format of srcImage is a depth, stencil, depth stencil or "
15680 "integer-based format then filter must be VK_FILTER_NEAREST");
15681 // Expect INVALID_FILTER
15682 VkImageObj intImage1(m_device);
15683 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
15684 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
15685 0);
15686 VkImageObj intImage2(m_device);
15687 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
15688 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
15689 0);
15690 VkImageBlit blitRegion = {};
15691 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15692 blitRegion.srcSubresource.baseArrayLayer = 0;
15693 blitRegion.srcSubresource.layerCount = 1;
15694 blitRegion.srcSubresource.mipLevel = 0;
15695 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15696 blitRegion.dstSubresource.baseArrayLayer = 0;
15697 blitRegion.dstSubresource.layerCount = 1;
15698 blitRegion.dstSubresource.mipLevel = 0;
15699
15700 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
15701 intImage1.layout(), intImage2.handle(), intImage2.layout(),
15702 16, &blitRegion, VK_FILTER_LINEAR);
15703 m_errorMonitor->VerifyFound();
15704
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060015705 // Look for NULL-blit warning
15706 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
15707 "Offsets specify a zero-volume area.");
15708 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
15709 intImage1.layout(), intImage2.handle(), intImage2.layout(),
15710 1, &blitRegion, VK_FILTER_LINEAR);
15711 m_errorMonitor->VerifyFound();
15712
Tony Barbourd6673642016-05-05 14:46:39 -060015713 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15714 "called with 0 in ppMemoryBarriers");
15715 VkImageMemoryBarrier img_barrier;
15716 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
15717 img_barrier.pNext = NULL;
15718 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
15719 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
15720 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15721 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15722 img_barrier.image = image.handle();
15723 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15724 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15725 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15726 img_barrier.subresourceRange.baseArrayLayer = 0;
15727 img_barrier.subresourceRange.baseMipLevel = 0;
15728 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
15729 img_barrier.subresourceRange.layerCount = 0;
15730 img_barrier.subresourceRange.levelCount = 1;
15731 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
15732 VK_PIPELINE_STAGE_HOST_BIT,
15733 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
15734 nullptr, 1, &img_barrier);
15735 m_errorMonitor->VerifyFound();
15736 img_barrier.subresourceRange.layerCount = 1;
15737}
15738
15739TEST_F(VkLayerTest, ImageFormatLimits) {
15740
15741 TEST_DESCRIPTION("Exceed the limits of image format ");
15742
Tony Barbour6514a6b2016-08-12 09:37:19 -060015743 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourd6673642016-05-05 14:46:39 -060015744 m_errorMonitor->SetDesiredFailureMsg(
15745 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15746 "CreateImage extents exceed allowable limits for format");
15747 VkImageCreateInfo image_create_info = {};
15748 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15749 image_create_info.pNext = NULL;
15750 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15751 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15752 image_create_info.extent.width = 32;
15753 image_create_info.extent.height = 32;
15754 image_create_info.extent.depth = 1;
15755 image_create_info.mipLevels = 1;
15756 image_create_info.arrayLayers = 1;
15757 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15758 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15759 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15760 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15761 image_create_info.flags = 0;
15762
15763 VkImage nullImg;
15764 VkImageFormatProperties imgFmtProps;
15765 vkGetPhysicalDeviceImageFormatProperties(
15766 gpu(), image_create_info.format, image_create_info.imageType,
15767 image_create_info.tiling, image_create_info.usage,
15768 image_create_info.flags, &imgFmtProps);
15769 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
15770 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15771 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15772 m_errorMonitor->VerifyFound();
15773 image_create_info.extent.depth = 1;
15774
15775 m_errorMonitor->SetDesiredFailureMsg(
15776 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15777 "exceeds allowable maximum supported by format of");
15778 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
15779 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15780 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15781 m_errorMonitor->VerifyFound();
15782 image_create_info.mipLevels = 1;
15783
15784 m_errorMonitor->SetDesiredFailureMsg(
15785 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15786 "exceeds allowable maximum supported by format of");
15787 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
15788 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15789 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15790 m_errorMonitor->VerifyFound();
15791 image_create_info.arrayLayers = 1;
15792
15793 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15794 "is not supported by format");
15795 int samples = imgFmtProps.sampleCounts >> 1;
15796 image_create_info.samples = (VkSampleCountFlagBits)samples;
15797 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15798 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15799 m_errorMonitor->VerifyFound();
15800 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15801
15802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15803 "pCreateInfo->initialLayout, must be "
15804 "VK_IMAGE_LAYOUT_UNDEFINED or "
15805 "VK_IMAGE_LAYOUT_PREINITIALIZED");
15806 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15807 // Expect INVALID_LAYOUT
15808 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15809 m_errorMonitor->VerifyFound();
15810 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15811}
15812
Karl Schultz6addd812016-02-02 17:17:23 -070015813TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060015814 VkResult err;
15815 bool pass;
15816
15817 // Create color images with different format sizes and try to copy between them
15818 m_errorMonitor->SetDesiredFailureMsg(
15819 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15820 "vkCmdCopyImage called with unmatched source and dest image format sizes");
15821
15822 ASSERT_NO_FATAL_FAILURE(InitState());
15823
15824 // Create two images of different types and try to copy between them
15825 VkImage srcImage;
15826 VkImage dstImage;
15827 VkDeviceMemory srcMem;
15828 VkDeviceMemory destMem;
15829 VkMemoryRequirements memReqs;
15830
15831 VkImageCreateInfo image_create_info = {};
15832 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15833 image_create_info.pNext = NULL;
15834 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15835 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15836 image_create_info.extent.width = 32;
15837 image_create_info.extent.height = 32;
15838 image_create_info.extent.depth = 1;
15839 image_create_info.mipLevels = 1;
15840 image_create_info.arrayLayers = 1;
15841 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15842 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15843 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15844 image_create_info.flags = 0;
15845
15846 err =
15847 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
15848 ASSERT_VK_SUCCESS(err);
15849
15850 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15851 // Introduce failure by creating second image with a different-sized format.
15852 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
15853
15854 err =
15855 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
15856 ASSERT_VK_SUCCESS(err);
15857
15858 // Allocate memory
15859 VkMemoryAllocateInfo memAlloc = {};
15860 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15861 memAlloc.pNext = NULL;
15862 memAlloc.allocationSize = 0;
15863 memAlloc.memoryTypeIndex = 0;
15864
15865 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
15866 memAlloc.allocationSize = memReqs.size;
15867 pass =
15868 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
15869 ASSERT_TRUE(pass);
15870 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
15871 ASSERT_VK_SUCCESS(err);
15872
15873 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
15874 memAlloc.allocationSize = memReqs.size;
15875 pass =
15876 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
15877 ASSERT_TRUE(pass);
15878 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
15879 ASSERT_VK_SUCCESS(err);
15880
15881 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15882 ASSERT_VK_SUCCESS(err);
15883 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
15884 ASSERT_VK_SUCCESS(err);
15885
15886 BeginCommandBuffer();
15887 VkImageCopy copyRegion;
15888 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15889 copyRegion.srcSubresource.mipLevel = 0;
15890 copyRegion.srcSubresource.baseArrayLayer = 0;
15891 copyRegion.srcSubresource.layerCount = 0;
15892 copyRegion.srcOffset.x = 0;
15893 copyRegion.srcOffset.y = 0;
15894 copyRegion.srcOffset.z = 0;
15895 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15896 copyRegion.dstSubresource.mipLevel = 0;
15897 copyRegion.dstSubresource.baseArrayLayer = 0;
15898 copyRegion.dstSubresource.layerCount = 0;
15899 copyRegion.dstOffset.x = 0;
15900 copyRegion.dstOffset.y = 0;
15901 copyRegion.dstOffset.z = 0;
15902 copyRegion.extent.width = 1;
15903 copyRegion.extent.height = 1;
15904 copyRegion.extent.depth = 1;
15905 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15906 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
15907 EndCommandBuffer();
15908
15909 m_errorMonitor->VerifyFound();
15910
15911 vkDestroyImage(m_device->device(), srcImage, NULL);
15912 vkDestroyImage(m_device->device(), dstImage, NULL);
15913 vkFreeMemory(m_device->device(), srcMem, NULL);
15914 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015915}
15916
Karl Schultz6addd812016-02-02 17:17:23 -070015917TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
15918 VkResult err;
15919 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015920
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015921 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015922 m_errorMonitor->SetDesiredFailureMsg(
15923 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015924 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015925
Mike Stroyana3082432015-09-25 13:39:21 -060015926 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015927
15928 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015929 VkImage srcImage;
15930 VkImage dstImage;
15931 VkDeviceMemory srcMem;
15932 VkDeviceMemory destMem;
15933 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015934
15935 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015936 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15937 image_create_info.pNext = NULL;
15938 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15939 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15940 image_create_info.extent.width = 32;
15941 image_create_info.extent.height = 32;
15942 image_create_info.extent.depth = 1;
15943 image_create_info.mipLevels = 1;
15944 image_create_info.arrayLayers = 1;
15945 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15946 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15947 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15948 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015949
Karl Schultz6addd812016-02-02 17:17:23 -070015950 err =
15951 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015952 ASSERT_VK_SUCCESS(err);
15953
Karl Schultzbdb75952016-04-19 11:36:49 -060015954 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15955
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015956 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070015957 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015958 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
15959 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015960
Karl Schultz6addd812016-02-02 17:17:23 -070015961 err =
15962 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015963 ASSERT_VK_SUCCESS(err);
15964
15965 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015966 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015967 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15968 memAlloc.pNext = NULL;
15969 memAlloc.allocationSize = 0;
15970 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015971
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015972 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015973 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015974 pass =
15975 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015976 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015977 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015978 ASSERT_VK_SUCCESS(err);
15979
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015980 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015981 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015982 pass =
15983 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015984 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015985 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015986 ASSERT_VK_SUCCESS(err);
15987
15988 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15989 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015990 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015991 ASSERT_VK_SUCCESS(err);
15992
15993 BeginCommandBuffer();
15994 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015995 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015996 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015997 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015998 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015999 copyRegion.srcOffset.x = 0;
16000 copyRegion.srcOffset.y = 0;
16001 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016002 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016003 copyRegion.dstSubresource.mipLevel = 0;
16004 copyRegion.dstSubresource.baseArrayLayer = 0;
16005 copyRegion.dstSubresource.layerCount = 0;
16006 copyRegion.dstOffset.x = 0;
16007 copyRegion.dstOffset.y = 0;
16008 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016009 copyRegion.extent.width = 1;
16010 copyRegion.extent.height = 1;
16011 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016012 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16013 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016014 EndCommandBuffer();
16015
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016016 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016017
Chia-I Wuf7458c52015-10-26 21:10:41 +080016018 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016019 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016020 vkFreeMemory(m_device->device(), srcMem, NULL);
16021 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016022}
16023
Karl Schultz6addd812016-02-02 17:17:23 -070016024TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
16025 VkResult err;
16026 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016027
Karl Schultz6addd812016-02-02 17:17:23 -070016028 m_errorMonitor->SetDesiredFailureMsg(
16029 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016030 "vkCmdResolveImage called with source sample count less than 2.");
16031
Mike Stroyana3082432015-09-25 13:39:21 -060016032 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016033
16034 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070016035 VkImage srcImage;
16036 VkImage dstImage;
16037 VkDeviceMemory srcMem;
16038 VkDeviceMemory destMem;
16039 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016040
16041 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016042 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16043 image_create_info.pNext = NULL;
16044 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16045 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16046 image_create_info.extent.width = 32;
16047 image_create_info.extent.height = 1;
16048 image_create_info.extent.depth = 1;
16049 image_create_info.mipLevels = 1;
16050 image_create_info.arrayLayers = 1;
16051 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16052 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16053 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16054 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016055
Karl Schultz6addd812016-02-02 17:17:23 -070016056 err =
16057 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016058 ASSERT_VK_SUCCESS(err);
16059
Karl Schultz6addd812016-02-02 17:17:23 -070016060 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016061
Karl Schultz6addd812016-02-02 17:17:23 -070016062 err =
16063 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016064 ASSERT_VK_SUCCESS(err);
16065
16066 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016067 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016068 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16069 memAlloc.pNext = NULL;
16070 memAlloc.allocationSize = 0;
16071 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016072
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016073 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016074 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016075 pass =
16076 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016077 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016078 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016079 ASSERT_VK_SUCCESS(err);
16080
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016081 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016082 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016083 pass =
16084 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016085 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016086 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016087 ASSERT_VK_SUCCESS(err);
16088
16089 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16090 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016091 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016092 ASSERT_VK_SUCCESS(err);
16093
16094 BeginCommandBuffer();
16095 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016096 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16097 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016098 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016099 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016100 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016101 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016102 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016103 resolveRegion.srcOffset.x = 0;
16104 resolveRegion.srcOffset.y = 0;
16105 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016106 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016107 resolveRegion.dstSubresource.mipLevel = 0;
16108 resolveRegion.dstSubresource.baseArrayLayer = 0;
16109 resolveRegion.dstSubresource.layerCount = 0;
16110 resolveRegion.dstOffset.x = 0;
16111 resolveRegion.dstOffset.y = 0;
16112 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016113 resolveRegion.extent.width = 1;
16114 resolveRegion.extent.height = 1;
16115 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016116 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16117 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016118 EndCommandBuffer();
16119
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016120 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016121
Chia-I Wuf7458c52015-10-26 21:10:41 +080016122 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016123 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016124 vkFreeMemory(m_device->device(), srcMem, NULL);
16125 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016126}
16127
Karl Schultz6addd812016-02-02 17:17:23 -070016128TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
16129 VkResult err;
16130 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016131
Karl Schultz6addd812016-02-02 17:17:23 -070016132 m_errorMonitor->SetDesiredFailureMsg(
16133 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016134 "vkCmdResolveImage called with dest sample count greater than 1.");
16135
Mike Stroyana3082432015-09-25 13:39:21 -060016136 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016137
Chris Forbesa7530692016-05-08 12:35:39 +120016138 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070016139 VkImage srcImage;
16140 VkImage dstImage;
16141 VkDeviceMemory srcMem;
16142 VkDeviceMemory destMem;
16143 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016144
16145 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016146 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16147 image_create_info.pNext = NULL;
16148 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16149 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16150 image_create_info.extent.width = 32;
16151 image_create_info.extent.height = 1;
16152 image_create_info.extent.depth = 1;
16153 image_create_info.mipLevels = 1;
16154 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120016155 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016156 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16157 // Note: Some implementations expect color attachment usage for any
16158 // multisample surface
16159 image_create_info.usage =
16160 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16161 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016162
Karl Schultz6addd812016-02-02 17:17:23 -070016163 err =
16164 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016165 ASSERT_VK_SUCCESS(err);
16166
Karl Schultz6addd812016-02-02 17:17:23 -070016167 // Note: Some implementations expect color attachment usage for any
16168 // multisample surface
16169 image_create_info.usage =
16170 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016171
Karl Schultz6addd812016-02-02 17:17:23 -070016172 err =
16173 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016174 ASSERT_VK_SUCCESS(err);
16175
16176 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016177 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016178 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16179 memAlloc.pNext = NULL;
16180 memAlloc.allocationSize = 0;
16181 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016182
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016183 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016184 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016185 pass =
16186 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016187 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016188 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016189 ASSERT_VK_SUCCESS(err);
16190
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016191 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016192 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016193 pass =
16194 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016195 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016196 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016197 ASSERT_VK_SUCCESS(err);
16198
16199 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16200 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016201 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016202 ASSERT_VK_SUCCESS(err);
16203
16204 BeginCommandBuffer();
16205 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016206 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16207 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016208 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016209 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016210 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016211 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016212 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016213 resolveRegion.srcOffset.x = 0;
16214 resolveRegion.srcOffset.y = 0;
16215 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016216 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016217 resolveRegion.dstSubresource.mipLevel = 0;
16218 resolveRegion.dstSubresource.baseArrayLayer = 0;
16219 resolveRegion.dstSubresource.layerCount = 0;
16220 resolveRegion.dstOffset.x = 0;
16221 resolveRegion.dstOffset.y = 0;
16222 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016223 resolveRegion.extent.width = 1;
16224 resolveRegion.extent.height = 1;
16225 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016226 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16227 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016228 EndCommandBuffer();
16229
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016230 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016231
Chia-I Wuf7458c52015-10-26 21:10:41 +080016232 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016233 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016234 vkFreeMemory(m_device->device(), srcMem, NULL);
16235 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016236}
16237
Karl Schultz6addd812016-02-02 17:17:23 -070016238TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
16239 VkResult err;
16240 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016241
Karl Schultz6addd812016-02-02 17:17:23 -070016242 m_errorMonitor->SetDesiredFailureMsg(
16243 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016244 "vkCmdResolveImage called with unmatched source and dest formats.");
16245
Mike Stroyana3082432015-09-25 13:39:21 -060016246 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016247
16248 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016249 VkImage srcImage;
16250 VkImage dstImage;
16251 VkDeviceMemory srcMem;
16252 VkDeviceMemory destMem;
16253 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016254
16255 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016256 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16257 image_create_info.pNext = NULL;
16258 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16259 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16260 image_create_info.extent.width = 32;
16261 image_create_info.extent.height = 1;
16262 image_create_info.extent.depth = 1;
16263 image_create_info.mipLevels = 1;
16264 image_create_info.arrayLayers = 1;
16265 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
16266 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16267 // Note: Some implementations expect color attachment usage for any
16268 // multisample surface
16269 image_create_info.usage =
16270 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16271 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016272
Karl Schultz6addd812016-02-02 17:17:23 -070016273 err =
16274 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016275 ASSERT_VK_SUCCESS(err);
16276
Karl Schultz6addd812016-02-02 17:17:23 -070016277 // Set format to something other than source image
16278 image_create_info.format = VK_FORMAT_R32_SFLOAT;
16279 // Note: Some implementations expect color attachment usage for any
16280 // multisample surface
16281 image_create_info.usage =
16282 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16283 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016284
Karl Schultz6addd812016-02-02 17:17:23 -070016285 err =
16286 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016287 ASSERT_VK_SUCCESS(err);
16288
16289 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016290 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016291 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16292 memAlloc.pNext = NULL;
16293 memAlloc.allocationSize = 0;
16294 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016295
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016296 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016297 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016298 pass =
16299 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016300 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016301 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016302 ASSERT_VK_SUCCESS(err);
16303
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016304 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016305 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016306 pass =
16307 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016308 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016309 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016310 ASSERT_VK_SUCCESS(err);
16311
16312 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16313 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016314 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016315 ASSERT_VK_SUCCESS(err);
16316
16317 BeginCommandBuffer();
16318 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016319 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16320 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016321 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016322 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016323 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016324 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016325 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016326 resolveRegion.srcOffset.x = 0;
16327 resolveRegion.srcOffset.y = 0;
16328 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016329 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016330 resolveRegion.dstSubresource.mipLevel = 0;
16331 resolveRegion.dstSubresource.baseArrayLayer = 0;
16332 resolveRegion.dstSubresource.layerCount = 0;
16333 resolveRegion.dstOffset.x = 0;
16334 resolveRegion.dstOffset.y = 0;
16335 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016336 resolveRegion.extent.width = 1;
16337 resolveRegion.extent.height = 1;
16338 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016339 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16340 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016341 EndCommandBuffer();
16342
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016343 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016344
Chia-I Wuf7458c52015-10-26 21:10:41 +080016345 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016346 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016347 vkFreeMemory(m_device->device(), srcMem, NULL);
16348 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016349}
16350
Karl Schultz6addd812016-02-02 17:17:23 -070016351TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
16352 VkResult err;
16353 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016354
Karl Schultz6addd812016-02-02 17:17:23 -070016355 m_errorMonitor->SetDesiredFailureMsg(
16356 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016357 "vkCmdResolveImage called with unmatched source and dest image types.");
16358
Mike Stroyana3082432015-09-25 13:39:21 -060016359 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016360
16361 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016362 VkImage srcImage;
16363 VkImage dstImage;
16364 VkDeviceMemory srcMem;
16365 VkDeviceMemory destMem;
16366 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016367
16368 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016369 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16370 image_create_info.pNext = NULL;
16371 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16372 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16373 image_create_info.extent.width = 32;
16374 image_create_info.extent.height = 1;
16375 image_create_info.extent.depth = 1;
16376 image_create_info.mipLevels = 1;
16377 image_create_info.arrayLayers = 1;
16378 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
16379 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16380 // Note: Some implementations expect color attachment usage for any
16381 // multisample surface
16382 image_create_info.usage =
16383 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16384 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016385
Karl Schultz6addd812016-02-02 17:17:23 -070016386 err =
16387 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016388 ASSERT_VK_SUCCESS(err);
16389
Karl Schultz6addd812016-02-02 17:17:23 -070016390 image_create_info.imageType = VK_IMAGE_TYPE_1D;
16391 // Note: Some implementations expect color attachment usage for any
16392 // multisample surface
16393 image_create_info.usage =
16394 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16395 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016396
Karl Schultz6addd812016-02-02 17:17:23 -070016397 err =
16398 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016399 ASSERT_VK_SUCCESS(err);
16400
16401 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016402 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016403 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16404 memAlloc.pNext = NULL;
16405 memAlloc.allocationSize = 0;
16406 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016407
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016408 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016409 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016410 pass =
16411 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016412 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016413 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016414 ASSERT_VK_SUCCESS(err);
16415
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016416 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016417 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016418 pass =
16419 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016420 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016421 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016422 ASSERT_VK_SUCCESS(err);
16423
16424 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16425 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016426 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016427 ASSERT_VK_SUCCESS(err);
16428
16429 BeginCommandBuffer();
16430 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016431 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16432 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016433 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016434 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016435 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016436 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016437 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016438 resolveRegion.srcOffset.x = 0;
16439 resolveRegion.srcOffset.y = 0;
16440 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016441 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016442 resolveRegion.dstSubresource.mipLevel = 0;
16443 resolveRegion.dstSubresource.baseArrayLayer = 0;
16444 resolveRegion.dstSubresource.layerCount = 0;
16445 resolveRegion.dstOffset.x = 0;
16446 resolveRegion.dstOffset.y = 0;
16447 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016448 resolveRegion.extent.width = 1;
16449 resolveRegion.extent.height = 1;
16450 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016451 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16452 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016453 EndCommandBuffer();
16454
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016455 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016456
Chia-I Wuf7458c52015-10-26 21:10:41 +080016457 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016458 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016459 vkFreeMemory(m_device->device(), srcMem, NULL);
16460 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016461}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016462
Karl Schultz6addd812016-02-02 17:17:23 -070016463TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016464 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070016465 // to using a DS format, then cause it to hit error due to COLOR_BIT not
16466 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016467 // The image format check comes 2nd in validation so we trigger it first,
16468 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070016469 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016470
Karl Schultz6addd812016-02-02 17:17:23 -070016471 m_errorMonitor->SetDesiredFailureMsg(
16472 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016473 "Combination depth/stencil image formats can have only the ");
16474
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016475 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016476
Chia-I Wu1b99bb22015-10-27 19:25:11 +080016477 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016478 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16479 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016480
16481 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016482 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16483 ds_pool_ci.pNext = NULL;
16484 ds_pool_ci.maxSets = 1;
16485 ds_pool_ci.poolSizeCount = 1;
16486 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016487
16488 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070016489 err =
16490 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016491 ASSERT_VK_SUCCESS(err);
16492
16493 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016494 dsl_binding.binding = 0;
16495 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16496 dsl_binding.descriptorCount = 1;
16497 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16498 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016499
16500 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016501 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16502 ds_layout_ci.pNext = NULL;
16503 ds_layout_ci.bindingCount = 1;
16504 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016505 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070016506 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
16507 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016508 ASSERT_VK_SUCCESS(err);
16509
16510 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016511 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080016512 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070016513 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016514 alloc_info.descriptorPool = ds_pool;
16515 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070016516 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
16517 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016518 ASSERT_VK_SUCCESS(err);
16519
Karl Schultz6addd812016-02-02 17:17:23 -070016520 VkImage image_bad;
16521 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016522 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060016523 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016524 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070016525 const int32_t tex_width = 32;
16526 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016527
16528 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016529 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16530 image_create_info.pNext = NULL;
16531 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16532 image_create_info.format = tex_format_bad;
16533 image_create_info.extent.width = tex_width;
16534 image_create_info.extent.height = tex_height;
16535 image_create_info.extent.depth = 1;
16536 image_create_info.mipLevels = 1;
16537 image_create_info.arrayLayers = 1;
16538 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16539 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16540 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
16541 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
16542 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016543
Karl Schultz6addd812016-02-02 17:17:23 -070016544 err =
16545 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016546 ASSERT_VK_SUCCESS(err);
16547 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070016548 image_create_info.usage =
16549 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16550 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
16551 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016552 ASSERT_VK_SUCCESS(err);
16553
16554 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016555 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16556 image_view_create_info.image = image_bad;
16557 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16558 image_view_create_info.format = tex_format_bad;
16559 image_view_create_info.subresourceRange.baseArrayLayer = 0;
16560 image_view_create_info.subresourceRange.baseMipLevel = 0;
16561 image_view_create_info.subresourceRange.layerCount = 1;
16562 image_view_create_info.subresourceRange.levelCount = 1;
16563 image_view_create_info.subresourceRange.aspectMask =
16564 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016565
16566 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070016567 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
16568 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016569
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016570 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016571
Chia-I Wuf7458c52015-10-26 21:10:41 +080016572 vkDestroyImage(m_device->device(), image_bad, NULL);
16573 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016574 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16575 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016576}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016577
16578TEST_F(VkLayerTest, ClearImageErrors) {
16579 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
16580 "ClearDepthStencilImage with a color image.");
16581
16582 ASSERT_NO_FATAL_FAILURE(InitState());
16583 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16584
16585 // Renderpass is started here so end it as Clear cmds can't be in renderpass
16586 BeginCommandBuffer();
16587 m_commandBuffer->EndRenderPass();
16588
16589 // Color image
16590 VkClearColorValue clear_color;
16591 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
16592 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
16593 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
16594 const int32_t img_width = 32;
16595 const int32_t img_height = 32;
16596 VkImageCreateInfo image_create_info = {};
16597 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16598 image_create_info.pNext = NULL;
16599 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16600 image_create_info.format = color_format;
16601 image_create_info.extent.width = img_width;
16602 image_create_info.extent.height = img_height;
16603 image_create_info.extent.depth = 1;
16604 image_create_info.mipLevels = 1;
16605 image_create_info.arrayLayers = 1;
16606 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16607 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16608 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16609
16610 vk_testing::Image color_image;
16611 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info,
16612 reqs);
16613
16614 const VkImageSubresourceRange color_range =
16615 vk_testing::Image::subresource_range(image_create_info,
16616 VK_IMAGE_ASPECT_COLOR_BIT);
16617
16618 // Depth/Stencil image
16619 VkClearDepthStencilValue clear_value = {0};
16620 reqs = 0; // don't need HOST_VISIBLE DS image
16621 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
16622 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
16623 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
16624 ds_image_create_info.extent.width = 64;
16625 ds_image_create_info.extent.height = 64;
16626 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16627 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
16628
16629 vk_testing::Image ds_image;
16630 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info,
16631 reqs);
16632
16633 const VkImageSubresourceRange ds_range =
16634 vk_testing::Image::subresource_range(ds_image_create_info,
16635 VK_IMAGE_ASPECT_DEPTH_BIT);
16636
16637 m_errorMonitor->SetDesiredFailureMsg(
16638 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16639 "vkCmdClearColorImage called with depth/stencil image.");
16640
16641 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
16642 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
16643 &color_range);
16644
16645 m_errorMonitor->VerifyFound();
16646
Tony Barbour26434b92016-06-02 09:43:50 -060016647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16648 "vkCmdClearColorImage called with "
16649 "image created without "
16650 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
16651
16652 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
16653 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
16654 &color_range);
16655
16656 m_errorMonitor->VerifyFound();
16657
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016658 // Call CmdClearDepthStencilImage with color image
16659 m_errorMonitor->SetDesiredFailureMsg(
16660 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16661 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
16662
16663 vkCmdClearDepthStencilImage(
16664 m_commandBuffer->GetBufferHandle(), color_image.handle(),
16665 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
16666 &ds_range);
16667
16668 m_errorMonitor->VerifyFound();
16669}
Tobin Ehliscde08892015-09-22 10:11:37 -060016670#endif // IMAGE_TESTS
16671
Cody Northrop1242dfd2016-07-13 17:24:59 -060016672#if defined(ANDROID) && defined(VALIDATION_APK)
16673static bool initialized = false;
16674static bool active = false;
16675
16676// Convert Intents to argv
16677// Ported from Hologram sample, only difference is flexible key
16678std::vector<std::string> get_args(android_app &app, const char* intent_extra_data_key)
16679{
16680 std::vector<std::string> args;
16681 JavaVM &vm = *app.activity->vm;
16682 JNIEnv *p_env;
16683 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK)
16684 return args;
16685
16686 JNIEnv &env = *p_env;
16687 jobject activity = app.activity->clazz;
16688 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity),
16689 "getIntent", "()Landroid/content/Intent;");
16690 jobject intent = env.CallObjectMethod(activity, get_intent_method);
16691 jmethodID get_string_extra_method = env.GetMethodID(env.GetObjectClass(intent),
16692 "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
16693 jvalue get_string_extra_args;
16694 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
16695 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent,
16696 get_string_extra_method, &get_string_extra_args));
16697
16698 std::string args_str;
16699 if (extra_str) {
16700 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
16701 args_str = extra_utf;
16702 env.ReleaseStringUTFChars(extra_str, extra_utf);
16703 env.DeleteLocalRef(extra_str);
16704 }
16705
16706 env.DeleteLocalRef(get_string_extra_args.l);
16707 env.DeleteLocalRef(intent);
16708 vm.DetachCurrentThread();
16709
16710 // split args_str
16711 std::stringstream ss(args_str);
16712 std::string arg;
16713 while (std::getline(ss, arg, ' ')) {
16714 if (!arg.empty())
16715 args.push_back(arg);
16716 }
16717
16718 return args;
16719}
16720
16721
16722static int32_t processInput(struct android_app* app, AInputEvent* event) {
16723 return 0;
16724}
16725
16726static void processCommand(struct android_app* app, int32_t cmd) {
16727 switch(cmd) {
16728 case APP_CMD_INIT_WINDOW: {
16729 if (app->window) {
16730 initialized = true;
16731 }
16732 break;
16733 }
16734 case APP_CMD_GAINED_FOCUS: {
16735 active = true;
16736 break;
16737 }
16738 case APP_CMD_LOST_FOCUS: {
16739 active = false;
16740 break;
16741 }
16742 }
16743}
16744
16745void android_main(struct android_app *app)
16746{
16747 app_dummy();
16748
16749 const char* appTag = "VulkanLayerValidationTests";
16750
16751 int vulkanSupport = InitVulkan();
16752 if (vulkanSupport == 0) {
16753 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
16754 return;
16755 }
16756
16757 app->onAppCmd = processCommand;
16758 app->onInputEvent = processInput;
16759
16760 while(1) {
16761 int events;
16762 struct android_poll_source* source;
16763 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void**)&source) >= 0) {
16764 if (source) {
16765 source->process(app, source);
16766 }
16767
16768 if (app->destroyRequested != 0) {
16769 VkTestFramework::Finish();
16770 return;
16771 }
16772 }
16773
16774 if (initialized && active) {
16775 // Use the following key to send arguments to gtest, i.e.
16776 // --es args "--gtest_filter=-VkLayerTest.foo"
16777 const char key[] = "args";
16778 std::vector<std::string> args = get_args(*app, key);
16779
16780 std::string filter = "";
16781 if (args.size() > 0) {
16782 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
16783 filter += args[0];
16784 } else {
16785 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
16786 }
16787
16788 int argc = 2;
16789 char *argv[] = { (char*)"foo", (char*)filter.c_str() };
16790 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
16791
16792 // Route output to files until we can override the gtest output
16793 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
16794 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
16795
16796 ::testing::InitGoogleTest(&argc, argv);
16797 VkTestFramework::InitArgs(&argc, argv);
16798 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
16799
16800 int result = RUN_ALL_TESTS();
16801
16802 if (result != 0) {
16803 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
16804 } else {
16805 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
16806 }
16807
16808 VkTestFramework::Finish();
16809
16810 fclose(stdout);
16811 fclose(stderr);
16812
16813 ANativeActivity_finish(app->activity);
16814
16815 return;
16816 }
16817 }
16818}
16819#endif
16820
Tony Barbour300a6082015-04-07 13:44:53 -060016821int main(int argc, char **argv) {
16822 int result;
16823
Cody Northrop8e54a402016-03-08 22:25:52 -070016824#ifdef ANDROID
16825 int vulkanSupport = InitVulkan();
16826 if (vulkanSupport == 0)
16827 return 1;
16828#endif
16829
Tony Barbour300a6082015-04-07 13:44:53 -060016830 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060016831 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060016832
16833 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
16834
16835 result = RUN_ALL_TESTS();
16836
Tony Barbour6918cd52015-04-09 12:58:51 -060016837 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060016838 return result;
16839}