blob: 9933e5ea06f918a21b542a65a43720314153a6b4 [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}
Dustin Gravesffa90fa2016-05-06 11:20:38 -06001671#endif // PARAMETER_VALIDATION_TESTS
1672
Tobin Ehlis0788f522015-05-26 16:11:58 -06001673#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001674#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001675TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001676{
1677 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001678 VkFenceCreateInfo fenceInfo = {};
1679 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1680 fenceInfo.pNext = NULL;
1681 fenceInfo.flags = 0;
1682
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001684
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001685 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001686
1687 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1688 vk_testing::Buffer buffer;
1689 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001690
Tony Barbourfe3351b2015-07-28 10:17:20 -06001691 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001692 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001693 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001694
1695 testFence.init(*m_device, fenceInfo);
1696
1697 // Bypass framework since it does the waits automatically
1698 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001699 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001700 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1701 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001702 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001703 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001704 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001705 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001706 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001707 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001708 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001709
1710 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001711 ASSERT_VK_SUCCESS( err );
1712
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001713 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001714 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001715
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001716 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001717}
1718
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001719TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001720{
1721 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001722 VkFenceCreateInfo fenceInfo = {};
1723 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1724 fenceInfo.pNext = NULL;
1725 fenceInfo.flags = 0;
1726
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001727 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001728
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001729 ASSERT_NO_FATAL_FAILURE(InitState());
1730 ASSERT_NO_FATAL_FAILURE(InitViewport());
1731 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1732
Tony Barbourfe3351b2015-07-28 10:17:20 -06001733 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001734 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001735 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001736
1737 testFence.init(*m_device, fenceInfo);
1738
1739 // Bypass framework since it does the waits automatically
1740 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001741 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001742 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1743 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001744 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001745 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001746 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001747 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001748 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001749 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001750 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001751
1752 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001753 ASSERT_VK_SUCCESS( err );
1754
Jon Ashburnf19916e2016-01-11 13:12:43 -07001755 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001756 VkCommandBufferBeginInfo info = {};
1757 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1758 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001759 info.renderPass = VK_NULL_HANDLE;
1760 info.subpass = 0;
1761 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001762 info.occlusionQueryEnable = VK_FALSE;
1763 info.queryFlags = 0;
1764 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001765
1766 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001767 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001768
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001769 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001770}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001771#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001772
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001773// This is a positive test. No failures are expected.
1774TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
1775 VkResult err;
1776 bool pass;
1777
1778 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
1779 "the buffer, create an image, and bind the same memory to "
1780 "it");
1781
1782 m_errorMonitor->ExpectSuccess();
1783
1784 ASSERT_NO_FATAL_FAILURE(InitState());
1785
1786 VkBuffer buffer;
1787 VkImage image;
1788 VkDeviceMemory mem;
1789 VkMemoryRequirements mem_reqs;
1790
1791 VkBufferCreateInfo buf_info = {};
1792 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1793 buf_info.pNext = NULL;
1794 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1795 buf_info.size = 256;
1796 buf_info.queueFamilyIndexCount = 0;
1797 buf_info.pQueueFamilyIndices = NULL;
1798 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1799 buf_info.flags = 0;
1800 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1801 ASSERT_VK_SUCCESS(err);
1802
1803 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1804
1805 VkMemoryAllocateInfo alloc_info = {};
1806 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1807 alloc_info.pNext = NULL;
1808 alloc_info.memoryTypeIndex = 0;
1809
1810 // Ensure memory is big enough for both bindings
1811 alloc_info.allocationSize = 0x10000;
1812
1813 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1814 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1815 if (!pass) {
1816 vkDestroyBuffer(m_device->device(), buffer, NULL);
1817 return;
1818 }
1819
1820 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1821 ASSERT_VK_SUCCESS(err);
1822
1823 uint8_t *pData;
1824 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1825 (void **)&pData);
1826 ASSERT_VK_SUCCESS(err);
1827
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001828 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001829
1830 vkUnmapMemory(m_device->device(), mem);
1831
1832 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1833 ASSERT_VK_SUCCESS(err);
1834
1835 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1836 // memory. In fact, it was never used by the GPU.
1837 // Just be be sure, wait for idle.
1838 vkDestroyBuffer(m_device->device(), buffer, NULL);
1839 vkDeviceWaitIdle(m_device->device());
1840
1841 VkImageCreateInfo image_create_info = {};
1842 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1843 image_create_info.pNext = NULL;
1844 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1845 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1846 image_create_info.extent.width = 64;
1847 image_create_info.extent.height = 64;
1848 image_create_info.extent.depth = 1;
1849 image_create_info.mipLevels = 1;
1850 image_create_info.arrayLayers = 1;
1851 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1852 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1853 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1854 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1855 image_create_info.queueFamilyIndexCount = 0;
1856 image_create_info.pQueueFamilyIndices = NULL;
1857 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1858 image_create_info.flags = 0;
1859
1860 VkMemoryAllocateInfo mem_alloc = {};
1861 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1862 mem_alloc.pNext = NULL;
1863 mem_alloc.allocationSize = 0;
1864 mem_alloc.memoryTypeIndex = 0;
1865
1866 /* Create a mappable image. It will be the texture if linear images are ok
1867 * to be textures or it will be the staging image if they are not.
1868 */
1869 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1870 ASSERT_VK_SUCCESS(err);
1871
1872 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1873
1874 mem_alloc.allocationSize = mem_reqs.size;
1875
1876 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
1877 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1878 if (!pass) {
1879 vkDestroyImage(m_device->device(), image, NULL);
1880 return;
1881 }
1882
Tobin Ehlis077ded32016-05-12 17:39:13 -06001883 // VALIDATION FAILURE:
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001884 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1885 ASSERT_VK_SUCCESS(err);
1886
1887 m_errorMonitor->VerifyNotFound();
1888
Tony Barbourdf4c0042016-06-01 15:55:43 -06001889 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001890 vkDestroyBuffer(m_device->device(), buffer, NULL);
1891 vkDestroyImage(m_device->device(), image, NULL);
1892}
1893
Tobin Ehlisf11be982016-05-11 13:52:53 -06001894TEST_F(VkLayerTest, InvalidMemoryAliasing) {
1895 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
1896 "buffer and image to memory such that they will alias.");
1897 VkResult err;
1898 bool pass;
1899 ASSERT_NO_FATAL_FAILURE(InitState());
1900
Tobin Ehlis077ded32016-05-12 17:39:13 -06001901 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001902 VkImage image;
1903 VkDeviceMemory mem; // buffer will be bound first
1904 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001905 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001906
1907 VkBufferCreateInfo buf_info = {};
1908 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1909 buf_info.pNext = NULL;
1910 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1911 buf_info.size = 256;
1912 buf_info.queueFamilyIndexCount = 0;
1913 buf_info.pQueueFamilyIndices = NULL;
1914 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1915 buf_info.flags = 0;
1916 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1917 ASSERT_VK_SUCCESS(err);
1918
Tobin Ehlis077ded32016-05-12 17:39:13 -06001919 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001920
1921 VkImageCreateInfo image_create_info = {};
1922 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1923 image_create_info.pNext = NULL;
1924 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1925 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1926 image_create_info.extent.width = 64;
1927 image_create_info.extent.height = 64;
1928 image_create_info.extent.depth = 1;
1929 image_create_info.mipLevels = 1;
1930 image_create_info.arrayLayers = 1;
1931 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1932 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1933 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1934 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1935 image_create_info.queueFamilyIndexCount = 0;
1936 image_create_info.pQueueFamilyIndices = NULL;
1937 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1938 image_create_info.flags = 0;
1939
Tobin Ehlisf11be982016-05-11 13:52:53 -06001940 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1941 ASSERT_VK_SUCCESS(err);
1942
Tobin Ehlis077ded32016-05-12 17:39:13 -06001943 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1944
1945 VkMemoryAllocateInfo alloc_info = {};
1946 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1947 alloc_info.pNext = NULL;
1948 alloc_info.memoryTypeIndex = 0;
1949 // Ensure memory is big enough for both bindings
1950 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
1951 pass = m_device->phy().set_memory_type(
1952 buff_mem_reqs.memoryTypeBits | img_mem_reqs.memoryTypeBits, &alloc_info,
1953 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001954 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001955 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001956 vkDestroyImage(m_device->device(), image, NULL);
1957 return;
1958 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001959 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1960 ASSERT_VK_SUCCESS(err);
1961 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1962 ASSERT_VK_SUCCESS(err);
1963
Tobin Ehlisf11be982016-05-11 13:52:53 -06001964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1965 " is aliased with buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001966 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001967 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1968 m_errorMonitor->VerifyFound();
1969
1970 // Now correctly bind image to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001971 // aliasing buffer2
1972 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1973 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001974 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1975 ASSERT_VK_SUCCESS(err);
1976 err = vkBindImageMemory(m_device->device(), image, mem_img, 0);
1977 ASSERT_VK_SUCCESS(err);
1978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1979 " is aliased with image 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001980 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001981 m_errorMonitor->VerifyFound();
1982
1983 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001984 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001985 vkDestroyImage(m_device->device(), image, NULL);
1986 vkFreeMemory(m_device->device(), mem, NULL);
1987 vkFreeMemory(m_device->device(), mem_img, NULL);
1988}
1989
Tobin Ehlis35372522016-05-12 08:32:31 -06001990TEST_F(VkLayerTest, InvalidMemoryMapping) {
1991 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1992 VkResult err;
1993 bool pass;
1994 ASSERT_NO_FATAL_FAILURE(InitState());
1995
1996 VkBuffer buffer;
1997 VkDeviceMemory mem;
1998 VkMemoryRequirements mem_reqs;
1999
2000 VkBufferCreateInfo buf_info = {};
2001 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2002 buf_info.pNext = NULL;
2003 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2004 buf_info.size = 256;
2005 buf_info.queueFamilyIndexCount = 0;
2006 buf_info.pQueueFamilyIndices = NULL;
2007 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2008 buf_info.flags = 0;
2009 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
2010 ASSERT_VK_SUCCESS(err);
2011
2012 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
2013 VkMemoryAllocateInfo alloc_info = {};
2014 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2015 alloc_info.pNext = NULL;
2016 alloc_info.memoryTypeIndex = 0;
2017
2018 // Ensure memory is big enough for both bindings
2019 static const VkDeviceSize allocation_size = 0x10000;
2020 alloc_info.allocationSize = allocation_size;
2021 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2022 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2023 if (!pass) {
2024 vkDestroyBuffer(m_device->device(), buffer, NULL);
2025 return;
2026 }
2027 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2028 ASSERT_VK_SUCCESS(err);
2029
2030 uint8_t *pData;
2031 // Attempt to map memory size 0 is invalid
2032 m_errorMonitor->SetDesiredFailureMsg(
2033 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2034 "VkMapMemory: Attempting to map memory range of size zero");
2035 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
2036 m_errorMonitor->VerifyFound();
2037 // Map memory twice
2038 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2039 (void **)&pData);
2040 ASSERT_VK_SUCCESS(err);
2041 m_errorMonitor->SetDesiredFailureMsg(
2042 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2043 "VkMapMemory: Attempting to map memory on an already-mapped object ");
2044 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2045 (void **)&pData);
2046 m_errorMonitor->VerifyFound();
2047
2048 // Unmap the memory to avoid re-map error
2049 vkUnmapMemory(m_device->device(), mem);
2050 // overstep allocation with VK_WHOLE_SIZE
2051 m_errorMonitor->SetDesiredFailureMsg(
2052 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2053 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
2054 err = vkMapMemory(m_device->device(), mem, allocation_size + 1,
2055 VK_WHOLE_SIZE, 0, (void **)&pData);
2056 m_errorMonitor->VerifyFound();
2057 // overstep allocation w/o VK_WHOLE_SIZE
2058 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2059 " oversteps total array size 0x");
2060 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0,
2061 (void **)&pData);
2062 m_errorMonitor->VerifyFound();
2063 // Now error due to unmapping memory that's not mapped
2064 m_errorMonitor->SetDesiredFailureMsg(
2065 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2066 "Unmapping Memory without memory being mapped: ");
2067 vkUnmapMemory(m_device->device(), mem);
2068 m_errorMonitor->VerifyFound();
2069 // Now map memory and cause errors due to flushing invalid ranges
2070 err = vkMapMemory(m_device->device(), mem, 16, VK_WHOLE_SIZE, 0,
2071 (void **)&pData);
2072 ASSERT_VK_SUCCESS(err);
2073 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12002074 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06002075 mmr.memory = mem;
2076 mmr.offset = 15; // Error b/c offset less than offset of mapped mem
2077 m_errorMonitor->SetDesiredFailureMsg(
2078 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2079 ") is less than Memory Object's offset (");
2080 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2081 m_errorMonitor->VerifyFound();
2082 // Now flush range that oversteps mapped range
2083 vkUnmapMemory(m_device->device(), mem);
2084 err = vkMapMemory(m_device->device(), mem, 0, 256, 0, (void **)&pData);
2085 ASSERT_VK_SUCCESS(err);
2086 mmr.offset = 16;
2087 mmr.size = 256; // flushing bounds (272) exceed mapped bounds (256)
2088 m_errorMonitor->SetDesiredFailureMsg(
2089 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2090 ") exceeds the Memory Object's upper-bound (");
2091 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2092 m_errorMonitor->VerifyFound();
2093
2094 pass =
2095 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2096 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
2097 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
2098 if (!pass) {
2099 vkFreeMemory(m_device->device(), mem, NULL);
2100 vkDestroyBuffer(m_device->device(), buffer, NULL);
2101 return;
2102 }
2103 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
2104 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
2105
2106 vkDestroyBuffer(m_device->device(), buffer, NULL);
2107 vkFreeMemory(m_device->device(), mem, NULL);
2108}
2109
Ian Elliott1c32c772016-04-28 14:47:13 -06002110TEST_F(VkLayerTest, EnableWsiBeforeUse) {
2111 VkResult err;
2112 bool pass;
2113
Ian Elliott489eec02016-05-05 14:12:44 -06002114// FIXME: After we turn on this code for non-Linux platforms, uncomment the
2115// following declaration (which is temporarily being moved below):
2116// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002117 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2118 VkSwapchainCreateInfoKHR swapchain_create_info = {};
2119 uint32_t swapchain_image_count = 0;
2120// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2121 uint32_t image_index = 0;
2122// VkPresentInfoKHR present_info = {};
2123
2124 ASSERT_NO_FATAL_FAILURE(InitState());
2125
Ian Elliott3f06ce52016-04-29 14:46:21 -06002126#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
2127#if defined(VK_USE_PLATFORM_ANDROID_KHR)
2128 // Use the functions from the VK_KHR_android_surface extension without
2129 // enabling that extension:
2130
2131 // Create a surface:
2132 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002133 m_errorMonitor->SetDesiredFailureMsg(
2134 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2135 "extension was not enabled for this");
2136 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
2137 &surface);
2138 pass = (err != VK_SUCCESS);
2139 ASSERT_TRUE(pass);
2140 m_errorMonitor->VerifyFound();
2141#endif // VK_USE_PLATFORM_ANDROID_KHR
2142
2143
2144#if defined(VK_USE_PLATFORM_MIR_KHR)
2145 // Use the functions from the VK_KHR_mir_surface extension without enabling
2146 // that extension:
2147
2148 // Create a surface:
2149 VkMirSurfaceCreateInfoKHR mir_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002150 m_errorMonitor->SetDesiredFailureMsg(
2151 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2152 "extension was not enabled for this");
2153 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
2154 pass = (err != VK_SUCCESS);
2155 ASSERT_TRUE(pass);
2156 m_errorMonitor->VerifyFound();
2157
2158 // Tell whether an mir_connection supports presentation:
2159 MirConnection *mir_connection = NULL;
2160 m_errorMonitor->SetDesiredFailureMsg(
2161 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2162 "extension was not enabled for this");
2163 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
2164 visual_id);
2165 m_errorMonitor->VerifyFound();
2166#endif // VK_USE_PLATFORM_MIR_KHR
2167
2168
2169#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
2170 // Use the functions from the VK_KHR_wayland_surface extension without
2171 // enabling that extension:
2172
2173 // Create a surface:
2174 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002175 m_errorMonitor->SetDesiredFailureMsg(
2176 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2177 "extension was not enabled for this");
2178 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
2179 &surface);
2180 pass = (err != VK_SUCCESS);
2181 ASSERT_TRUE(pass);
2182 m_errorMonitor->VerifyFound();
2183
2184 // Tell whether an wayland_display supports presentation:
2185 struct wl_display wayland_display = {};
2186 m_errorMonitor->SetDesiredFailureMsg(
2187 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2188 "extension was not enabled for this");
2189 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
2190 &wayland_display);
2191 m_errorMonitor->VerifyFound();
2192#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06002193#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06002194
2195
2196#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002197// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2198// TO NON-LINUX PLATFORMS:
2199VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06002200 // Use the functions from the VK_KHR_win32_surface extension without
2201 // enabling that extension:
2202
2203 // Create a surface:
2204 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002205 m_errorMonitor->SetDesiredFailureMsg(
2206 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2207 "extension was not enabled for this");
2208 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
2209 &surface);
2210 pass = (err != VK_SUCCESS);
2211 ASSERT_TRUE(pass);
2212 m_errorMonitor->VerifyFound();
2213
2214 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002215 m_errorMonitor->SetDesiredFailureMsg(
2216 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2217 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06002218 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002219 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002220// Set this (for now, until all platforms are supported and tested):
2221#define NEED_TO_TEST_THIS_ON_PLATFORM
2222#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06002223
2224
Ian Elliott1c32c772016-04-28 14:47:13 -06002225#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002226// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2227// TO NON-LINUX PLATFORMS:
2228VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002229 // Use the functions from the VK_KHR_xcb_surface extension without enabling
2230 // that extension:
2231
2232 // Create a surface:
2233 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06002234 m_errorMonitor->SetDesiredFailureMsg(
2235 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2236 "extension was not enabled for this");
2237 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2238 pass = (err != VK_SUCCESS);
2239 ASSERT_TRUE(pass);
2240 m_errorMonitor->VerifyFound();
2241
2242 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002243 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002244 xcb_visualid_t visual_id = 0;
2245 m_errorMonitor->SetDesiredFailureMsg(
2246 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2247 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06002248 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06002249 visual_id);
2250 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002251// Set this (for now, until all platforms are supported and tested):
2252#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002253#endif // VK_USE_PLATFORM_XCB_KHR
2254
2255
Ian Elliott12630812016-04-29 14:35:43 -06002256#if defined(VK_USE_PLATFORM_XLIB_KHR)
2257 // Use the functions from the VK_KHR_xlib_surface extension without enabling
2258 // that extension:
2259
2260 // Create a surface:
2261 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
Ian Elliott12630812016-04-29 14:35:43 -06002262 m_errorMonitor->SetDesiredFailureMsg(
2263 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2264 "extension was not enabled for this");
2265 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
2266 pass = (err != VK_SUCCESS);
2267 ASSERT_TRUE(pass);
2268 m_errorMonitor->VerifyFound();
2269
2270 // Tell whether an Xlib VisualID supports presentation:
2271 Display *dpy = NULL;
2272 VisualID visual = 0;
2273 m_errorMonitor->SetDesiredFailureMsg(
2274 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2275 "extension was not enabled for this");
2276 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
2277 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002278// Set this (for now, until all platforms are supported and tested):
2279#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06002280#endif // VK_USE_PLATFORM_XLIB_KHR
2281
2282
Ian Elliott1c32c772016-04-28 14:47:13 -06002283 // Use the functions from the VK_KHR_surface extension without enabling
2284 // that extension:
2285
Ian Elliott489eec02016-05-05 14:12:44 -06002286#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002287 // Destroy a surface:
2288 m_errorMonitor->SetDesiredFailureMsg(
2289 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2290 "extension was not enabled for this");
2291 vkDestroySurfaceKHR(instance(), surface, NULL);
2292 m_errorMonitor->VerifyFound();
2293
2294 // Check if surface supports presentation:
2295 VkBool32 supported = false;
2296 m_errorMonitor->SetDesiredFailureMsg(
2297 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2298 "extension was not enabled for this");
2299 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2300 pass = (err != VK_SUCCESS);
2301 ASSERT_TRUE(pass);
2302 m_errorMonitor->VerifyFound();
2303
2304 // Check surface capabilities:
2305 VkSurfaceCapabilitiesKHR capabilities = {};
2306 m_errorMonitor->SetDesiredFailureMsg(
2307 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2308 "extension was not enabled for this");
2309 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2310 &capabilities);
2311 pass = (err != VK_SUCCESS);
2312 ASSERT_TRUE(pass);
2313 m_errorMonitor->VerifyFound();
2314
2315 // Check surface formats:
2316 uint32_t format_count = 0;
2317 VkSurfaceFormatKHR *formats = NULL;
2318 m_errorMonitor->SetDesiredFailureMsg(
2319 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2320 "extension was not enabled for this");
2321 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2322 &format_count, formats);
2323 pass = (err != VK_SUCCESS);
2324 ASSERT_TRUE(pass);
2325 m_errorMonitor->VerifyFound();
2326
2327 // Check surface present modes:
2328 uint32_t present_mode_count = 0;
2329 VkSurfaceFormatKHR *present_modes = NULL;
2330 m_errorMonitor->SetDesiredFailureMsg(
2331 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2332 "extension was not enabled for this");
2333 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2334 &present_mode_count, present_modes);
2335 pass = (err != VK_SUCCESS);
2336 ASSERT_TRUE(pass);
2337 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002338#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002339
2340
2341 // Use the functions from the VK_KHR_swapchain extension without enabling
2342 // that extension:
2343
2344 // Create a swapchain:
2345 m_errorMonitor->SetDesiredFailureMsg(
2346 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2347 "extension was not enabled for this");
2348 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2349 swapchain_create_info.pNext = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002350 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
2351 NULL, &swapchain);
2352 pass = (err != VK_SUCCESS);
2353 ASSERT_TRUE(pass);
2354 m_errorMonitor->VerifyFound();
2355
2356 // Get the images from the swapchain:
2357 m_errorMonitor->SetDesiredFailureMsg(
2358 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2359 "extension was not enabled for this");
2360 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
2361 &swapchain_image_count, NULL);
2362 pass = (err != VK_SUCCESS);
2363 ASSERT_TRUE(pass);
2364 m_errorMonitor->VerifyFound();
2365
2366 // Try to acquire an image:
2367 m_errorMonitor->SetDesiredFailureMsg(
2368 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2369 "extension was not enabled for this");
2370 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
2371 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
2372 pass = (err != VK_SUCCESS);
2373 ASSERT_TRUE(pass);
2374 m_errorMonitor->VerifyFound();
2375
2376 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002377 //
2378 // NOTE: Currently can't test this because a real swapchain is needed (as
2379 // opposed to the fake one we created) in order for the layer to lookup the
2380 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06002381
2382 // Destroy the swapchain:
2383 m_errorMonitor->SetDesiredFailureMsg(
2384 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2385 "extension was not enabled for this");
2386 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
2387 m_errorMonitor->VerifyFound();
2388}
2389
Ian Elliott2c1daf52016-05-12 09:41:46 -06002390TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
Ian Elliott2c1daf52016-05-12 09:41:46 -06002391
Dustin Graves6c6d8982016-05-17 10:09:21 -06002392#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott2c1daf52016-05-12 09:41:46 -06002393 VkSurfaceKHR surface = VK_NULL_HANDLE;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002394
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002395 VkResult err;
2396 bool pass;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002397 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2398 VkSwapchainCreateInfoKHR swapchain_create_info = {};
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002399 // uint32_t swapchain_image_count = 0;
2400 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2401 // uint32_t image_index = 0;
2402 // VkPresentInfoKHR present_info = {};
Ian Elliott2c1daf52016-05-12 09:41:46 -06002403
2404 ASSERT_NO_FATAL_FAILURE(InitState());
2405
2406 // Use the create function from one of the VK_KHR_*_surface extension in
2407 // order to create a surface, testing all known errors in the process,
2408 // before successfully creating a surface:
2409 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2411 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002412 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
2413 pass = (err != VK_SUCCESS);
2414 ASSERT_TRUE(pass);
2415 m_errorMonitor->VerifyFound();
2416
2417 // Next, try to create a surface with the wrong
2418 // VkXcbSurfaceCreateInfoKHR::sType:
2419 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
2420 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2422 "called with the wrong value for");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002423 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2424 pass = (err != VK_SUCCESS);
2425 ASSERT_TRUE(pass);
2426 m_errorMonitor->VerifyFound();
2427
Ian Elliott2c1daf52016-05-12 09:41:46 -06002428 // Create a native window, and then correctly create a surface:
2429 xcb_connection_t *connection;
2430 xcb_screen_t *screen;
2431 xcb_window_t xcb_window;
2432 xcb_intern_atom_reply_t *atom_wm_delete_window;
2433
2434 const xcb_setup_t *setup;
2435 xcb_screen_iterator_t iter;
2436 int scr;
2437 uint32_t value_mask, value_list[32];
2438 int width = 1;
2439 int height = 1;
2440
2441 connection = xcb_connect(NULL, &scr);
2442 ASSERT_TRUE(connection != NULL);
2443 setup = xcb_get_setup(connection);
2444 iter = xcb_setup_roots_iterator(setup);
2445 while (scr-- > 0)
2446 xcb_screen_next(&iter);
2447 screen = iter.data;
2448
2449 xcb_window = xcb_generate_id(connection);
2450
2451 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
2452 value_list[0] = screen->black_pixel;
2453 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE |
2454 XCB_EVENT_MASK_STRUCTURE_NOTIFY;
2455
2456 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window,
2457 screen->root, 0, 0, width, height, 0,
2458 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual,
2459 value_mask, value_list);
2460
2461 /* Magic code that will send notification when window is destroyed */
2462 xcb_intern_atom_cookie_t cookie =
2463 xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
2464 xcb_intern_atom_reply_t *reply =
2465 xcb_intern_atom_reply(connection, cookie, 0);
2466
2467 xcb_intern_atom_cookie_t cookie2 =
2468 xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002469 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002470 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window,
2471 (*reply).atom, 4, 32, 1,
2472 &(*atom_wm_delete_window).atom);
2473 free(reply);
2474
2475 xcb_map_window(connection, xcb_window);
2476
2477 // Force the x/y coordinates to 100,100 results are identical in consecutive
2478 // runs
2479 const uint32_t coords[] = {100, 100};
2480 xcb_configure_window(connection, xcb_window,
2481 XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
2482
Ian Elliott2c1daf52016-05-12 09:41:46 -06002483 // Finally, try to correctly create a surface:
2484 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
2485 xcb_create_info.pNext = NULL;
2486 xcb_create_info.flags = 0;
2487 xcb_create_info.connection = connection;
2488 xcb_create_info.window = xcb_window;
2489 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2490 pass = (err == VK_SUCCESS);
2491 ASSERT_TRUE(pass);
2492
Ian Elliott2c1daf52016-05-12 09:41:46 -06002493 // Check if surface supports presentation:
2494
2495 // 1st, do so without having queried the queue families:
2496 VkBool32 supported = false;
2497 // TODO: Get the following error to come out:
2498 m_errorMonitor->SetDesiredFailureMsg(
2499 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2500 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
2501 "function");
2502 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2503 pass = (err != VK_SUCCESS);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002504 // ASSERT_TRUE(pass);
2505 // m_errorMonitor->VerifyFound();
Ian Elliott2c1daf52016-05-12 09:41:46 -06002506
2507 // Next, query a queue family index that's too large:
2508 m_errorMonitor->SetDesiredFailureMsg(
2509 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2510 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002511 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface,
2512 &supported);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002513 pass = (err != VK_SUCCESS);
2514 ASSERT_TRUE(pass);
2515 m_errorMonitor->VerifyFound();
2516
2517 // Finally, do so correctly:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002518 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2519 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002520 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2521 pass = (err == VK_SUCCESS);
2522 ASSERT_TRUE(pass);
2523
Ian Elliott2c1daf52016-05-12 09:41:46 -06002524 // Before proceeding, try to create a swapchain without having called
2525 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
2526 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2527 swapchain_create_info.pNext = NULL;
2528 swapchain_create_info.flags = 0;
2529 m_errorMonitor->SetDesiredFailureMsg(
2530 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2531 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002532 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2533 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002534 pass = (err != VK_SUCCESS);
2535 ASSERT_TRUE(pass);
2536 m_errorMonitor->VerifyFound();
2537
Ian Elliott2c1daf52016-05-12 09:41:46 -06002538 // Get the surface capabilities:
2539 VkSurfaceCapabilitiesKHR surface_capabilities;
2540
2541 // Do so correctly (only error logged by this entrypoint is if the
2542 // extension isn't enabled):
2543 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2544 &surface_capabilities);
2545 pass = (err == VK_SUCCESS);
2546 ASSERT_TRUE(pass);
2547
Ian Elliott2c1daf52016-05-12 09:41:46 -06002548 // Get the surface formats:
2549 uint32_t surface_format_count;
2550
2551 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2553 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002554 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
2555 pass = (err == VK_SUCCESS);
2556 ASSERT_TRUE(pass);
2557 m_errorMonitor->VerifyFound();
2558
2559 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
2560 // correctly done a 1st try (to get the count):
2561 m_errorMonitor->SetDesiredFailureMsg(
2562 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2563 "but no prior positive value has been seen for");
2564 surface_format_count = 0;
2565 vkGetPhysicalDeviceSurfaceFormatsKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002566 gpu(), surface, &surface_format_count,
2567 (VkSurfaceFormatKHR *)&surface_format_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002568 pass = (err == VK_SUCCESS);
2569 ASSERT_TRUE(pass);
2570 m_errorMonitor->VerifyFound();
2571
2572 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002573 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2574 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002575 pass = (err == VK_SUCCESS);
2576 ASSERT_TRUE(pass);
2577
2578 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002579 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(
2580 surface_format_count * sizeof(VkSurfaceFormatKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002581
2582 // Next, do a 2nd try with surface_format_count being set too high:
2583 surface_format_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2585 "that is greater than the value");
2586 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002587 surface_formats);
2588 pass = (err == VK_SUCCESS);
2589 ASSERT_TRUE(pass);
2590 m_errorMonitor->VerifyFound();
2591
2592 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002593 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2594 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002595 pass = (err == VK_SUCCESS);
2596 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002597 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002598 surface_formats);
2599 pass = (err == VK_SUCCESS);
2600 ASSERT_TRUE(pass);
2601
Ian Elliott2c1daf52016-05-12 09:41:46 -06002602 // Get the surface present modes:
2603 uint32_t surface_present_mode_count;
2604
2605 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002606 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2607 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002608 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
2609 pass = (err == VK_SUCCESS);
2610 ASSERT_TRUE(pass);
2611 m_errorMonitor->VerifyFound();
2612
2613 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
2614 // correctly done a 1st try (to get the count):
2615 m_errorMonitor->SetDesiredFailureMsg(
2616 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2617 "but no prior positive value has been seen for");
2618 surface_present_mode_count = 0;
2619 vkGetPhysicalDeviceSurfacePresentModesKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002620 gpu(), surface, &surface_present_mode_count,
2621 (VkPresentModeKHR *)&surface_present_mode_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002622 pass = (err == VK_SUCCESS);
2623 ASSERT_TRUE(pass);
2624 m_errorMonitor->VerifyFound();
2625
2626 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002627 vkGetPhysicalDeviceSurfacePresentModesKHR(
2628 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002629 pass = (err == VK_SUCCESS);
2630 ASSERT_TRUE(pass);
2631
2632 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002633 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(
2634 surface_present_mode_count * sizeof(VkPresentModeKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002635
2636 // Next, do a 2nd try with surface_format_count being set too high:
2637 surface_present_mode_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2639 "that is greater than the value");
2640 vkGetPhysicalDeviceSurfacePresentModesKHR(
2641 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002642 pass = (err == VK_SUCCESS);
2643 ASSERT_TRUE(pass);
2644 m_errorMonitor->VerifyFound();
2645
2646 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002647 vkGetPhysicalDeviceSurfacePresentModesKHR(
2648 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002649 pass = (err == VK_SUCCESS);
2650 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002651 vkGetPhysicalDeviceSurfacePresentModesKHR(
2652 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002653 pass = (err == VK_SUCCESS);
2654 ASSERT_TRUE(pass);
2655
Ian Elliott2c1daf52016-05-12 09:41:46 -06002656 // Create a swapchain:
2657
2658 // First, try without a pointer to swapchain_create_info:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2660 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002661 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
2662 pass = (err != VK_SUCCESS);
2663 ASSERT_TRUE(pass);
2664 m_errorMonitor->VerifyFound();
2665
2666 // Next, call with a non-NULL swapchain_create_info, that has the wrong
2667 // sType:
2668 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2670 "called with the wrong value for");
2671 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2672 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002673 pass = (err != VK_SUCCESS);
2674 ASSERT_TRUE(pass);
2675 m_errorMonitor->VerifyFound();
2676
2677 // Next, call with a NULL swapchain pointer:
2678 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2679 swapchain_create_info.pNext = NULL;
2680 swapchain_create_info.flags = 0;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2682 "called with NULL pointer");
2683 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2684 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002685 pass = (err != VK_SUCCESS);
2686 ASSERT_TRUE(pass);
2687 m_errorMonitor->VerifyFound();
2688
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002689 // TODO: Enhance swapchain layer so that
2690 // swapchain_create_info.queueFamilyIndexCount is checked against something?
Ian Elliott2c1daf52016-05-12 09:41:46 -06002691
2692 // Next, call with a queue family index that's too large:
2693 uint32_t queueFamilyIndex[2] = {100000, 0};
2694 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2695 swapchain_create_info.queueFamilyIndexCount = 2;
2696 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
2697 m_errorMonitor->SetDesiredFailureMsg(
2698 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2699 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002700 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2701 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002702 pass = (err != VK_SUCCESS);
2703 ASSERT_TRUE(pass);
2704 m_errorMonitor->VerifyFound();
2705
2706 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
2707 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2708 swapchain_create_info.queueFamilyIndexCount = 1;
2709 m_errorMonitor->SetDesiredFailureMsg(
2710 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2711 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
2712 "pCreateInfo->pQueueFamilyIndices).");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002713 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2714 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002715 pass = (err != VK_SUCCESS);
2716 ASSERT_TRUE(pass);
2717 m_errorMonitor->VerifyFound();
2718
2719 // Next, call with an invalid imageSharingMode:
2720 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
2721 swapchain_create_info.queueFamilyIndexCount = 1;
2722 m_errorMonitor->SetDesiredFailureMsg(
2723 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2724 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002725 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2726 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002727 pass = (err != VK_SUCCESS);
2728 ASSERT_TRUE(pass);
2729 m_errorMonitor->VerifyFound();
2730 // Fix for the future:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002731 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2732 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002733 swapchain_create_info.queueFamilyIndexCount = 0;
2734 queueFamilyIndex[0] = 0;
2735 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
2736
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002737 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
Ian Elliott2c1daf52016-05-12 09:41:46 -06002738 // Get the images from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002739 // Acquire an image from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002740 // Present an image to a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002741 // Destroy the swapchain:
2742
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002743 // TODOs:
2744 //
2745 // - Try destroying the device without first destroying the swapchain
2746 //
2747 // - Try destroying the device without first destroying the surface
2748 //
2749 // - Try destroying the surface without first destroying the swapchain
Ian Elliott2c1daf52016-05-12 09:41:46 -06002750
2751 // Destroy the surface:
2752 vkDestroySurfaceKHR(instance(), surface, NULL);
2753
Ian Elliott2c1daf52016-05-12 09:41:46 -06002754 // Tear down the window:
2755 xcb_destroy_window(connection, xcb_window);
2756 xcb_disconnect(connection);
2757
2758#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002759 return;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002760#endif // VK_USE_PLATFORM_XCB_KHR
2761}
2762
Karl Schultz6addd812016-02-02 17:17:23 -07002763TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2764 VkResult err;
2765 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002766
Karl Schultz6addd812016-02-02 17:17:23 -07002767 m_errorMonitor->SetDesiredFailureMsg(
2768 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002769 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
2770
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002771 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002772
2773 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002774 VkImage image;
2775 VkDeviceMemory mem;
2776 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002777
Karl Schultz6addd812016-02-02 17:17:23 -07002778 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2779 const int32_t tex_width = 32;
2780 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002781
Tony Barboureb254902015-07-15 12:50:33 -06002782 VkImageCreateInfo image_create_info = {};
2783 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002784 image_create_info.pNext = NULL;
2785 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2786 image_create_info.format = tex_format;
2787 image_create_info.extent.width = tex_width;
2788 image_create_info.extent.height = tex_height;
2789 image_create_info.extent.depth = 1;
2790 image_create_info.mipLevels = 1;
2791 image_create_info.arrayLayers = 1;
2792 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2793 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2794 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2795 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002796
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002797 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002798 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002799 mem_alloc.pNext = NULL;
2800 mem_alloc.allocationSize = 0;
2801 // Introduce failure, do NOT set memProps to
2802 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
2803 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002804
Chia-I Wuf7458c52015-10-26 21:10:41 +08002805 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002806 ASSERT_VK_SUCCESS(err);
2807
Karl Schultz6addd812016-02-02 17:17:23 -07002808 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002809
Mark Lobodzinski23065352015-05-29 09:32:35 -05002810 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002811
Karl Schultz6addd812016-02-02 17:17:23 -07002812 pass =
2813 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
2814 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2815 if (!pass) { // If we can't find any unmappable memory this test doesn't
2816 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002817 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002818 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002819 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002820
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002821 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002822 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002823 ASSERT_VK_SUCCESS(err);
2824
2825 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002826 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002827 ASSERT_VK_SUCCESS(err);
2828
2829 // Map memory as if to initialize the image
2830 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002831 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
2832 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002833
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002834 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002835
Chia-I Wuf7458c52015-10-26 21:10:41 +08002836 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002837 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002838}
2839
Karl Schultz6addd812016-02-02 17:17:23 -07002840TEST_F(VkLayerTest, RebindMemory) {
2841 VkResult err;
2842 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002843
Karl Schultz6addd812016-02-02 17:17:23 -07002844 m_errorMonitor->SetDesiredFailureMsg(
2845 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002846 "which has already been bound to mem object");
2847
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002848 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002849
2850 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002851 VkImage image;
2852 VkDeviceMemory mem1;
2853 VkDeviceMemory mem2;
2854 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002855
Karl Schultz6addd812016-02-02 17:17:23 -07002856 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2857 const int32_t tex_width = 32;
2858 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002859
Tony Barboureb254902015-07-15 12:50:33 -06002860 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002861 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2862 image_create_info.pNext = NULL;
2863 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2864 image_create_info.format = tex_format;
2865 image_create_info.extent.width = tex_width;
2866 image_create_info.extent.height = tex_height;
2867 image_create_info.extent.depth = 1;
2868 image_create_info.mipLevels = 1;
2869 image_create_info.arrayLayers = 1;
2870 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2871 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2872 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2873 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002874
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002875 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002876 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2877 mem_alloc.pNext = NULL;
2878 mem_alloc.allocationSize = 0;
2879 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002880
Karl Schultz6addd812016-02-02 17:17:23 -07002881 // Introduce failure, do NOT set memProps to
2882 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002883 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002884 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002885 ASSERT_VK_SUCCESS(err);
2886
Karl Schultz6addd812016-02-02 17:17:23 -07002887 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002888
2889 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002890 pass =
2891 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002892 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002893
2894 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002895 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002896 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002897 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002898 ASSERT_VK_SUCCESS(err);
2899
2900 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002901 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002902 ASSERT_VK_SUCCESS(err);
2903
Karl Schultz6addd812016-02-02 17:17:23 -07002904 // Introduce validation failure, try to bind a different memory object to
2905 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002906 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002907
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002908 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002909
Chia-I Wuf7458c52015-10-26 21:10:41 +08002910 vkDestroyImage(m_device->device(), image, NULL);
2911 vkFreeMemory(m_device->device(), mem1, NULL);
2912 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002913}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002914
Karl Schultz6addd812016-02-02 17:17:23 -07002915TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002916 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002917
Karl Schultz6addd812016-02-02 17:17:23 -07002918 m_errorMonitor->SetDesiredFailureMsg(
2919 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
2920 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002921
2922 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002923 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2924 fenceInfo.pNext = NULL;
2925 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002926
Tony Barbour300a6082015-04-07 13:44:53 -06002927 ASSERT_NO_FATAL_FAILURE(InitState());
2928 ASSERT_NO_FATAL_FAILURE(InitViewport());
2929 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2930
Tony Barbourfe3351b2015-07-28 10:17:20 -06002931 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002932 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2933 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06002934 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002935
2936 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002937
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002938 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002939 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2940 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002941 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002942 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002943 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002944 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002945 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002946 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002947 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002948
2949 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002950 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002951
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002952 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002953}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002954// This is a positive test. We used to expect error in this case but spec now
2955// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07002956TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002957 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002958 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002959 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002960 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2961 fenceInfo.pNext = NULL;
2962
Tony Barbour0b4d9562015-04-09 10:48:04 -06002963 ASSERT_NO_FATAL_FAILURE(InitState());
2964 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08002965 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002966 VkResult result = vkResetFences(m_device->device(), 1, fences);
2967 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06002968
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002969 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06002970}
Tobin Ehlis41376e12015-07-03 08:45:14 -06002971
Chris Forbese70b7d32016-06-15 15:49:12 +12002972#if 0
2973TEST_F(VkLayerTest, LongFenceChain)
2974{
2975 m_errorMonitor->ExpectSuccess();
2976
2977 ASSERT_NO_FATAL_FAILURE(InitState());
2978 VkResult err;
2979
2980 std::vector<VkFence> fences;
2981
2982 const int chainLength = 32768;
2983
2984 for (int i = 0; i < chainLength; i++) {
2985 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
2986 VkFence fence;
2987 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
2988 ASSERT_VK_SUCCESS(err);
2989
2990 fences.push_back(fence);
2991
2992 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
2993 0, nullptr, 0, nullptr };
2994 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
2995 ASSERT_VK_SUCCESS(err);
2996
2997 }
2998
2999 // BOOM, stack overflow.
3000 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
3001
3002 for (auto fence : fences)
3003 vkDestroyFence(m_device->device(), fence, nullptr);
3004
3005 m_errorMonitor->VerifyNotFound();
3006}
3007#endif
3008
Chris Forbes18127d12016-06-08 16:52:28 +12003009TEST_F(VkLayerTest, CommandBufferSimultaneousUseSync)
3010{
3011 m_errorMonitor->ExpectSuccess();
3012
3013 ASSERT_NO_FATAL_FAILURE(InitState());
3014 VkResult err;
3015
3016 // Record (empty!) command buffer that can be submitted multiple times
3017 // simultaneously.
3018 VkCommandBufferBeginInfo cbbi = {
3019 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
3020 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr
3021 };
3022 m_commandBuffer->BeginCommandBuffer(&cbbi);
3023 m_commandBuffer->EndCommandBuffer();
3024
3025 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3026 VkFence fence;
3027 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3028 ASSERT_VK_SUCCESS(err);
3029
3030 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
3031 VkSemaphore s1, s2;
3032 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
3033 ASSERT_VK_SUCCESS(err);
3034 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
3035 ASSERT_VK_SUCCESS(err);
3036
3037 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
3038 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3039 1, &m_commandBuffer->handle(), 1, &s1 };
3040 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3041 ASSERT_VK_SUCCESS(err);
3042
3043 // Submit CB again, signaling s2.
3044 si.pSignalSemaphores = &s2;
3045 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
3046 ASSERT_VK_SUCCESS(err);
3047
3048 // Wait for fence.
3049 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3050 ASSERT_VK_SUCCESS(err);
3051
3052 // CB is still in flight from second submission, but semaphore s1 is no
3053 // longer in flight. delete it.
3054 vkDestroySemaphore(m_device->device(), s1, nullptr);
3055
3056 m_errorMonitor->VerifyNotFound();
3057
3058 // Force device idle and clean up remaining objects
3059 vkDeviceWaitIdle(m_device->device());
3060 vkDestroySemaphore(m_device->device(), s2, nullptr);
3061 vkDestroyFence(m_device->device(), fence, nullptr);
3062}
3063
Chris Forbes4e44c912016-06-16 10:20:00 +12003064TEST_F(VkLayerTest, FenceCreateSignaledWaitHandling)
3065{
3066 m_errorMonitor->ExpectSuccess();
3067
3068 ASSERT_NO_FATAL_FAILURE(InitState());
3069 VkResult err;
3070
3071 // A fence created signaled
3072 VkFenceCreateInfo fci1 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
3073 VkFence f1;
3074 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
3075 ASSERT_VK_SUCCESS(err);
3076
3077 // A fence created not
3078 VkFenceCreateInfo fci2 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3079 VkFence f2;
3080 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
3081 ASSERT_VK_SUCCESS(err);
3082
3083 // Submit the unsignaled fence
3084 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3085 0, nullptr, 0, nullptr };
3086 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
3087
3088 // Wait on both fences, with signaled first.
3089 VkFence fences[] = { f1, f2 };
3090 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
3091
3092 // Should have both retired!
3093 vkDestroyFence(m_device->device(), f1, nullptr);
3094 vkDestroyFence(m_device->device(), f2, nullptr);
3095
3096 m_errorMonitor->VerifyNotFound();
3097}
3098
Tobin Ehlis41376e12015-07-03 08:45:14 -06003099TEST_F(VkLayerTest, InvalidUsageBits)
3100{
Tony Barbourf92621a2016-05-02 14:28:12 -06003101 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003102 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06003103 "Initialize buffer with wrong usage then perform copy expecting errors "
3104 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003105 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003106 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06003107
3108 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06003109 VkImageObj image(m_device);
3110 // Initialize image with USAGE_INPUT_ATTACHMENT
Tobin Ehlis8b313c02016-05-25 15:01:52 -06003111 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003112 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3113 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06003114
Tony Barbourf92621a2016-05-02 14:28:12 -06003115 VkImageView dsv;
3116 VkImageViewCreateInfo dsvci = {};
3117 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3118 dsvci.image = image.handle();
3119 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3120 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
3121 dsvci.subresourceRange.layerCount = 1;
3122 dsvci.subresourceRange.baseMipLevel = 0;
3123 dsvci.subresourceRange.levelCount = 1;
3124 dsvci.subresourceRange.aspectMask =
3125 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06003126
Tony Barbourf92621a2016-05-02 14:28:12 -06003127 // Create a view with depth / stencil aspect for image with different usage
3128 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003129
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003130 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06003131
3132 // Initialize buffer with TRANSFER_DST usage
3133 vk_testing::Buffer buffer;
3134 VkMemoryPropertyFlags reqs = 0;
3135 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3136 VkBufferImageCopy region = {};
3137 region.bufferRowLength = 128;
3138 region.bufferImageHeight = 128;
3139 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3140 region.imageSubresource.layerCount = 1;
3141 region.imageExtent.height = 16;
3142 region.imageExtent.width = 16;
3143 region.imageExtent.depth = 1;
3144
3145 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3146 "Invalid usage flag for buffer ");
3147 // Buffer usage not set to TRANSFER_SRC and image usage not set to
3148 // TRANSFER_DST
3149 BeginCommandBuffer();
3150 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3151 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3152 1, &region);
3153 m_errorMonitor->VerifyFound();
3154
3155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3156 "Invalid usage flag for image ");
3157 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3158 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3159 1, &region);
3160 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06003161}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003162#endif // MEM_TRACKER_TESTS
3163
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06003164#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003165
3166TEST_F(VkLayerTest, LeakAnObject) {
3167 VkResult err;
3168
3169 TEST_DESCRIPTION(
3170 "Create a fence and destroy its device without first destroying the fence.");
3171
3172 // Note that we have to create a new device since destroying the
3173 // framework's device causes Teardown() to fail and just calling Teardown
3174 // will destroy the errorMonitor.
3175
3176 m_errorMonitor->SetDesiredFailureMsg(
3177 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003178 "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003179
3180 ASSERT_NO_FATAL_FAILURE(InitState());
3181
3182 const std::vector<VkQueueFamilyProperties> queue_props =
3183 m_device->queue_props;
3184 std::vector<VkDeviceQueueCreateInfo> queue_info;
3185 queue_info.reserve(queue_props.size());
3186 std::vector<std::vector<float>> queue_priorities;
3187 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
3188 VkDeviceQueueCreateInfo qi = {};
3189 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
3190 qi.pNext = NULL;
3191 qi.queueFamilyIndex = i;
3192 qi.queueCount = queue_props[i].queueCount;
3193 queue_priorities.emplace_back(qi.queueCount, 0.0f);
3194 qi.pQueuePriorities = queue_priorities[i].data();
3195 queue_info.push_back(qi);
3196 }
3197
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003198 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003199
3200 // The sacrificial device object
3201 VkDevice testDevice;
3202 VkDeviceCreateInfo device_create_info = {};
3203 auto features = m_device->phy().features();
3204 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
3205 device_create_info.pNext = NULL;
3206 device_create_info.queueCreateInfoCount = queue_info.size();
3207 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06003208 device_create_info.enabledLayerCount = 0;
3209 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003210 device_create_info.pEnabledFeatures = &features;
3211 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
3212 ASSERT_VK_SUCCESS(err);
3213
3214 VkFence fence;
3215 VkFenceCreateInfo fence_create_info = {};
3216 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3217 fence_create_info.pNext = NULL;
3218 fence_create_info.flags = 0;
3219 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
3220 ASSERT_VK_SUCCESS(err);
3221
3222 // Induce failure by not calling vkDestroyFence
3223 vkDestroyDevice(testDevice, NULL);
3224 m_errorMonitor->VerifyFound();
3225}
3226
3227TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
3228
3229 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
3230 "attempt to delete them from another.");
3231
3232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3233 "FreeCommandBuffers is attempting to free Command Buffer");
3234
3235 VkCommandPool command_pool_one;
3236 VkCommandPool command_pool_two;
3237
3238 VkCommandPoolCreateInfo pool_create_info{};
3239 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3240 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3241 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3242
3243 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3244 &command_pool_one);
3245
3246 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3247 &command_pool_two);
3248
3249 VkCommandBuffer command_buffer[9];
3250 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3251 command_buffer_allocate_info.sType =
3252 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3253 command_buffer_allocate_info.commandPool = command_pool_one;
3254 command_buffer_allocate_info.commandBufferCount = 9;
3255 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3256 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3257 command_buffer);
3258
3259 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
3260 &command_buffer[3]);
3261
3262 m_errorMonitor->VerifyFound();
3263
3264 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
3265 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
3266}
3267
3268TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
3269 VkResult err;
3270
3271 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
3272 "attempt to delete them from another.");
3273
3274 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3275 "FreeDescriptorSets is attempting to free descriptorSet");
3276
3277 ASSERT_NO_FATAL_FAILURE(InitState());
3278 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3279
3280 VkDescriptorPoolSize ds_type_count = {};
3281 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3282 ds_type_count.descriptorCount = 1;
3283
3284 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3285 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3286 ds_pool_ci.pNext = NULL;
3287 ds_pool_ci.flags = 0;
3288 ds_pool_ci.maxSets = 1;
3289 ds_pool_ci.poolSizeCount = 1;
3290 ds_pool_ci.pPoolSizes = &ds_type_count;
3291
3292 VkDescriptorPool ds_pool_one;
3293 err =
3294 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
3295 ASSERT_VK_SUCCESS(err);
3296
3297 // Create a second descriptor pool
3298 VkDescriptorPool ds_pool_two;
3299 err =
3300 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
3301 ASSERT_VK_SUCCESS(err);
3302
3303 VkDescriptorSetLayoutBinding dsl_binding = {};
3304 dsl_binding.binding = 0;
3305 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3306 dsl_binding.descriptorCount = 1;
3307 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3308 dsl_binding.pImmutableSamplers = NULL;
3309
3310 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3311 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3312 ds_layout_ci.pNext = NULL;
3313 ds_layout_ci.bindingCount = 1;
3314 ds_layout_ci.pBindings = &dsl_binding;
3315
3316 VkDescriptorSetLayout ds_layout;
3317 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3318 &ds_layout);
3319 ASSERT_VK_SUCCESS(err);
3320
3321 VkDescriptorSet descriptorSet;
3322 VkDescriptorSetAllocateInfo alloc_info = {};
3323 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3324 alloc_info.descriptorSetCount = 1;
3325 alloc_info.descriptorPool = ds_pool_one;
3326 alloc_info.pSetLayouts = &ds_layout;
3327 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3328 &descriptorSet);
3329 ASSERT_VK_SUCCESS(err);
3330
3331 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
3332
3333 m_errorMonitor->VerifyFound();
3334
3335 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3336 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
3337 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
3338}
3339
3340TEST_F(VkLayerTest, CreateUnknownObject) {
3341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003342 "Invalid Image Object ");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003343
3344 TEST_DESCRIPTION(
3345 "Pass an invalid image object handle into a Vulkan API call.");
3346
3347 ASSERT_NO_FATAL_FAILURE(InitState());
3348
3349 // Pass bogus handle into GetImageMemoryRequirements
3350 VkMemoryRequirements mem_reqs;
3351 uint64_t fakeImageHandle = 0xCADECADE;
3352 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
3353
3354 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
3355
3356 m_errorMonitor->VerifyFound();
3357}
3358
Karl Schultz6addd812016-02-02 17:17:23 -07003359TEST_F(VkLayerTest, PipelineNotBound) {
3360 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003361
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003362 TEST_DESCRIPTION(
3363 "Pass in an invalid pipeline object handle into a Vulkan API call.");
3364
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003365 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003366 "Invalid Pipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003367
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003368 ASSERT_NO_FATAL_FAILURE(InitState());
3369 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003370
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003371 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003372 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3373 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003374
3375 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003376 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3377 ds_pool_ci.pNext = NULL;
3378 ds_pool_ci.maxSets = 1;
3379 ds_pool_ci.poolSizeCount = 1;
3380 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003381
3382 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003383 err =
3384 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003385 ASSERT_VK_SUCCESS(err);
3386
3387 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003388 dsl_binding.binding = 0;
3389 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3390 dsl_binding.descriptorCount = 1;
3391 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3392 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003393
3394 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003395 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3396 ds_layout_ci.pNext = NULL;
3397 ds_layout_ci.bindingCount = 1;
3398 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003399
3400 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003401 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3402 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003403 ASSERT_VK_SUCCESS(err);
3404
3405 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003406 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003407 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003408 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003409 alloc_info.descriptorPool = ds_pool;
3410 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003411 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3412 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003413 ASSERT_VK_SUCCESS(err);
3414
3415 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003416 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3417 pipeline_layout_ci.pNext = NULL;
3418 pipeline_layout_ci.setLayoutCount = 1;
3419 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003420
3421 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003422 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3423 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003424 ASSERT_VK_SUCCESS(err);
3425
Mark Youngad779052016-01-06 14:26:04 -07003426 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003427
3428 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003429 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3430 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003431
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003432 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003433
Chia-I Wuf7458c52015-10-26 21:10:41 +08003434 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3435 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3436 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003437}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003438
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003439TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
3440 VkResult err;
3441
3442 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
3443 "during bind[Buffer|Image]Memory time");
3444
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003445 ASSERT_NO_FATAL_FAILURE(InitState());
3446
3447 // Create an image, allocate memory, set a bad typeIndex and then try to
3448 // bind it
3449 VkImage image;
3450 VkDeviceMemory mem;
3451 VkMemoryRequirements mem_reqs;
3452 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3453 const int32_t tex_width = 32;
3454 const int32_t tex_height = 32;
3455
3456 VkImageCreateInfo image_create_info = {};
3457 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3458 image_create_info.pNext = NULL;
3459 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3460 image_create_info.format = tex_format;
3461 image_create_info.extent.width = tex_width;
3462 image_create_info.extent.height = tex_height;
3463 image_create_info.extent.depth = 1;
3464 image_create_info.mipLevels = 1;
3465 image_create_info.arrayLayers = 1;
3466 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3467 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3468 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3469 image_create_info.flags = 0;
3470
3471 VkMemoryAllocateInfo mem_alloc = {};
3472 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3473 mem_alloc.pNext = NULL;
3474 mem_alloc.allocationSize = 0;
3475 mem_alloc.memoryTypeIndex = 0;
3476
3477 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3478 ASSERT_VK_SUCCESS(err);
3479
3480 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
3481 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003482
3483 // Introduce Failure, select invalid TypeIndex
3484 VkPhysicalDeviceMemoryProperties memory_info;
3485
3486 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
3487 unsigned int i;
3488 for (i = 0; i < memory_info.memoryTypeCount; i++) {
3489 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
3490 mem_alloc.memoryTypeIndex = i;
3491 break;
3492 }
3493 }
3494 if (i >= memory_info.memoryTypeCount) {
3495 printf("No invalid memory type index could be found; skipped.\n");
3496 vkDestroyImage(m_device->device(), image, NULL);
3497 return;
3498 }
3499
3500 m_errorMonitor->SetDesiredFailureMsg(
3501 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3502 "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003503
3504 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3505 ASSERT_VK_SUCCESS(err);
3506
3507 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3508 (void)err;
3509
3510 m_errorMonitor->VerifyFound();
3511
3512 vkDestroyImage(m_device->device(), image, NULL);
3513 vkFreeMemory(m_device->device(), mem, NULL);
3514}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003515
Karl Schultz6addd812016-02-02 17:17:23 -07003516TEST_F(VkLayerTest, BindInvalidMemory) {
3517 VkResult err;
3518 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003519
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003520 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003521 "Invalid Device Memory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003522
Tobin Ehlisec598302015-09-15 15:02:17 -06003523 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003524
3525 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07003526 VkImage image;
3527 VkDeviceMemory mem;
3528 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003529
Karl Schultz6addd812016-02-02 17:17:23 -07003530 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3531 const int32_t tex_width = 32;
3532 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003533
3534 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003535 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3536 image_create_info.pNext = NULL;
3537 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3538 image_create_info.format = tex_format;
3539 image_create_info.extent.width = tex_width;
3540 image_create_info.extent.height = tex_height;
3541 image_create_info.extent.depth = 1;
3542 image_create_info.mipLevels = 1;
3543 image_create_info.arrayLayers = 1;
3544 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3545 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3546 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3547 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003548
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003549 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003550 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3551 mem_alloc.pNext = NULL;
3552 mem_alloc.allocationSize = 0;
3553 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003554
Chia-I Wuf7458c52015-10-26 21:10:41 +08003555 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003556 ASSERT_VK_SUCCESS(err);
3557
Karl Schultz6addd812016-02-02 17:17:23 -07003558 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003559
3560 mem_alloc.allocationSize = mem_reqs.size;
3561
Karl Schultz6addd812016-02-02 17:17:23 -07003562 pass =
3563 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003564 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003565
3566 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003567 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003568 ASSERT_VK_SUCCESS(err);
3569
3570 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003571 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003572
3573 // Try to bind free memory that has been freed
3574 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3575 // This may very well return an error.
3576 (void)err;
3577
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003578 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003579
Chia-I Wuf7458c52015-10-26 21:10:41 +08003580 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003581}
3582
Karl Schultz6addd812016-02-02 17:17:23 -07003583TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
3584 VkResult err;
3585 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003586
Karl Schultz6addd812016-02-02 17:17:23 -07003587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003588 "Invalid Image Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003589
Tobin Ehlisec598302015-09-15 15:02:17 -06003590 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003591
Karl Schultz6addd812016-02-02 17:17:23 -07003592 // Create an image object, allocate memory, destroy the object and then try
3593 // to bind it
3594 VkImage image;
3595 VkDeviceMemory mem;
3596 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003597
Karl Schultz6addd812016-02-02 17:17:23 -07003598 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3599 const int32_t tex_width = 32;
3600 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003601
3602 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003603 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3604 image_create_info.pNext = NULL;
3605 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3606 image_create_info.format = tex_format;
3607 image_create_info.extent.width = tex_width;
3608 image_create_info.extent.height = tex_height;
3609 image_create_info.extent.depth = 1;
3610 image_create_info.mipLevels = 1;
3611 image_create_info.arrayLayers = 1;
3612 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3613 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3614 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3615 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003616
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003617 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003618 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3619 mem_alloc.pNext = NULL;
3620 mem_alloc.allocationSize = 0;
3621 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003622
Chia-I Wuf7458c52015-10-26 21:10:41 +08003623 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003624 ASSERT_VK_SUCCESS(err);
3625
Karl Schultz6addd812016-02-02 17:17:23 -07003626 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003627
3628 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003629 pass =
3630 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003631 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003632
3633 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003634 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003635 ASSERT_VK_SUCCESS(err);
3636
3637 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003638 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003639 ASSERT_VK_SUCCESS(err);
3640
3641 // Now Try to bind memory to this destroyed object
3642 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3643 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003644 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003645
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003646 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003647
Chia-I Wuf7458c52015-10-26 21:10:41 +08003648 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003649}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003650
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003651#endif // OBJ_TRACKER_TESTS
3652
Tobin Ehlis0788f522015-05-26 16:11:58 -06003653#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003654
Chris Forbes48a53902016-06-30 11:46:27 +12003655TEST_F(VkLayerTest, RenderPassInitialLayoutUndefined) {
3656 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
3657 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
3658 "the command buffer has prior knowledge of that "
3659 "attachment's layout.");
3660
3661 m_errorMonitor->ExpectSuccess();
3662
3663 ASSERT_NO_FATAL_FAILURE(InitState());
3664
3665 // A renderpass with one color attachment.
3666 VkAttachmentDescription attachment = {
3667 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3668 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3669 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3670 VK_IMAGE_LAYOUT_UNDEFINED,
3671 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3672 };
3673
3674 VkAttachmentReference att_ref = {
3675 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3676 };
3677
3678 VkSubpassDescription subpass = {
3679 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3680 1, &att_ref, nullptr, nullptr, 0, nullptr
3681 };
3682
3683 VkRenderPassCreateInfo rpci = {
3684 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3685 0, 1, &attachment, 1, &subpass, 0, nullptr
3686 };
3687
3688 VkRenderPass rp;
3689 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3690 ASSERT_VK_SUCCESS(err);
3691
3692 // A compatible framebuffer.
3693 VkImageObj image(m_device);
3694 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3695 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3696 VK_IMAGE_TILING_OPTIMAL, 0);
3697 ASSERT_TRUE(image.initialized());
3698
3699 VkImageViewCreateInfo ivci = {
3700 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3701 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3702 {
3703 VK_COMPONENT_SWIZZLE_IDENTITY,
3704 VK_COMPONENT_SWIZZLE_IDENTITY,
3705 VK_COMPONENT_SWIZZLE_IDENTITY,
3706 VK_COMPONENT_SWIZZLE_IDENTITY
3707 },
3708 {
3709 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3710 },
3711 };
3712 VkImageView view;
3713 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3714 ASSERT_VK_SUCCESS(err);
3715
3716 VkFramebufferCreateInfo fci = {
3717 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3718 0, rp, 1, &view,
3719 32, 32, 1
3720 };
3721 VkFramebuffer fb;
3722 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3723 ASSERT_VK_SUCCESS(err);
3724
3725 // Record a single command buffer which uses this renderpass twice. The
3726 // bug is triggered at the beginning of the second renderpass, when the
3727 // command buffer already has a layout recorded for the attachment.
3728 VkRenderPassBeginInfo rpbi = {
3729 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003730 rp, fb, { { 0, 0 } , { 32, 32 } },
Chris Forbes48a53902016-06-30 11:46:27 +12003731 0, nullptr
3732 };
3733 BeginCommandBuffer();
3734 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3735 VK_SUBPASS_CONTENTS_INLINE);
3736 vkCmdEndRenderPass(m_commandBuffer->handle());
3737 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3738 VK_SUBPASS_CONTENTS_INLINE);
3739
3740 m_errorMonitor->VerifyNotFound();
3741
3742 vkCmdEndRenderPass(m_commandBuffer->handle());
3743 EndCommandBuffer();
3744
3745 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3746 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3747 vkDestroyImageView(m_device->device(), view, nullptr);
3748}
3749
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003750TEST_F(VkLayerTest, FramebufferBindingDestroyCommandPool) {
3751 TEST_DESCRIPTION("This test should pass. Create a Framebuffer and "
3752 "command buffer, bind them together, then destroy "
3753 "command pool and framebuffer and verify there are no "
3754 "errors.");
3755
3756 m_errorMonitor->ExpectSuccess();
3757
3758 ASSERT_NO_FATAL_FAILURE(InitState());
3759
3760 // A renderpass with one color attachment.
3761 VkAttachmentDescription attachment = {
3762 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3763 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3764 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3765 VK_IMAGE_LAYOUT_UNDEFINED,
3766 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3767 };
3768
3769 VkAttachmentReference att_ref = {
3770 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3771 };
3772
3773 VkSubpassDescription subpass = {
3774 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3775 1, &att_ref, nullptr, nullptr, 0, nullptr
3776 };
3777
3778 VkRenderPassCreateInfo rpci = {
3779 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3780 0, 1, &attachment, 1, &subpass, 0, nullptr
3781 };
3782
3783 VkRenderPass rp;
3784 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3785 ASSERT_VK_SUCCESS(err);
3786
3787 // A compatible framebuffer.
3788 VkImageObj image(m_device);
3789 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3790 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3791 VK_IMAGE_TILING_OPTIMAL, 0);
3792 ASSERT_TRUE(image.initialized());
3793
3794 VkImageViewCreateInfo ivci = {
3795 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3796 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3797 {
3798 VK_COMPONENT_SWIZZLE_IDENTITY,
3799 VK_COMPONENT_SWIZZLE_IDENTITY,
3800 VK_COMPONENT_SWIZZLE_IDENTITY,
3801 VK_COMPONENT_SWIZZLE_IDENTITY
3802 },
3803 {
3804 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3805 },
3806 };
3807 VkImageView view;
3808 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3809 ASSERT_VK_SUCCESS(err);
3810
3811 VkFramebufferCreateInfo fci = {
3812 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3813 0, rp, 1, &view,
3814 32, 32, 1
3815 };
3816 VkFramebuffer fb;
3817 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3818 ASSERT_VK_SUCCESS(err);
3819
3820 // Explicitly create a command buffer to bind the FB to so that we can then
3821 // destroy the command pool in order to implicitly free command buffer
3822 VkCommandPool command_pool;
3823 VkCommandPoolCreateInfo pool_create_info{};
3824 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3825 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3826 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3827 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3828 &command_pool);
3829
3830 VkCommandBuffer command_buffer;
3831 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3832 command_buffer_allocate_info.sType =
3833 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3834 command_buffer_allocate_info.commandPool = command_pool;
3835 command_buffer_allocate_info.commandBufferCount = 1;
3836 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3837 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3838 &command_buffer);
3839
3840 // Begin our cmd buffer with renderpass using our framebuffer
3841 VkRenderPassBeginInfo rpbi = {
3842 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
3843 rp, fb, { { 0, 0 } , { 32, 32 } },
3844 0, nullptr
3845 };
3846 VkCommandBufferBeginInfo begin_info{};
3847 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3848 vkBeginCommandBuffer(command_buffer, &begin_info);
3849
3850 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3851 vkCmdEndRenderPass(command_buffer);
3852 vkEndCommandBuffer(command_buffer);
Mark Lobodzinski7d10a822016-08-03 14:08:40 -06003853 vkDestroyImageView(m_device->device(), view, nullptr);
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003854 // Destroy command pool to implicitly free command buffer
3855 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3856 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3857 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3858 m_errorMonitor->VerifyNotFound();
3859}
3860
Chris Forbes51bf7c92016-06-30 15:22:08 +12003861TEST_F(VkLayerTest, RenderPassSubpassZeroTransitionsApplied) {
3862 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
3863 "transitions for the first subpass");
3864
3865 m_errorMonitor->ExpectSuccess();
3866
3867 ASSERT_NO_FATAL_FAILURE(InitState());
3868
3869 // A renderpass with one color attachment.
3870 VkAttachmentDescription attachment = {
3871 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3872 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3873 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3874 VK_IMAGE_LAYOUT_UNDEFINED,
3875 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3876 };
3877
3878 VkAttachmentReference att_ref = {
3879 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3880 };
3881
3882 VkSubpassDescription subpass = {
3883 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3884 1, &att_ref, nullptr, nullptr, 0, nullptr
3885 };
3886
3887 VkSubpassDependency dep = {
Chris Forbescb4c7ad2016-07-06 10:28:18 +12003888 0, 0, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3889 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12003890 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3891 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3892 VK_DEPENDENCY_BY_REGION_BIT
3893 };
3894
3895 VkRenderPassCreateInfo rpci = {
3896 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3897 0, 1, &attachment, 1, &subpass, 1, &dep
3898 };
3899
3900 VkResult err;
3901 VkRenderPass rp;
3902 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3903 ASSERT_VK_SUCCESS(err);
3904
3905 // A compatible framebuffer.
3906 VkImageObj image(m_device);
3907 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3908 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3909 VK_IMAGE_TILING_OPTIMAL, 0);
3910 ASSERT_TRUE(image.initialized());
3911
3912 VkImageViewCreateInfo ivci = {
3913 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3914 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3915 {
3916 VK_COMPONENT_SWIZZLE_IDENTITY,
3917 VK_COMPONENT_SWIZZLE_IDENTITY,
3918 VK_COMPONENT_SWIZZLE_IDENTITY,
3919 VK_COMPONENT_SWIZZLE_IDENTITY
3920 },
3921 {
3922 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3923 },
3924 };
3925 VkImageView view;
3926 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3927 ASSERT_VK_SUCCESS(err);
3928
3929 VkFramebufferCreateInfo fci = {
3930 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3931 0, rp, 1, &view,
3932 32, 32, 1
3933 };
3934 VkFramebuffer fb;
3935 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3936 ASSERT_VK_SUCCESS(err);
3937
3938 // Record a single command buffer which issues a pipeline barrier w/
3939 // image memory barrier for the attachment. This detects the previously
3940 // missing tracking of the subpass layout by throwing a validation error
3941 // if it doesn't occur.
3942 VkRenderPassBeginInfo rpbi = {
3943 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003944 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes51bf7c92016-06-30 15:22:08 +12003945 0, nullptr
3946 };
3947 BeginCommandBuffer();
3948 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3949 VK_SUBPASS_CONTENTS_INLINE);
3950
3951 VkImageMemoryBarrier imb = {
3952 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, nullptr,
3953 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3954 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3955 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3956 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3957 VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
3958 image.handle(),
3959 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
3960 };
3961 vkCmdPipelineBarrier(m_commandBuffer->handle(),
Chris Forbescb4c7ad2016-07-06 10:28:18 +12003962 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3963 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12003964 VK_DEPENDENCY_BY_REGION_BIT,
3965 0, nullptr, 0, nullptr, 1, &imb);
3966
3967 vkCmdEndRenderPass(m_commandBuffer->handle());
3968 m_errorMonitor->VerifyNotFound();
3969 EndCommandBuffer();
3970
3971 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3972 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3973 vkDestroyImageView(m_device->device(), view, nullptr);
3974}
3975
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06003976TEST_F(VkLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
3977 TEST_DESCRIPTION("Validate that when an imageView of a depth/stencil image "
3978 "is used as a depth/stencil framebuffer attachment, the "
3979 "aspectMask is ignored and both depth and stencil image "
3980 "subresources are used.");
3981
3982 VkFormatProperties format_properties;
3983 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT,
3984 &format_properties);
3985 if (!(format_properties.optimalTilingFeatures &
3986 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
3987 return;
3988 }
3989
3990 m_errorMonitor->ExpectSuccess();
3991
3992 ASSERT_NO_FATAL_FAILURE(InitState());
3993
3994 VkAttachmentDescription attachment = {
3995 0,
3996 VK_FORMAT_D32_SFLOAT_S8_UINT,
3997 VK_SAMPLE_COUNT_1_BIT,
3998 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
3999 VK_ATTACHMENT_STORE_OP_STORE,
4000 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4001 VK_ATTACHMENT_STORE_OP_DONT_CARE,
4002 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4003 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
4004
4005 VkAttachmentReference att_ref = {
4006 0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
4007
4008 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4009 0, nullptr,
4010 0, nullptr,
4011 nullptr, &att_ref,
4012 0, nullptr};
4013
4014 VkSubpassDependency dep = {0,
4015 0,
4016 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4017 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4018 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4019 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4020 VK_DEPENDENCY_BY_REGION_BIT};
4021
4022 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
4023 nullptr,
4024 0,
4025 1,
4026 &attachment,
4027 1,
4028 &subpass,
4029 1,
4030 &dep};
4031
4032 VkResult err;
4033 VkRenderPass rp;
4034 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4035 ASSERT_VK_SUCCESS(err);
4036
4037 VkImageObj image(m_device);
4038 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
4039 0x26, // usage
4040 VK_IMAGE_TILING_OPTIMAL, 0);
4041 ASSERT_TRUE(image.initialized());
4042 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
4043
4044 VkImageViewCreateInfo ivci = {
4045 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4046 nullptr,
4047 0,
4048 image.handle(),
4049 VK_IMAGE_VIEW_TYPE_2D,
4050 VK_FORMAT_D32_SFLOAT_S8_UINT,
4051 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B,
4052 VK_COMPONENT_SWIZZLE_A},
4053 {0x2, 0, 1, 0, 1},
4054 };
4055 VkImageView view;
4056 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4057 ASSERT_VK_SUCCESS(err);
4058
4059 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
4060 nullptr,
4061 0,
4062 rp,
4063 1,
4064 &view,
4065 32,
4066 32,
4067 1};
4068 VkFramebuffer fb;
4069 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4070 ASSERT_VK_SUCCESS(err);
4071
4072 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
4073 nullptr,
4074 rp,
4075 fb,
4076 {{0, 0}, {32, 32}},
4077 0,
4078 nullptr};
4079 BeginCommandBuffer();
4080 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4081 VK_SUBPASS_CONTENTS_INLINE);
4082
4083 VkImageMemoryBarrier imb = {};
4084 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4085 imb.pNext = nullptr;
4086 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4087 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4088 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4089 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4090 imb.srcQueueFamilyIndex = 0;
4091 imb.dstQueueFamilyIndex = 0;
4092 imb.image = image.handle();
4093 imb.subresourceRange.aspectMask = 0x6;
4094 imb.subresourceRange.baseMipLevel = 0;
4095 imb.subresourceRange.levelCount = 0x1;
4096 imb.subresourceRange.baseArrayLayer = 0;
4097 imb.subresourceRange.layerCount = 0x1;
4098
4099 vkCmdPipelineBarrier(m_commandBuffer->handle(),
4100 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4101 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4102 VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
4103 &imb);
4104
4105 vkCmdEndRenderPass(m_commandBuffer->handle());
4106 EndCommandBuffer();
4107 QueueCommandBuffer(false);
4108 m_errorMonitor->VerifyNotFound();
4109
4110 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4111 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4112 vkDestroyImageView(m_device->device(), view, nullptr);
4113}
Tony Barbourd5f7b822016-08-02 15:39:33 -06004114
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004115TEST_F(VkLayerTest, RenderPassTransitionsAttachmentUnused) {
4116 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
4117 "errors, when an attachment reference is "
4118 "VK_ATTACHMENT_UNUSED");
4119
4120 m_errorMonitor->ExpectSuccess();
4121
4122 ASSERT_NO_FATAL_FAILURE(InitState());
4123
4124 // A renderpass with no attachments
4125 VkAttachmentReference att_ref = {
4126 VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4127 };
4128
4129 VkSubpassDescription subpass = {
4130 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
4131 1, &att_ref, nullptr, nullptr, 0, nullptr
4132 };
4133
4134 VkRenderPassCreateInfo rpci = {
4135 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4136 0, 0, nullptr, 1, &subpass, 0, nullptr
4137 };
4138
4139 VkRenderPass rp;
4140 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4141 ASSERT_VK_SUCCESS(err);
4142
4143 // A compatible framebuffer.
4144 VkFramebufferCreateInfo fci = {
4145 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
4146 0, rp, 0, nullptr,
4147 32, 32, 1
4148 };
4149 VkFramebuffer fb;
4150 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4151 ASSERT_VK_SUCCESS(err);
4152
4153 // Record a command buffer which just begins and ends the renderpass. The
4154 // bug manifests in BeginRenderPass.
4155 VkRenderPassBeginInfo rpbi = {
4156 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06004157 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004158 0, nullptr
4159 };
4160 BeginCommandBuffer();
4161 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4162 VK_SUBPASS_CONTENTS_INLINE);
4163 vkCmdEndRenderPass(m_commandBuffer->handle());
4164 m_errorMonitor->VerifyNotFound();
4165 EndCommandBuffer();
4166
4167 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4168 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4169}
4170
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004171// This is a positive test. No errors are expected.
4172TEST_F(VkLayerTest, StencilLoadOp) {
4173 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
4174 "CLEAR. stencil[Load|Store]Op used to be ignored.");
4175 VkResult result = VK_SUCCESS;
4176 VkImageFormatProperties formatProps;
4177 vkGetPhysicalDeviceImageFormatProperties(
4178 gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D,
4179 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4180 VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
4181 0, &formatProps);
4182 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
4183 return;
4184 }
4185
4186 ASSERT_NO_FATAL_FAILURE(InitState());
4187 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
4188 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
4189 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4190 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
4191 VkAttachmentDescription att = {};
4192 VkAttachmentReference ref = {};
4193 att.format = depth_stencil_fmt;
4194 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
4195 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
4196 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
4197 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
4198 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4199 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4200
4201 VkClearValue clear;
4202 clear.depthStencil.depth = 1.0;
4203 clear.depthStencil.stencil = 0;
4204 ref.attachment = 0;
4205 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4206
4207 VkSubpassDescription subpass = {};
4208 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
4209 subpass.flags = 0;
4210 subpass.inputAttachmentCount = 0;
4211 subpass.pInputAttachments = NULL;
4212 subpass.colorAttachmentCount = 0;
4213 subpass.pColorAttachments = NULL;
4214 subpass.pResolveAttachments = NULL;
4215 subpass.pDepthStencilAttachment = &ref;
4216 subpass.preserveAttachmentCount = 0;
4217 subpass.pPreserveAttachments = NULL;
4218
4219 VkRenderPass rp;
4220 VkRenderPassCreateInfo rp_info = {};
4221 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4222 rp_info.attachmentCount = 1;
4223 rp_info.pAttachments = &att;
4224 rp_info.subpassCount = 1;
4225 rp_info.pSubpasses = &subpass;
4226 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
4227 ASSERT_VK_SUCCESS(result);
4228
4229 VkImageView *depthView = m_depthStencil->BindInfo();
4230 VkFramebufferCreateInfo fb_info = {};
4231 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4232 fb_info.pNext = NULL;
4233 fb_info.renderPass = rp;
4234 fb_info.attachmentCount = 1;
4235 fb_info.pAttachments = depthView;
4236 fb_info.width = 100;
4237 fb_info.height = 100;
4238 fb_info.layers = 1;
4239 VkFramebuffer fb;
4240 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4241 ASSERT_VK_SUCCESS(result);
4242
4243
4244 VkRenderPassBeginInfo rpbinfo = {};
4245 rpbinfo.clearValueCount = 1;
4246 rpbinfo.pClearValues = &clear;
4247 rpbinfo.pNext = NULL;
4248 rpbinfo.renderPass = rp;
4249 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4250 rpbinfo.renderArea.extent.width = 100;
4251 rpbinfo.renderArea.extent.height = 100;
4252 rpbinfo.renderArea.offset.x = 0;
4253 rpbinfo.renderArea.offset.y = 0;
4254 rpbinfo.framebuffer = fb;
4255
4256 VkFence fence = {};
4257 VkFenceCreateInfo fence_ci = {};
4258 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4259 fence_ci.pNext = nullptr;
4260 fence_ci.flags = 0;
4261 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
4262 ASSERT_VK_SUCCESS(result);
4263
4264
4265 m_commandBuffer->BeginCommandBuffer();
4266 m_commandBuffer->BeginRenderPass(rpbinfo);
4267 m_commandBuffer->EndRenderPass();
4268 m_commandBuffer->EndCommandBuffer();
4269 m_commandBuffer->QueueCommandBuffer(fence);
4270
4271 VkImageObj destImage(m_device);
4272 destImage.init(100, 100, depth_stencil_fmt,
4273 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4274 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4275 VK_IMAGE_TILING_OPTIMAL, 0);
4276 VkImageMemoryBarrier barrier = {};
4277 VkImageSubresourceRange range;
4278 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4279 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4280 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4281 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT |
4282 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
4283 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4284 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
4285 barrier.image = m_depthStencil->handle();
4286 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4287 range.baseMipLevel = 0;
4288 range.levelCount = 1;
4289 range.baseArrayLayer = 0;
4290 range.layerCount = 1;
4291 barrier.subresourceRange = range;
4292 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4293 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
4294 cmdbuf.BeginCommandBuffer();
4295 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4296 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4297 nullptr, 1, &barrier);
4298 barrier.srcAccessMask = 0;
4299 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4300 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
4301 barrier.image = destImage.handle();
4302 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4303 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4304 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4305 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4306 nullptr, 1, &barrier);
4307 VkImageCopy cregion;
4308 cregion.srcSubresource.aspectMask =
4309 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4310 cregion.srcSubresource.mipLevel = 0;
4311 cregion.srcSubresource.baseArrayLayer = 0;
4312 cregion.srcSubresource.layerCount = 1;
4313 cregion.srcOffset.x = 0;
4314 cregion.srcOffset.y = 0;
4315 cregion.srcOffset.z = 0;
4316 cregion.dstSubresource.aspectMask =
4317 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4318 cregion.dstSubresource.mipLevel = 0;
4319 cregion.dstSubresource.baseArrayLayer = 0;
4320 cregion.dstSubresource.layerCount = 1;
4321 cregion.dstOffset.x = 0;
4322 cregion.dstOffset.y = 0;
4323 cregion.dstOffset.z = 0;
4324 cregion.extent.width = 100;
4325 cregion.extent.height = 100;
4326 cregion.extent.depth = 1;
4327 cmdbuf.CopyImage(m_depthStencil->handle(),
4328 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
4329 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
4330 cmdbuf.EndCommandBuffer();
4331
4332 VkSubmitInfo submit_info;
4333 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4334 submit_info.pNext = NULL;
4335 submit_info.waitSemaphoreCount = 0;
4336 submit_info.pWaitSemaphores = NULL;
4337 submit_info.pWaitDstStageMask = NULL;
4338 submit_info.commandBufferCount = 1;
4339 submit_info.pCommandBuffers = &cmdbuf.handle();
4340 submit_info.signalSemaphoreCount = 0;
4341 submit_info.pSignalSemaphores = NULL;
4342
4343 m_errorMonitor->ExpectSuccess();
4344 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4345 m_errorMonitor->VerifyNotFound();
4346
Mark Lobodzinskid0440da2016-06-17 15:10:03 -06004347 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004348 vkDestroyFence(m_device->device(), fence, nullptr);
4349 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4350 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4351}
4352
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004353TEST_F(VkLayerTest, UnusedPreserveAttachment) {
4354 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
4355 "attachment reference of VK_ATTACHMENT_UNUSED");
4356
4357 ASSERT_NO_FATAL_FAILURE(InitState());
4358 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4359
4360 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4361 "must not be VK_ATTACHMENT_UNUSED");
4362
4363 VkAttachmentReference color_attach = {};
4364 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4365 color_attach.attachment = 0;
4366 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
4367 VkSubpassDescription subpass = {};
4368 subpass.colorAttachmentCount = 1;
4369 subpass.pColorAttachments = &color_attach;
4370 subpass.preserveAttachmentCount = 1;
4371 subpass.pPreserveAttachments = &preserve_attachment;
4372
4373 VkRenderPassCreateInfo rpci = {};
4374 rpci.subpassCount = 1;
4375 rpci.pSubpasses = &subpass;
4376 rpci.attachmentCount = 1;
4377 VkAttachmentDescription attach_desc = {};
4378 attach_desc.format = VK_FORMAT_UNDEFINED;
4379 rpci.pAttachments = &attach_desc;
4380 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4381 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004382 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004383
4384 m_errorMonitor->VerifyFound();
4385
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004386 if (result == VK_SUCCESS) {
4387 vkDestroyRenderPass(m_device->device(), rp, NULL);
4388 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004389}
4390
Chris Forbesc5389742016-06-29 11:49:23 +12004391TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004392 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
4393 "when the source of a subpass multisample resolve "
4394 "does not have multiple samples.");
4395
Chris Forbesc5389742016-06-29 11:49:23 +12004396 ASSERT_NO_FATAL_FAILURE(InitState());
4397
4398 m_errorMonitor->SetDesiredFailureMsg(
4399 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbes6655bb32016-07-01 18:27:30 +12004400 "Subpass 0 requests multisample resolve from attachment 0 which has "
4401 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12004402
4403 VkAttachmentDescription attachments[] = {
4404 {
4405 0, VK_FORMAT_R8G8B8A8_UNORM,
4406 VK_SAMPLE_COUNT_1_BIT,
4407 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4408 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4409 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4410 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4411 },
4412 {
4413 0, VK_FORMAT_R8G8B8A8_UNORM,
4414 VK_SAMPLE_COUNT_1_BIT,
4415 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4416 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4417 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4418 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4419 },
4420 };
4421
4422 VkAttachmentReference color = {
4423 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4424 };
4425
4426 VkAttachmentReference resolve = {
4427 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4428 };
4429
4430 VkSubpassDescription subpass = {
4431 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4432 0, nullptr,
4433 1, &color,
4434 &resolve,
4435 nullptr,
4436 0, nullptr
4437 };
4438
4439 VkRenderPassCreateInfo rpci = {
4440 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4441 0, 2, attachments, 1, &subpass, 0, nullptr
4442 };
4443
4444 VkRenderPass rp;
4445 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4446
4447 m_errorMonitor->VerifyFound();
4448
4449 if (err == VK_SUCCESS)
4450 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4451}
4452
4453TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004454 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4455 "when a subpass multisample resolve operation is "
4456 "requested, and the destination of that resolve has "
4457 "multiple samples.");
4458
Chris Forbesc5389742016-06-29 11:49:23 +12004459 ASSERT_NO_FATAL_FAILURE(InitState());
4460
4461 m_errorMonitor->SetDesiredFailureMsg(
4462 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4463 "Subpass 0 requests multisample resolve into attachment 1, which "
4464 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
4465
4466 VkAttachmentDescription attachments[] = {
4467 {
4468 0, VK_FORMAT_R8G8B8A8_UNORM,
4469 VK_SAMPLE_COUNT_4_BIT,
4470 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4471 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4472 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4473 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4474 },
4475 {
4476 0, VK_FORMAT_R8G8B8A8_UNORM,
4477 VK_SAMPLE_COUNT_4_BIT,
4478 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4479 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4480 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4481 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4482 },
4483 };
4484
4485 VkAttachmentReference color = {
4486 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4487 };
4488
4489 VkAttachmentReference resolve = {
4490 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4491 };
4492
4493 VkSubpassDescription subpass = {
4494 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4495 0, nullptr,
4496 1, &color,
4497 &resolve,
4498 nullptr,
4499 0, nullptr
4500 };
4501
4502 VkRenderPassCreateInfo rpci = {
4503 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4504 0, 2, attachments, 1, &subpass, 0, nullptr
4505 };
4506
4507 VkRenderPass rp;
4508 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4509
4510 m_errorMonitor->VerifyFound();
4511
4512 if (err == VK_SUCCESS)
4513 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4514}
4515
Chris Forbes3f128ef2016-06-29 14:58:53 +12004516TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004517 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4518 "when the color and depth attachments used by a subpass "
4519 "have inconsistent sample counts");
4520
Chris Forbes3f128ef2016-06-29 14:58:53 +12004521 ASSERT_NO_FATAL_FAILURE(InitState());
4522
4523 m_errorMonitor->SetDesiredFailureMsg(
4524 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4525 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
4526
4527 VkAttachmentDescription attachments[] = {
4528 {
4529 0, VK_FORMAT_R8G8B8A8_UNORM,
4530 VK_SAMPLE_COUNT_1_BIT,
4531 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4532 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4533 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4534 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4535 },
4536 {
4537 0, VK_FORMAT_R8G8B8A8_UNORM,
4538 VK_SAMPLE_COUNT_4_BIT,
4539 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4540 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4541 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4542 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4543 },
4544 };
4545
4546 VkAttachmentReference color[] = {
4547 {
4548 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4549 },
4550 {
4551 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4552 },
4553 };
4554
4555 VkSubpassDescription subpass = {
4556 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4557 0, nullptr,
4558 2, color,
4559 nullptr,
4560 nullptr,
4561 0, nullptr
4562 };
4563
4564 VkRenderPassCreateInfo rpci = {
4565 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4566 0, 2, attachments, 1, &subpass, 0, nullptr
4567 };
4568
4569 VkRenderPass rp;
4570 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4571
4572 m_errorMonitor->VerifyFound();
4573
4574 if (err == VK_SUCCESS)
4575 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4576}
4577
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004578TEST_F(VkLayerTest, FramebufferCreateErrors) {
4579 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
4580 " 1. Mismatch between fb & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004581 " 2. Use a color image as depthStencil attachment\n"
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004582 " 3. Mismatch fb & renderPass attachment formats\n"
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004583 " 4. Mismatch fb & renderPass attachment #samples\n"
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004584 " 5. FB attachment w/ non-1 mip-levels\n"
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004585 " 6. FB attachment where dimensions don't match\n"
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004586 " 7. FB attachment w/o identity swizzle\n"
4587 " 8. FB dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004588
4589 ASSERT_NO_FATAL_FAILURE(InitState());
4590 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4591
4592 m_errorMonitor->SetDesiredFailureMsg(
4593 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004594 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
4595 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004596
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004597 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004598 VkAttachmentReference attach = {};
4599 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4600 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004601 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004602 VkRenderPassCreateInfo rpci = {};
4603 rpci.subpassCount = 1;
4604 rpci.pSubpasses = &subpass;
4605 rpci.attachmentCount = 1;
4606 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004607 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004608 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004609 rpci.pAttachments = &attach_desc;
4610 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4611 VkRenderPass rp;
4612 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4613 ASSERT_VK_SUCCESS(err);
4614
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004615 VkImageView ivs[2];
4616 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
4617 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004618 VkFramebufferCreateInfo fb_info = {};
4619 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4620 fb_info.pNext = NULL;
4621 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004622 // Set mis-matching attachmentCount
4623 fb_info.attachmentCount = 2;
4624 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004625 fb_info.width = 100;
4626 fb_info.height = 100;
4627 fb_info.layers = 1;
4628
4629 VkFramebuffer fb;
4630 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4631
4632 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004633 if (err == VK_SUCCESS) {
4634 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4635 }
4636 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004637
4638 // Create a renderPass with a depth-stencil attachment created with
4639 // IMAGE_USAGE_COLOR_ATTACHMENT
4640 // Add our color attachment to pDepthStencilAttachment
4641 subpass.pDepthStencilAttachment = &attach;
4642 subpass.pColorAttachments = NULL;
4643 VkRenderPass rp_ds;
4644 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
4645 ASSERT_VK_SUCCESS(err);
4646 // Set correct attachment count, but attachment has COLOR usage bit set
4647 fb_info.attachmentCount = 1;
4648 fb_info.renderPass = rp_ds;
4649
4650 m_errorMonitor->SetDesiredFailureMsg(
4651 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4652 " conflicts with the image's IMAGE_USAGE flags ");
4653 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4654
4655 m_errorMonitor->VerifyFound();
4656 if (err == VK_SUCCESS) {
4657 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4658 }
4659 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004660
4661 // Create new renderpass with alternate attachment format from fb
4662 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
4663 subpass.pDepthStencilAttachment = NULL;
4664 subpass.pColorAttachments = &attach;
4665 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4666 ASSERT_VK_SUCCESS(err);
4667
4668 // Cause error due to mis-matched formats between rp & fb
4669 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
4670 fb_info.renderPass = rp;
4671 m_errorMonitor->SetDesiredFailureMsg(
4672 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4673 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
4674 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4675
4676 m_errorMonitor->VerifyFound();
4677 if (err == VK_SUCCESS) {
4678 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4679 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004680 vkDestroyRenderPass(m_device->device(), rp, NULL);
4681
4682 // Create new renderpass with alternate sample count from fb
4683 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4684 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
4685 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4686 ASSERT_VK_SUCCESS(err);
4687
4688 // Cause error due to mis-matched sample count between rp & fb
4689 fb_info.renderPass = rp;
4690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4691 " has VK_SAMPLE_COUNT_1_BIT samples "
4692 "that do not match the "
4693 "VK_SAMPLE_COUNT_4_BIT ");
4694 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4695
4696 m_errorMonitor->VerifyFound();
4697 if (err == VK_SUCCESS) {
4698 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4699 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004700
4701 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004702
4703 // Create a custom imageView with non-1 mip levels
4704 VkImageObj image(m_device);
4705 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
4706 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4707 ASSERT_TRUE(image.initialized());
4708
4709 VkImageView view;
4710 VkImageViewCreateInfo ivci = {};
4711 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4712 ivci.image = image.handle();
4713 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4714 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4715 ivci.subresourceRange.layerCount = 1;
4716 ivci.subresourceRange.baseMipLevel = 0;
4717 // Set level count 2 (only 1 is allowed for FB attachment)
4718 ivci.subresourceRange.levelCount = 2;
4719 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4720 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4721 ASSERT_VK_SUCCESS(err);
4722 // Re-create renderpass to have matching sample count
4723 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4724 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4725 ASSERT_VK_SUCCESS(err);
4726
4727 fb_info.renderPass = rp;
4728 fb_info.pAttachments = &view;
4729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4730 " has mip levelCount of 2 but only ");
4731 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4732
4733 m_errorMonitor->VerifyFound();
4734 if (err == VK_SUCCESS) {
4735 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4736 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004737 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004738 // Update view to original color buffer and grow FB dimensions too big
4739 fb_info.pAttachments = ivs;
4740 fb_info.height = 1024;
4741 fb_info.width = 1024;
4742 fb_info.layers = 2;
4743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4744 " Attachment dimensions must be at "
4745 "least as large. ");
4746 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4747
4748 m_errorMonitor->VerifyFound();
4749 if (err == VK_SUCCESS) {
4750 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4751 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004752 // Create view attachment with non-identity swizzle
4753 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4754 ivci.image = image.handle();
4755 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4756 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4757 ivci.subresourceRange.layerCount = 1;
4758 ivci.subresourceRange.baseMipLevel = 0;
4759 ivci.subresourceRange.levelCount = 1;
4760 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4761 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4762 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4763 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4764 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4765 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4766 ASSERT_VK_SUCCESS(err);
4767
4768 fb_info.pAttachments = &view;
4769 fb_info.height = 100;
4770 fb_info.width = 100;
4771 fb_info.layers = 1;
4772 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4773 " has non-identy swizzle. All "
4774 "framebuffer attachments must have "
4775 "been created with the identity "
4776 "swizzle. ");
4777 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4778
4779 m_errorMonitor->VerifyFound();
4780 if (err == VK_SUCCESS) {
4781 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4782 }
4783 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004784 // Request fb that exceeds max dimensions
4785 // reset attachment to color attachment
4786 fb_info.pAttachments = ivs;
4787 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
4788 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
4789 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
4790 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4791 " Requested VkFramebufferCreateInfo "
4792 "dimensions exceed physical device "
4793 "limits. ");
4794 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4795
4796 m_errorMonitor->VerifyFound();
4797 if (err == VK_SUCCESS) {
4798 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4799 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004800
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004801 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004802}
4803
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004804// This is a positive test. No errors should be generated.
Michael Lentine860b0fe2016-05-20 10:14:00 -05004805TEST_F(VkLayerTest, WaitEventThenSet) {
4806 TEST_DESCRIPTION(
4807 "Wait on a event then set it after the wait has been submitted.");
4808
Michael Lentine860b0fe2016-05-20 10:14:00 -05004809 m_errorMonitor->ExpectSuccess();
4810
4811 VkEvent event;
4812 VkEventCreateInfo event_create_info{};
4813 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4814 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
4815
4816 VkCommandPool command_pool;
4817 VkCommandPoolCreateInfo pool_create_info{};
4818 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4819 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4820 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4821 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4822 &command_pool);
4823
4824 VkCommandBuffer command_buffer;
4825 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4826 command_buffer_allocate_info.sType =
4827 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4828 command_buffer_allocate_info.commandPool = command_pool;
4829 command_buffer_allocate_info.commandBufferCount = 1;
4830 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4831 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4832 &command_buffer);
4833
4834 VkQueue queue = VK_NULL_HANDLE;
4835 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06004836 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05004837
4838 {
4839 VkCommandBufferBeginInfo begin_info{};
4840 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4841 vkBeginCommandBuffer(command_buffer, &begin_info);
4842
4843 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT,
4844 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
4845 nullptr, 0, nullptr);
4846 vkCmdResetEvent(command_buffer, event,
4847 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
4848 vkEndCommandBuffer(command_buffer);
4849 }
4850 {
4851 VkSubmitInfo submit_info{};
4852 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4853 submit_info.commandBufferCount = 1;
4854 submit_info.pCommandBuffers = &command_buffer;
4855 submit_info.signalSemaphoreCount = 0;
4856 submit_info.pSignalSemaphores = nullptr;
4857 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4858 }
4859 { vkSetEvent(m_device->device(), event); }
4860
4861 vkQueueWaitIdle(queue);
4862
4863 vkDestroyEvent(m_device->device(), event, nullptr);
4864 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
4865 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4866
4867 m_errorMonitor->VerifyNotFound();
4868}
Michael Lentine5627e692016-05-20 17:45:02 -05004869// This is a positive test. No errors should be generated.
Michael Lentinef01fb382016-07-21 17:24:56 -05004870TEST_F(VkLayerTest, QueryAndCopySecondaryCommandBuffers) {
4871 TEST_DESCRIPTION(
4872 "Issue a query on a secondary command buffery and copy it on a primary.");
4873
4874 if ((m_device->queue_props.empty()) ||
4875 (m_device->queue_props[0].queueCount < 2))
4876 return;
4877
4878 m_errorMonitor->ExpectSuccess();
4879
4880 VkQueryPool query_pool;
4881 VkQueryPoolCreateInfo query_pool_create_info{};
4882 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
4883 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
4884 query_pool_create_info.queryCount = 1;
4885 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
4886 &query_pool);
4887
4888 VkCommandPool command_pool;
4889 VkCommandPoolCreateInfo pool_create_info{};
4890 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4891 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4892 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4893 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4894 &command_pool);
4895
4896 VkCommandBuffer command_buffer;
4897 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4898 command_buffer_allocate_info.sType =
4899 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4900 command_buffer_allocate_info.commandPool = command_pool;
4901 command_buffer_allocate_info.commandBufferCount = 1;
4902 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4903 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4904 &command_buffer);
4905
4906 VkCommandBuffer secondary_command_buffer;
4907 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
4908 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4909 &secondary_command_buffer);
4910
4911 VkQueue queue = VK_NULL_HANDLE;
4912 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4913 1, &queue);
4914
4915 uint32_t qfi = 0;
4916 VkBufferCreateInfo buff_create_info = {};
4917 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4918 buff_create_info.size = 1024;
4919 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
4920 buff_create_info.queueFamilyIndexCount = 1;
4921 buff_create_info.pQueueFamilyIndices = &qfi;
4922
4923 VkResult err;
4924 VkBuffer buffer;
4925 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
4926 ASSERT_VK_SUCCESS(err);
4927 VkMemoryAllocateInfo mem_alloc = {};
4928 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4929 mem_alloc.pNext = NULL;
4930 mem_alloc.allocationSize = 1024;
4931 mem_alloc.memoryTypeIndex = 0;
4932
4933 VkMemoryRequirements memReqs;
4934 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
4935 bool pass =
4936 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
4937 if (!pass) {
4938 vkDestroyBuffer(m_device->device(), buffer, NULL);
4939 return;
4940 }
4941
4942 VkDeviceMemory mem;
4943 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
4944 ASSERT_VK_SUCCESS(err);
4945 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4946 ASSERT_VK_SUCCESS(err);
4947
4948 VkCommandBufferInheritanceInfo hinfo = {};
4949 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
4950 hinfo.renderPass = VK_NULL_HANDLE;
4951 hinfo.subpass = 0;
4952 hinfo.framebuffer = VK_NULL_HANDLE;
4953 hinfo.occlusionQueryEnable = VK_FALSE;
4954 hinfo.queryFlags = 0;
4955 hinfo.pipelineStatistics = 0;
4956
4957 {
4958 VkCommandBufferBeginInfo begin_info{};
4959 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4960 begin_info.pInheritanceInfo = &hinfo;
4961 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
4962
4963 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
4964 vkCmdWriteTimestamp(secondary_command_buffer,
4965 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
4966
4967 vkEndCommandBuffer(secondary_command_buffer);
4968
4969 begin_info.pInheritanceInfo = nullptr;
4970 vkBeginCommandBuffer(command_buffer, &begin_info);
4971
4972 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
4973 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer,
4974 0, 0, 0);
4975
4976 vkEndCommandBuffer(command_buffer);
4977 }
4978 {
4979 VkSubmitInfo submit_info{};
4980 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4981 submit_info.commandBufferCount = 1;
4982 submit_info.pCommandBuffers = &command_buffer;
4983 submit_info.signalSemaphoreCount = 0;
4984 submit_info.pSignalSemaphores = nullptr;
4985 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4986 }
4987
4988 vkQueueWaitIdle(queue);
4989
4990 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
4991 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
4992 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
4993 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4994 vkDestroyBuffer(m_device->device(), buffer, NULL);
4995 vkFreeMemory(m_device->device(), mem, NULL);
4996
4997 m_errorMonitor->VerifyNotFound();
4998}
4999
5000// This is a positive test. No errors should be generated.
Michael Lentine5627e692016-05-20 17:45:02 -05005001TEST_F(VkLayerTest, QueryAndCopyMultipleCommandBuffers) {
5002 TEST_DESCRIPTION(
5003 "Issue a query and copy from it on a second command buffer.");
5004
5005 if ((m_device->queue_props.empty()) ||
5006 (m_device->queue_props[0].queueCount < 2))
5007 return;
5008
5009 m_errorMonitor->ExpectSuccess();
5010
5011 VkQueryPool query_pool;
5012 VkQueryPoolCreateInfo query_pool_create_info{};
5013 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5014 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
5015 query_pool_create_info.queryCount = 1;
5016 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
5017 &query_pool);
5018
5019 VkCommandPool command_pool;
5020 VkCommandPoolCreateInfo pool_create_info{};
5021 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5022 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5023 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5024 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5025 &command_pool);
5026
5027 VkCommandBuffer command_buffer[2];
5028 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5029 command_buffer_allocate_info.sType =
5030 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5031 command_buffer_allocate_info.commandPool = command_pool;
5032 command_buffer_allocate_info.commandBufferCount = 2;
5033 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5034 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5035 command_buffer);
5036
5037 VkQueue queue = VK_NULL_HANDLE;
5038 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5039 1, &queue);
5040
5041 uint32_t qfi = 0;
5042 VkBufferCreateInfo buff_create_info = {};
5043 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5044 buff_create_info.size = 1024;
5045 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
5046 buff_create_info.queueFamilyIndexCount = 1;
5047 buff_create_info.pQueueFamilyIndices = &qfi;
5048
5049 VkResult err;
5050 VkBuffer buffer;
5051 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
5052 ASSERT_VK_SUCCESS(err);
5053 VkMemoryAllocateInfo mem_alloc = {};
5054 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5055 mem_alloc.pNext = NULL;
5056 mem_alloc.allocationSize = 1024;
5057 mem_alloc.memoryTypeIndex = 0;
5058
5059 VkMemoryRequirements memReqs;
5060 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
5061 bool pass =
5062 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
5063 if (!pass) {
5064 vkDestroyBuffer(m_device->device(), buffer, NULL);
5065 return;
5066 }
5067
5068 VkDeviceMemory mem;
5069 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5070 ASSERT_VK_SUCCESS(err);
5071 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5072 ASSERT_VK_SUCCESS(err);
5073
5074 {
5075 VkCommandBufferBeginInfo begin_info{};
5076 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5077 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5078
5079 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
5080 vkCmdWriteTimestamp(command_buffer[0],
5081 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
5082
5083 vkEndCommandBuffer(command_buffer[0]);
5084
5085 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5086
5087 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer,
5088 0, 0, 0);
5089
5090 vkEndCommandBuffer(command_buffer[1]);
5091 }
5092 {
5093 VkSubmitInfo submit_info{};
5094 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5095 submit_info.commandBufferCount = 2;
5096 submit_info.pCommandBuffers = command_buffer;
5097 submit_info.signalSemaphoreCount = 0;
5098 submit_info.pSignalSemaphores = nullptr;
5099 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5100 }
5101
5102 vkQueueWaitIdle(queue);
5103
5104 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
5105 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
5106 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06005107 vkDestroyBuffer(m_device->device(), buffer, NULL);
5108 vkFreeMemory(m_device->device(), mem, NULL);
Michael Lentine5627e692016-05-20 17:45:02 -05005109
5110 m_errorMonitor->VerifyNotFound();
5111}
Michael Lentine860b0fe2016-05-20 10:14:00 -05005112
5113TEST_F(VkLayerTest, ResetEventThenSet) {
5114 TEST_DESCRIPTION(
5115 "Reset an event then set it after the reset has been submitted.");
5116
Michael Lentine860b0fe2016-05-20 10:14:00 -05005117 m_errorMonitor->ExpectSuccess();
5118
5119 VkEvent event;
5120 VkEventCreateInfo event_create_info{};
5121 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5122 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
5123
5124 VkCommandPool command_pool;
5125 VkCommandPoolCreateInfo pool_create_info{};
5126 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5127 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5128 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5129 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5130 &command_pool);
5131
5132 VkCommandBuffer command_buffer;
5133 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5134 command_buffer_allocate_info.sType =
5135 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5136 command_buffer_allocate_info.commandPool = command_pool;
5137 command_buffer_allocate_info.commandBufferCount = 1;
5138 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5139 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5140 &command_buffer);
5141
5142 VkQueue queue = VK_NULL_HANDLE;
5143 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06005144 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005145
5146 {
5147 VkCommandBufferBeginInfo begin_info{};
5148 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5149 vkBeginCommandBuffer(command_buffer, &begin_info);
5150
5151 vkCmdResetEvent(command_buffer, event,
5152 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
5153 vkCmdWaitEvents(command_buffer, 1, &event,
5154 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5155 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
5156 nullptr, 0, nullptr);
5157 vkEndCommandBuffer(command_buffer);
5158 }
5159 {
5160 VkSubmitInfo submit_info{};
5161 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5162 submit_info.commandBufferCount = 1;
5163 submit_info.pCommandBuffers = &command_buffer;
5164 submit_info.signalSemaphoreCount = 0;
5165 submit_info.pSignalSemaphores = nullptr;
5166 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5167 }
5168 {
5169 m_errorMonitor->SetDesiredFailureMsg(
5170 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkSetEvent() on event "
5171 "0x1 that is already in use by a "
5172 "command buffer.");
5173 vkSetEvent(m_device->device(), event);
5174 m_errorMonitor->VerifyFound();
5175 }
5176
5177 vkQueueWaitIdle(queue);
5178
5179 vkDestroyEvent(m_device->device(), event, nullptr);
5180 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5181 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5182}
5183
5184// This is a positive test. No errors should be generated.
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005185TEST_F(VkLayerTest, TwoFencesThreeFrames) {
5186 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
5187 "run through a Submit & WaitForFences cycle 3 times. This "
5188 "previously revealed a bug so running this positive test "
5189 "to prevent a regression.");
5190 m_errorMonitor->ExpectSuccess();
5191
5192 ASSERT_NO_FATAL_FAILURE(InitState());
5193 VkQueue queue = VK_NULL_HANDLE;
5194 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5195 0, &queue);
5196
5197 static const uint32_t NUM_OBJECTS = 2;
5198 static const uint32_t NUM_FRAMES = 3;
5199 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
5200 VkFence fences[NUM_OBJECTS] = {};
5201
5202 VkCommandPool cmd_pool;
5203 VkCommandPoolCreateInfo cmd_pool_ci = {};
5204 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5205 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
5206 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5207 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci,
5208 nullptr, &cmd_pool);
5209 ASSERT_VK_SUCCESS(err);
5210
5211 VkCommandBufferAllocateInfo cmd_buf_info = {};
5212 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5213 cmd_buf_info.commandPool = cmd_pool;
5214 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5215 cmd_buf_info.commandBufferCount = 1;
5216
5217 VkFenceCreateInfo fence_ci = {};
5218 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5219 fence_ci.pNext = nullptr;
5220 fence_ci.flags = 0;
5221
5222 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
5223 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info,
5224 &cmd_buffers[i]);
5225 ASSERT_VK_SUCCESS(err);
5226 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
5227 ASSERT_VK_SUCCESS(err);
5228 }
5229
5230 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
Tobin Ehlisf9025162016-05-26 06:55:21 -06005231 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
5232 // Create empty cmd buffer
5233 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
5234 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005235
Tobin Ehlisf9025162016-05-26 06:55:21 -06005236 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
5237 ASSERT_VK_SUCCESS(err);
5238 err = vkEndCommandBuffer(cmd_buffers[obj]);
5239 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005240
Tobin Ehlisf9025162016-05-26 06:55:21 -06005241 VkSubmitInfo submit_info = {};
5242 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5243 submit_info.commandBufferCount = 1;
5244 submit_info.pCommandBuffers = &cmd_buffers[obj];
5245 // Submit cmd buffer and wait for fence
5246 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
5247 ASSERT_VK_SUCCESS(err);
5248 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE,
5249 UINT64_MAX);
5250 ASSERT_VK_SUCCESS(err);
5251 err = vkResetFences(m_device->device(), 1, &fences[obj]);
5252 ASSERT_VK_SUCCESS(err);
5253 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005254 }
5255 m_errorMonitor->VerifyNotFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06005256 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
5257 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
5258 vkDestroyFence(m_device->device(), fences[i], nullptr);
5259 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005260}
5261// This is a positive test. No errors should be generated.
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005262TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
5263
5264 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5265 "submitted on separate queues followed by a QueueWaitIdle.");
5266
Dustin Graves48458142016-04-29 16:11:55 -06005267 if ((m_device->queue_props.empty()) ||
5268 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005269 return;
5270
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005271 m_errorMonitor->ExpectSuccess();
5272
5273 VkSemaphore semaphore;
5274 VkSemaphoreCreateInfo semaphore_create_info{};
5275 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5276 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5277 &semaphore);
5278
5279 VkCommandPool command_pool;
5280 VkCommandPoolCreateInfo pool_create_info{};
5281 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5282 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5283 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5284 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5285 &command_pool);
5286
5287 VkCommandBuffer command_buffer[2];
5288 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5289 command_buffer_allocate_info.sType =
5290 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5291 command_buffer_allocate_info.commandPool = command_pool;
5292 command_buffer_allocate_info.commandBufferCount = 2;
5293 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5294 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5295 command_buffer);
5296
5297 VkQueue queue = VK_NULL_HANDLE;
5298 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5299 1, &queue);
5300
5301 {
5302 VkCommandBufferBeginInfo begin_info{};
5303 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5304 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5305
5306 vkCmdPipelineBarrier(command_buffer[0],
5307 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5308 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5309 0, nullptr, 0, nullptr);
5310
5311 VkViewport viewport{};
5312 viewport.maxDepth = 1.0f;
5313 viewport.minDepth = 0.0f;
5314 viewport.width = 512;
5315 viewport.height = 512;
5316 viewport.x = 0;
5317 viewport.y = 0;
5318 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5319 vkEndCommandBuffer(command_buffer[0]);
5320 }
5321 {
5322 VkCommandBufferBeginInfo begin_info{};
5323 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5324 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5325
5326 VkViewport viewport{};
5327 viewport.maxDepth = 1.0f;
5328 viewport.minDepth = 0.0f;
5329 viewport.width = 512;
5330 viewport.height = 512;
5331 viewport.x = 0;
5332 viewport.y = 0;
5333 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5334 vkEndCommandBuffer(command_buffer[1]);
5335 }
5336 {
5337 VkSubmitInfo submit_info{};
5338 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5339 submit_info.commandBufferCount = 1;
5340 submit_info.pCommandBuffers = &command_buffer[0];
5341 submit_info.signalSemaphoreCount = 1;
5342 submit_info.pSignalSemaphores = &semaphore;
5343 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5344 }
5345 {
5346 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5347 VkSubmitInfo submit_info{};
5348 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5349 submit_info.commandBufferCount = 1;
5350 submit_info.pCommandBuffers = &command_buffer[1];
5351 submit_info.waitSemaphoreCount = 1;
5352 submit_info.pWaitSemaphores = &semaphore;
5353 submit_info.pWaitDstStageMask = flags;
5354 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5355 }
5356
5357 vkQueueWaitIdle(m_device->m_queue);
5358
5359 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5360 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5361 &command_buffer[0]);
5362 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5363
5364 m_errorMonitor->VerifyNotFound();
5365}
5366
5367// This is a positive test. No errors should be generated.
5368TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
5369
5370 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5371 "submitted on separate queues, the second having a fence"
5372 "followed by a QueueWaitIdle.");
5373
Dustin Graves48458142016-04-29 16:11:55 -06005374 if ((m_device->queue_props.empty()) ||
5375 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005376 return;
5377
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005378 m_errorMonitor->ExpectSuccess();
5379
5380 VkFence fence;
5381 VkFenceCreateInfo fence_create_info{};
5382 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5383 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5384
5385 VkSemaphore semaphore;
5386 VkSemaphoreCreateInfo semaphore_create_info{};
5387 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5388 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5389 &semaphore);
5390
5391 VkCommandPool command_pool;
5392 VkCommandPoolCreateInfo pool_create_info{};
5393 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5394 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5395 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5396 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5397 &command_pool);
5398
5399 VkCommandBuffer command_buffer[2];
5400 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5401 command_buffer_allocate_info.sType =
5402 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5403 command_buffer_allocate_info.commandPool = command_pool;
5404 command_buffer_allocate_info.commandBufferCount = 2;
5405 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5406 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5407 command_buffer);
5408
5409 VkQueue queue = VK_NULL_HANDLE;
5410 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5411 1, &queue);
5412
5413 {
5414 VkCommandBufferBeginInfo begin_info{};
5415 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5416 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5417
5418 vkCmdPipelineBarrier(command_buffer[0],
5419 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5420 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5421 0, nullptr, 0, nullptr);
5422
5423 VkViewport viewport{};
5424 viewport.maxDepth = 1.0f;
5425 viewport.minDepth = 0.0f;
5426 viewport.width = 512;
5427 viewport.height = 512;
5428 viewport.x = 0;
5429 viewport.y = 0;
5430 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5431 vkEndCommandBuffer(command_buffer[0]);
5432 }
5433 {
5434 VkCommandBufferBeginInfo begin_info{};
5435 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5436 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5437
5438 VkViewport viewport{};
5439 viewport.maxDepth = 1.0f;
5440 viewport.minDepth = 0.0f;
5441 viewport.width = 512;
5442 viewport.height = 512;
5443 viewport.x = 0;
5444 viewport.y = 0;
5445 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5446 vkEndCommandBuffer(command_buffer[1]);
5447 }
5448 {
5449 VkSubmitInfo submit_info{};
5450 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5451 submit_info.commandBufferCount = 1;
5452 submit_info.pCommandBuffers = &command_buffer[0];
5453 submit_info.signalSemaphoreCount = 1;
5454 submit_info.pSignalSemaphores = &semaphore;
5455 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5456 }
5457 {
5458 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5459 VkSubmitInfo submit_info{};
5460 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5461 submit_info.commandBufferCount = 1;
5462 submit_info.pCommandBuffers = &command_buffer[1];
5463 submit_info.waitSemaphoreCount = 1;
5464 submit_info.pWaitSemaphores = &semaphore;
5465 submit_info.pWaitDstStageMask = flags;
5466 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5467 }
5468
5469 vkQueueWaitIdle(m_device->m_queue);
5470
5471 vkDestroyFence(m_device->device(), fence, nullptr);
5472 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5473 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5474 &command_buffer[0]);
5475 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5476
5477 m_errorMonitor->VerifyNotFound();
5478}
5479
5480// This is a positive test. No errors should be generated.
5481TEST_F(VkLayerTest,
5482 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
5483
5484 TEST_DESCRIPTION(
5485 "Two command buffers, each in a separate QueueSubmit call "
5486 "submitted on separate queues, the second having a fence"
5487 "followed by two consecutive WaitForFences calls on the same fence.");
5488
Dustin Graves48458142016-04-29 16:11:55 -06005489 if ((m_device->queue_props.empty()) ||
5490 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005491 return;
5492
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005493 m_errorMonitor->ExpectSuccess();
5494
5495 VkFence fence;
5496 VkFenceCreateInfo fence_create_info{};
5497 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5498 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5499
5500 VkSemaphore semaphore;
5501 VkSemaphoreCreateInfo semaphore_create_info{};
5502 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5503 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5504 &semaphore);
5505
5506 VkCommandPool command_pool;
5507 VkCommandPoolCreateInfo pool_create_info{};
5508 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5509 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5510 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5511 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5512 &command_pool);
5513
5514 VkCommandBuffer command_buffer[2];
5515 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5516 command_buffer_allocate_info.sType =
5517 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5518 command_buffer_allocate_info.commandPool = command_pool;
5519 command_buffer_allocate_info.commandBufferCount = 2;
5520 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5521 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5522 command_buffer);
5523
5524 VkQueue queue = VK_NULL_HANDLE;
5525 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5526 1, &queue);
5527
5528 {
5529 VkCommandBufferBeginInfo begin_info{};
5530 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5531 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5532
5533 vkCmdPipelineBarrier(command_buffer[0],
5534 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5535 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5536 0, nullptr, 0, nullptr);
5537
5538 VkViewport viewport{};
5539 viewport.maxDepth = 1.0f;
5540 viewport.minDepth = 0.0f;
5541 viewport.width = 512;
5542 viewport.height = 512;
5543 viewport.x = 0;
5544 viewport.y = 0;
5545 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5546 vkEndCommandBuffer(command_buffer[0]);
5547 }
5548 {
5549 VkCommandBufferBeginInfo begin_info{};
5550 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5551 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5552
5553 VkViewport viewport{};
5554 viewport.maxDepth = 1.0f;
5555 viewport.minDepth = 0.0f;
5556 viewport.width = 512;
5557 viewport.height = 512;
5558 viewport.x = 0;
5559 viewport.y = 0;
5560 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5561 vkEndCommandBuffer(command_buffer[1]);
5562 }
5563 {
5564 VkSubmitInfo submit_info{};
5565 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5566 submit_info.commandBufferCount = 1;
5567 submit_info.pCommandBuffers = &command_buffer[0];
5568 submit_info.signalSemaphoreCount = 1;
5569 submit_info.pSignalSemaphores = &semaphore;
5570 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5571 }
5572 {
5573 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5574 VkSubmitInfo submit_info{};
5575 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5576 submit_info.commandBufferCount = 1;
5577 submit_info.pCommandBuffers = &command_buffer[1];
5578 submit_info.waitSemaphoreCount = 1;
5579 submit_info.pWaitSemaphores = &semaphore;
5580 submit_info.pWaitDstStageMask = flags;
5581 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5582 }
5583
5584 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5585 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5586
5587 vkDestroyFence(m_device->device(), fence, nullptr);
5588 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5589 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5590 &command_buffer[0]);
5591 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5592
5593 m_errorMonitor->VerifyNotFound();
5594}
5595
Chris Forbes0f8126b2016-06-20 17:48:22 +12005596#if 0
5597TEST_F(VkLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
5598 if ((m_device->queue_props.empty()) ||
5599 (m_device->queue_props[0].queueCount < 2)) {
5600 printf("Test requires two queues, skipping\n");
5601 return;
5602 }
5603
5604 VkResult err;
5605
5606 m_errorMonitor->ExpectSuccess();
5607
5608 VkQueue q0 = m_device->m_queue;
5609 VkQueue q1 = nullptr;
5610 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
5611 ASSERT_NE(q1, nullptr);
5612
5613 // An (empty) command buffer. We must have work in the first submission --
5614 // the layer treats unfenced work differently from fenced work.
5615 VkCommandPoolCreateInfo cpci = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0 };
5616 VkCommandPool pool;
5617 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
5618 ASSERT_VK_SUCCESS(err);
5619 VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr,
5620 pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1
5621 };
5622 VkCommandBuffer cb;
5623 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
5624 ASSERT_VK_SUCCESS(err);
5625 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
5626 0, nullptr
5627 };
5628 err = vkBeginCommandBuffer(cb, &cbbi);
5629 ASSERT_VK_SUCCESS(err);
5630 err = vkEndCommandBuffer(cb);
5631 ASSERT_VK_SUCCESS(err);
5632
5633 // A semaphore
5634 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
5635 VkSemaphore s;
5636 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
5637 ASSERT_VK_SUCCESS(err);
5638
5639 // First submission, to q0
5640 VkSubmitInfo s0 = {
5641 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5642 0, nullptr, nullptr,
5643 1, &cb,
5644 1, &s
5645 };
5646
5647 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
5648 ASSERT_VK_SUCCESS(err);
5649
5650 // Second submission, to q1, waiting on s
5651 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
5652 VkSubmitInfo s1 = {
5653 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5654 1, &s, &waitmask,
5655 0, nullptr,
5656 0, nullptr
5657 };
5658
5659 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
5660 ASSERT_VK_SUCCESS(err);
5661
5662 // Wait for q0 idle
5663 err = vkQueueWaitIdle(q0);
5664 ASSERT_VK_SUCCESS(err);
5665
5666 // Command buffer should have been completed (it was on q0); reset the pool.
5667 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
5668
5669 m_errorMonitor->VerifyNotFound();
5670
5671 // Force device completely idle and clean up resources
5672 vkDeviceWaitIdle(m_device->device());
5673 vkDestroyCommandPool(m_device->device(), pool, nullptr);
5674 vkDestroySemaphore(m_device->device(), s, nullptr);
5675}
5676#endif
5677
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005678// This is a positive test. No errors should be generated.
5679TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
5680
5681 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5682 "submitted on separate queues, the second having a fence, "
5683 "followed by a WaitForFences call.");
5684
Dustin Graves48458142016-04-29 16:11:55 -06005685 if ((m_device->queue_props.empty()) ||
5686 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005687 return;
5688
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005689 m_errorMonitor->ExpectSuccess();
5690
5691 VkFence fence;
5692 VkFenceCreateInfo fence_create_info{};
5693 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5694 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5695
5696 VkSemaphore semaphore;
5697 VkSemaphoreCreateInfo semaphore_create_info{};
5698 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5699 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5700 &semaphore);
5701
5702 VkCommandPool command_pool;
5703 VkCommandPoolCreateInfo pool_create_info{};
5704 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5705 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5706 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5707 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5708 &command_pool);
5709
5710 VkCommandBuffer command_buffer[2];
5711 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5712 command_buffer_allocate_info.sType =
5713 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5714 command_buffer_allocate_info.commandPool = command_pool;
5715 command_buffer_allocate_info.commandBufferCount = 2;
5716 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5717 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5718 command_buffer);
5719
5720 VkQueue queue = VK_NULL_HANDLE;
5721 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5722 1, &queue);
5723
5724
5725 {
5726 VkCommandBufferBeginInfo begin_info{};
5727 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5728 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5729
5730 vkCmdPipelineBarrier(command_buffer[0],
5731 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5732 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5733 0, nullptr, 0, nullptr);
5734
5735 VkViewport viewport{};
5736 viewport.maxDepth = 1.0f;
5737 viewport.minDepth = 0.0f;
5738 viewport.width = 512;
5739 viewport.height = 512;
5740 viewport.x = 0;
5741 viewport.y = 0;
5742 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5743 vkEndCommandBuffer(command_buffer[0]);
5744 }
5745 {
5746 VkCommandBufferBeginInfo begin_info{};
5747 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5748 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5749
5750 VkViewport viewport{};
5751 viewport.maxDepth = 1.0f;
5752 viewport.minDepth = 0.0f;
5753 viewport.width = 512;
5754 viewport.height = 512;
5755 viewport.x = 0;
5756 viewport.y = 0;
5757 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5758 vkEndCommandBuffer(command_buffer[1]);
5759 }
5760 {
5761 VkSubmitInfo submit_info{};
5762 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5763 submit_info.commandBufferCount = 1;
5764 submit_info.pCommandBuffers = &command_buffer[0];
5765 submit_info.signalSemaphoreCount = 1;
5766 submit_info.pSignalSemaphores = &semaphore;
5767 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5768 }
5769 {
5770 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5771 VkSubmitInfo submit_info{};
5772 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5773 submit_info.commandBufferCount = 1;
5774 submit_info.pCommandBuffers = &command_buffer[1];
5775 submit_info.waitSemaphoreCount = 1;
5776 submit_info.pWaitSemaphores = &semaphore;
5777 submit_info.pWaitDstStageMask = flags;
5778 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5779 }
5780
5781 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5782
5783 vkDestroyFence(m_device->device(), fence, nullptr);
5784 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5785 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5786 &command_buffer[0]);
5787 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5788
5789 m_errorMonitor->VerifyNotFound();
5790}
5791
5792// This is a positive test. No errors should be generated.
5793TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
5794
5795 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5796 "on the same queue, sharing a signal/wait semaphore, the "
5797 "second having a fence, "
5798 "followed by a WaitForFences call.");
5799
5800 m_errorMonitor->ExpectSuccess();
5801
5802 VkFence fence;
5803 VkFenceCreateInfo fence_create_info{};
5804 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5805 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5806
5807 VkSemaphore semaphore;
5808 VkSemaphoreCreateInfo semaphore_create_info{};
5809 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5810 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5811 &semaphore);
5812
5813 VkCommandPool command_pool;
5814 VkCommandPoolCreateInfo pool_create_info{};
5815 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5816 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5817 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5818 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5819 &command_pool);
5820
5821 VkCommandBuffer command_buffer[2];
5822 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5823 command_buffer_allocate_info.sType =
5824 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5825 command_buffer_allocate_info.commandPool = command_pool;
5826 command_buffer_allocate_info.commandBufferCount = 2;
5827 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5828 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5829 command_buffer);
5830
5831 {
5832 VkCommandBufferBeginInfo begin_info{};
5833 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5834 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5835
5836 vkCmdPipelineBarrier(command_buffer[0],
5837 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5838 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5839 0, nullptr, 0, nullptr);
5840
5841 VkViewport viewport{};
5842 viewport.maxDepth = 1.0f;
5843 viewport.minDepth = 0.0f;
5844 viewport.width = 512;
5845 viewport.height = 512;
5846 viewport.x = 0;
5847 viewport.y = 0;
5848 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5849 vkEndCommandBuffer(command_buffer[0]);
5850 }
5851 {
5852 VkCommandBufferBeginInfo begin_info{};
5853 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5854 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5855
5856 VkViewport viewport{};
5857 viewport.maxDepth = 1.0f;
5858 viewport.minDepth = 0.0f;
5859 viewport.width = 512;
5860 viewport.height = 512;
5861 viewport.x = 0;
5862 viewport.y = 0;
5863 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5864 vkEndCommandBuffer(command_buffer[1]);
5865 }
5866 {
5867 VkSubmitInfo submit_info{};
5868 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5869 submit_info.commandBufferCount = 1;
5870 submit_info.pCommandBuffers = &command_buffer[0];
5871 submit_info.signalSemaphoreCount = 1;
5872 submit_info.pSignalSemaphores = &semaphore;
5873 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5874 }
5875 {
5876 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5877 VkSubmitInfo submit_info{};
5878 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5879 submit_info.commandBufferCount = 1;
5880 submit_info.pCommandBuffers = &command_buffer[1];
5881 submit_info.waitSemaphoreCount = 1;
5882 submit_info.pWaitSemaphores = &semaphore;
5883 submit_info.pWaitDstStageMask = flags;
5884 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5885 }
5886
5887 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5888
5889 vkDestroyFence(m_device->device(), fence, nullptr);
5890 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5891 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5892 &command_buffer[0]);
5893 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5894
5895 m_errorMonitor->VerifyNotFound();
5896}
5897
5898// This is a positive test. No errors should be generated.
5899TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
5900
5901 TEST_DESCRIPTION(
5902 "Two command buffers, each in a separate QueueSubmit call "
5903 "on the same queue, no fences, followed by a third QueueSubmit with NO "
5904 "SubmitInfos but with a fence, followed by a WaitForFences call.");
5905
5906 m_errorMonitor->ExpectSuccess();
5907
5908 VkFence fence;
5909 VkFenceCreateInfo fence_create_info{};
5910 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5911 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5912
5913 VkCommandPool command_pool;
5914 VkCommandPoolCreateInfo pool_create_info{};
5915 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5916 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5917 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5918 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5919 &command_pool);
5920
5921 VkCommandBuffer command_buffer[2];
5922 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5923 command_buffer_allocate_info.sType =
5924 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5925 command_buffer_allocate_info.commandPool = command_pool;
5926 command_buffer_allocate_info.commandBufferCount = 2;
5927 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5928 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5929 command_buffer);
5930
5931 {
5932 VkCommandBufferBeginInfo begin_info{};
5933 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5934 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5935
5936 vkCmdPipelineBarrier(command_buffer[0],
5937 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5938 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5939 0, nullptr, 0, nullptr);
5940
5941 VkViewport viewport{};
5942 viewport.maxDepth = 1.0f;
5943 viewport.minDepth = 0.0f;
5944 viewport.width = 512;
5945 viewport.height = 512;
5946 viewport.x = 0;
5947 viewport.y = 0;
5948 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5949 vkEndCommandBuffer(command_buffer[0]);
5950 }
5951 {
5952 VkCommandBufferBeginInfo begin_info{};
5953 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5954 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5955
5956 VkViewport viewport{};
5957 viewport.maxDepth = 1.0f;
5958 viewport.minDepth = 0.0f;
5959 viewport.width = 512;
5960 viewport.height = 512;
5961 viewport.x = 0;
5962 viewport.y = 0;
5963 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5964 vkEndCommandBuffer(command_buffer[1]);
5965 }
5966 {
5967 VkSubmitInfo submit_info{};
5968 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5969 submit_info.commandBufferCount = 1;
5970 submit_info.pCommandBuffers = &command_buffer[0];
5971 submit_info.signalSemaphoreCount = 0;
5972 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
5973 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5974 }
5975 {
5976 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5977 VkSubmitInfo submit_info{};
5978 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5979 submit_info.commandBufferCount = 1;
5980 submit_info.pCommandBuffers = &command_buffer[1];
5981 submit_info.waitSemaphoreCount = 0;
5982 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
5983 submit_info.pWaitDstStageMask = flags;
5984 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5985 }
5986
5987 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
5988
Mike Stroyancd1c3e52016-06-21 09:20:01 -06005989 VkResult err =
5990 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5991 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005992
5993 vkDestroyFence(m_device->device(), fence, nullptr);
5994 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5995 &command_buffer[0]);
5996 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5997
5998 m_errorMonitor->VerifyNotFound();
5999}
6000
6001// This is a positive test. No errors should be generated.
6002TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
6003
6004 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
6005 "on the same queue, the second having a fence, followed "
6006 "by a WaitForFences call.");
6007
6008 m_errorMonitor->ExpectSuccess();
6009
6010 VkFence fence;
6011 VkFenceCreateInfo fence_create_info{};
6012 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6013 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6014
6015 VkCommandPool command_pool;
6016 VkCommandPoolCreateInfo pool_create_info{};
6017 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6018 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6019 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6020 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6021 &command_pool);
6022
6023 VkCommandBuffer command_buffer[2];
6024 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6025 command_buffer_allocate_info.sType =
6026 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6027 command_buffer_allocate_info.commandPool = command_pool;
6028 command_buffer_allocate_info.commandBufferCount = 2;
6029 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6030 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6031 command_buffer);
6032
6033 {
6034 VkCommandBufferBeginInfo begin_info{};
6035 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6036 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6037
6038 vkCmdPipelineBarrier(command_buffer[0],
6039 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6040 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6041 0, nullptr, 0, nullptr);
6042
6043 VkViewport viewport{};
6044 viewport.maxDepth = 1.0f;
6045 viewport.minDepth = 0.0f;
6046 viewport.width = 512;
6047 viewport.height = 512;
6048 viewport.x = 0;
6049 viewport.y = 0;
6050 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6051 vkEndCommandBuffer(command_buffer[0]);
6052 }
6053 {
6054 VkCommandBufferBeginInfo begin_info{};
6055 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6056 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6057
6058 VkViewport viewport{};
6059 viewport.maxDepth = 1.0f;
6060 viewport.minDepth = 0.0f;
6061 viewport.width = 512;
6062 viewport.height = 512;
6063 viewport.x = 0;
6064 viewport.y = 0;
6065 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6066 vkEndCommandBuffer(command_buffer[1]);
6067 }
6068 {
6069 VkSubmitInfo submit_info{};
6070 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6071 submit_info.commandBufferCount = 1;
6072 submit_info.pCommandBuffers = &command_buffer[0];
6073 submit_info.signalSemaphoreCount = 0;
6074 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
6075 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6076 }
6077 {
6078 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6079 VkSubmitInfo submit_info{};
6080 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6081 submit_info.commandBufferCount = 1;
6082 submit_info.pCommandBuffers = &command_buffer[1];
6083 submit_info.waitSemaphoreCount = 0;
6084 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
6085 submit_info.pWaitDstStageMask = flags;
6086 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6087 }
6088
6089 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6090
6091 vkDestroyFence(m_device->device(), fence, nullptr);
6092 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6093 &command_buffer[0]);
6094 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6095
6096 m_errorMonitor->VerifyNotFound();
6097}
6098
6099// This is a positive test. No errors should be generated.
6100TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
6101
6102 TEST_DESCRIPTION(
6103 "Two command buffers each in a separate SubmitInfo sent in a single "
6104 "QueueSubmit call followed by a WaitForFences call.");
6105
6106 m_errorMonitor->ExpectSuccess();
6107
6108 VkFence fence;
6109 VkFenceCreateInfo fence_create_info{};
6110 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6111 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6112
6113 VkSemaphore semaphore;
6114 VkSemaphoreCreateInfo semaphore_create_info{};
6115 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6116 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
6117 &semaphore);
6118
6119 VkCommandPool command_pool;
6120 VkCommandPoolCreateInfo pool_create_info{};
6121 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6122 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6123 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6124 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6125 &command_pool);
6126
6127 VkCommandBuffer command_buffer[2];
6128 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6129 command_buffer_allocate_info.sType =
6130 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6131 command_buffer_allocate_info.commandPool = command_pool;
6132 command_buffer_allocate_info.commandBufferCount = 2;
6133 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6134 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6135 command_buffer);
6136
6137 {
6138 VkCommandBufferBeginInfo begin_info{};
6139 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6140 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6141
6142 vkCmdPipelineBarrier(command_buffer[0],
6143 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6144 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6145 0, nullptr, 0, nullptr);
6146
6147 VkViewport viewport{};
6148 viewport.maxDepth = 1.0f;
6149 viewport.minDepth = 0.0f;
6150 viewport.width = 512;
6151 viewport.height = 512;
6152 viewport.x = 0;
6153 viewport.y = 0;
6154 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6155 vkEndCommandBuffer(command_buffer[0]);
6156 }
6157 {
6158 VkCommandBufferBeginInfo begin_info{};
6159 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6160 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6161
6162 VkViewport viewport{};
6163 viewport.maxDepth = 1.0f;
6164 viewport.minDepth = 0.0f;
6165 viewport.width = 512;
6166 viewport.height = 512;
6167 viewport.x = 0;
6168 viewport.y = 0;
6169 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6170 vkEndCommandBuffer(command_buffer[1]);
6171 }
6172 {
6173 VkSubmitInfo submit_info[2];
6174 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6175
6176 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6177 submit_info[0].pNext = NULL;
6178 submit_info[0].commandBufferCount = 1;
6179 submit_info[0].pCommandBuffers = &command_buffer[0];
6180 submit_info[0].signalSemaphoreCount = 1;
6181 submit_info[0].pSignalSemaphores = &semaphore;
6182 submit_info[0].waitSemaphoreCount = 0;
6183 submit_info[0].pWaitSemaphores = NULL;
6184 submit_info[0].pWaitDstStageMask = 0;
6185
6186 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6187 submit_info[1].pNext = NULL;
6188 submit_info[1].commandBufferCount = 1;
6189 submit_info[1].pCommandBuffers = &command_buffer[1];
6190 submit_info[1].waitSemaphoreCount = 1;
6191 submit_info[1].pWaitSemaphores = &semaphore;
6192 submit_info[1].pWaitDstStageMask = flags;
6193 submit_info[1].signalSemaphoreCount = 0;
6194 submit_info[1].pSignalSemaphores = NULL;
6195 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
6196 }
6197
6198 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6199
6200 vkDestroyFence(m_device->device(), fence, nullptr);
6201 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6202 &command_buffer[0]);
6203 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006204 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006205
6206 m_errorMonitor->VerifyNotFound();
6207}
6208
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006209TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006210 TEST_DESCRIPTION(
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006211 "Run a simple draw calls to validate failure when Depth Bias dynamic "
6212 "state is required but not correctly bound.");
6213
6214 // Dynamic depth bias
6215 m_errorMonitor->SetDesiredFailureMsg(
6216 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6217 "Dynamic depth bias state not set for this command buffer");
6218 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6219 BsoFailDepthBias);
6220 m_errorMonitor->VerifyFound();
6221}
6222
6223TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
6224 TEST_DESCRIPTION(
6225 "Run a simple draw calls to validate failure when Line Width dynamic "
6226 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006227
6228 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07006229 m_errorMonitor->SetDesiredFailureMsg(
6230 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006231 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006232 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6233 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006234 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006235}
6236
6237TEST_F(VkLayerTest, DynamicViewportNotBound) {
6238 TEST_DESCRIPTION(
6239 "Run a simple draw calls to validate failure when Viewport dynamic "
6240 "state is required but not correctly bound.");
6241
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006242 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07006243 m_errorMonitor->SetDesiredFailureMsg(
6244 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006245 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006246 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6247 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006248 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006249}
6250
6251TEST_F(VkLayerTest, DynamicScissorNotBound) {
6252 TEST_DESCRIPTION(
6253 "Run a simple draw calls to validate failure when Scissor dynamic "
6254 "state is required but not correctly bound.");
6255
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006256 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07006257 m_errorMonitor->SetDesiredFailureMsg(
6258 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006259 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006260 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6261 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006262 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006263}
6264
Tobin Ehlis21c88352016-05-26 06:15:45 -06006265TEST_F(VkLayerTest, DynamiBlendConstantsNotBound) {
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006266 TEST_DESCRIPTION(
Tobin Ehlis21c88352016-05-26 06:15:45 -06006267 "Run a simple draw calls to validate failure when Blend Constants "
6268 "dynamic state is required but not correctly bound.");
6269 // Dynamic blend constant state
6270 m_errorMonitor->SetDesiredFailureMsg(
6271 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6272 "Dynamic blend constants state not set for this command buffer");
6273 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6274 BsoFailBlend);
6275 m_errorMonitor->VerifyFound();
6276}
6277
6278TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
6279 TEST_DESCRIPTION(
6280 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006281 "state is required but not correctly bound.");
Tobin Ehlis21c88352016-05-26 06:15:45 -06006282 if (!m_device->phy().features().depthBounds) {
6283 printf("Device does not support depthBounds test; skipped.\n");
6284 return;
6285 }
6286 // Dynamic depth bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006287 m_errorMonitor->SetDesiredFailureMsg(
6288 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006289 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006290 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6291 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006292 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006293}
6294
6295TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
6296 TEST_DESCRIPTION(
6297 "Run a simple draw calls to validate failure when Stencil Read dynamic "
6298 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006299 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07006300 m_errorMonitor->SetDesiredFailureMsg(
6301 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006302 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006303 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6304 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006305 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006306}
6307
6308TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
6309 TEST_DESCRIPTION(
6310 "Run a simple draw calls to validate failure when Stencil Write dynamic"
6311 " state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006312 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07006313 m_errorMonitor->SetDesiredFailureMsg(
6314 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006315 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006316 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6317 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006318 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006319}
6320
6321TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
6322 TEST_DESCRIPTION(
6323 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
6324 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006325 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07006326 m_errorMonitor->SetDesiredFailureMsg(
6327 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006328 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006329 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6330 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006331 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06006332}
6333
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06006334TEST_F(VkLayerTest, IndexBufferNotBound) {
6335 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
6336 m_errorMonitor->SetDesiredFailureMsg(
6337 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6338 "Index buffer object not bound to this command buffer when Indexed ");
6339 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6340 BsoFailIndexBuffer);
6341 m_errorMonitor->VerifyFound();
6342}
6343
Karl Schultz6addd812016-02-02 17:17:23 -07006344TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Karl Schultz6addd812016-02-02 17:17:23 -07006345 m_errorMonitor->SetDesiredFailureMsg(
6346 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6347 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
6348 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006349
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006350 ASSERT_NO_FATAL_FAILURE(InitState());
6351 ASSERT_NO_FATAL_FAILURE(InitViewport());
6352 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6353
Karl Schultz6addd812016-02-02 17:17:23 -07006354 // We luck out b/c by default the framework creates CB w/ the
6355 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006356 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006357 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
6358 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006359 EndCommandBuffer();
6360
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006361 // Bypass framework since it does the waits automatically
6362 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006363 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08006364 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6365 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006366 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006367 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07006368 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006369 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006370 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08006371 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006372 submit_info.pSignalSemaphores = NULL;
6373
Chris Forbes40028e22016-06-13 09:59:34 +12006374 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07006375 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006376
Karl Schultz6addd812016-02-02 17:17:23 -07006377 // Cause validation error by re-submitting cmd buffer that should only be
6378 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12006379 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006380
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006381 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006382}
6383
Karl Schultz6addd812016-02-02 17:17:23 -07006384TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006385 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07006386 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006387
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006389 "Unable to allocate 1 descriptors of "
6390 "type "
6391 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006392
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006393 ASSERT_NO_FATAL_FAILURE(InitState());
6394 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006395
Karl Schultz6addd812016-02-02 17:17:23 -07006396 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
6397 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006398 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006399 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6400 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006401
6402 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006403 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6404 ds_pool_ci.pNext = NULL;
6405 ds_pool_ci.flags = 0;
6406 ds_pool_ci.maxSets = 1;
6407 ds_pool_ci.poolSizeCount = 1;
6408 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006409
6410 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006411 err =
6412 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006413 ASSERT_VK_SUCCESS(err);
6414
6415 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006416 dsl_binding.binding = 0;
6417 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6418 dsl_binding.descriptorCount = 1;
6419 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6420 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006421
6422 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006423 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6424 ds_layout_ci.pNext = NULL;
6425 ds_layout_ci.bindingCount = 1;
6426 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006427
6428 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006429 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6430 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006431 ASSERT_VK_SUCCESS(err);
6432
6433 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006434 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006435 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006436 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006437 alloc_info.descriptorPool = ds_pool;
6438 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006439 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6440 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006441
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006442 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006443
Chia-I Wuf7458c52015-10-26 21:10:41 +08006444 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6445 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006446}
6447
Karl Schultz6addd812016-02-02 17:17:23 -07006448TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
6449 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06006450
Karl Schultz6addd812016-02-02 17:17:23 -07006451 m_errorMonitor->SetDesiredFailureMsg(
6452 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6453 "It is invalid to call vkFreeDescriptorSets() with a pool created "
6454 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006455
Tobin Ehlise735c692015-10-08 13:13:50 -06006456 ASSERT_NO_FATAL_FAILURE(InitState());
6457 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06006458
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006459 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006460 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6461 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06006462
6463 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006464 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6465 ds_pool_ci.pNext = NULL;
6466 ds_pool_ci.maxSets = 1;
6467 ds_pool_ci.poolSizeCount = 1;
6468 ds_pool_ci.flags = 0;
6469 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
6470 // app can only call vkResetDescriptorPool on this pool.;
6471 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06006472
6473 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006474 err =
6475 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06006476 ASSERT_VK_SUCCESS(err);
6477
6478 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006479 dsl_binding.binding = 0;
6480 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6481 dsl_binding.descriptorCount = 1;
6482 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6483 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06006484
6485 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006486 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6487 ds_layout_ci.pNext = NULL;
6488 ds_layout_ci.bindingCount = 1;
6489 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06006490
6491 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006492 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6493 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06006494 ASSERT_VK_SUCCESS(err);
6495
6496 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006497 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006498 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006499 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006500 alloc_info.descriptorPool = ds_pool;
6501 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006502 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6503 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06006504 ASSERT_VK_SUCCESS(err);
6505
6506 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006507 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06006508
Chia-I Wuf7458c52015-10-26 21:10:41 +08006509 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6510 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06006511}
6512
Karl Schultz6addd812016-02-02 17:17:23 -07006513TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006514 // Attempt to clear Descriptor Pool with bad object.
6515 // ObjectTracker should catch this.
6516 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006517 "Invalid Descriptor Pool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006518 uint64_t fake_pool_handle = 0xbaad6001;
6519 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
6520 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06006521 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006522}
6523
Karl Schultz6addd812016-02-02 17:17:23 -07006524TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006525 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
6526 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006527 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06006528 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006529
6530 uint64_t fake_set_handle = 0xbaad6001;
6531 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006532 VkResult err;
6533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006534 "Invalid Descriptor Set Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06006535
6536 ASSERT_NO_FATAL_FAILURE(InitState());
6537
6538 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
6539 layout_bindings[0].binding = 0;
6540 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6541 layout_bindings[0].descriptorCount = 1;
6542 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
6543 layout_bindings[0].pImmutableSamplers = NULL;
6544
6545 VkDescriptorSetLayout descriptor_set_layout;
6546 VkDescriptorSetLayoutCreateInfo dslci = {};
6547 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6548 dslci.pNext = NULL;
6549 dslci.bindingCount = 1;
6550 dslci.pBindings = layout_bindings;
6551 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006552 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006553
6554 VkPipelineLayout pipeline_layout;
6555 VkPipelineLayoutCreateInfo plci = {};
6556 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6557 plci.pNext = NULL;
6558 plci.setLayoutCount = 1;
6559 plci.pSetLayouts = &descriptor_set_layout;
6560 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006561 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006562
6563 BeginCommandBuffer();
6564 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006565 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06006566 m_errorMonitor->VerifyFound();
6567 EndCommandBuffer();
6568 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
6569 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006570}
6571
Karl Schultz6addd812016-02-02 17:17:23 -07006572TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006573 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
6574 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006575 uint64_t fake_layout_handle = 0xbaad6001;
6576 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006577 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006578 "Invalid Descriptor Set Layout Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06006579
6580 VkPipelineLayout pipeline_layout;
6581 VkPipelineLayoutCreateInfo plci = {};
6582 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6583 plci.pNext = NULL;
6584 plci.setLayoutCount = 1;
6585 plci.pSetLayouts = &bad_layout;
6586 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
6587
6588 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006589}
6590
Mark Muellerd4914412016-06-13 17:52:06 -06006591TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
6592 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
6593 "1) A uniform buffer update must have a valid buffer index."
6594 "2) When using an array of descriptors in a single WriteDescriptor,"
6595 " the descriptor types and stageflags must all be the same."
6596 "3) Immutable Sampler state must match across descriptors");
6597
6598 const char *invalid_BufferInfo_ErrorMessage =
6599 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
6600 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
6601 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
6602 const char *stateFlag_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006603 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006604 const char *immutable_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006605 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006606
Mark Muellerd4914412016-06-13 17:52:06 -06006607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
6608
6609 ASSERT_NO_FATAL_FAILURE(InitState());
6610 VkDescriptorPoolSize ds_type_count[4] = {};
6611 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6612 ds_type_count[0].descriptorCount = 1;
6613 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6614 ds_type_count[1].descriptorCount = 1;
6615 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6616 ds_type_count[2].descriptorCount = 1;
6617 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6618 ds_type_count[3].descriptorCount = 1;
6619
6620 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6621 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6622 ds_pool_ci.maxSets = 1;
6623 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
6624 ds_pool_ci.pPoolSizes = ds_type_count;
6625
6626 VkDescriptorPool ds_pool;
6627 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6628 ASSERT_VK_SUCCESS(err);
6629
Mark Muellerb9896722016-06-16 09:54:29 -06006630 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006631 layout_binding[0].binding = 0;
6632 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6633 layout_binding[0].descriptorCount = 1;
6634 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6635 layout_binding[0].pImmutableSamplers = NULL;
6636
6637 layout_binding[1].binding = 1;
6638 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6639 layout_binding[1].descriptorCount = 1;
6640 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6641 layout_binding[1].pImmutableSamplers = NULL;
6642
6643 VkSamplerCreateInfo sampler_ci = {};
6644 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6645 sampler_ci.pNext = NULL;
6646 sampler_ci.magFilter = VK_FILTER_NEAREST;
6647 sampler_ci.minFilter = VK_FILTER_NEAREST;
6648 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6649 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6650 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6651 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6652 sampler_ci.mipLodBias = 1.0;
6653 sampler_ci.anisotropyEnable = VK_FALSE;
6654 sampler_ci.maxAnisotropy = 1;
6655 sampler_ci.compareEnable = VK_FALSE;
6656 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6657 sampler_ci.minLod = 1.0;
6658 sampler_ci.maxLod = 1.0;
6659 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6660 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6661 VkSampler sampler;
6662
6663 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6664 ASSERT_VK_SUCCESS(err);
6665
6666 layout_binding[2].binding = 2;
6667 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6668 layout_binding[2].descriptorCount = 1;
6669 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6670 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
6671
Mark Muellerd4914412016-06-13 17:52:06 -06006672 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6673 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6674 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
6675 ds_layout_ci.pBindings = layout_binding;
6676 VkDescriptorSetLayout ds_layout;
6677 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6678 ASSERT_VK_SUCCESS(err);
6679
6680 VkDescriptorSetAllocateInfo alloc_info = {};
6681 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6682 alloc_info.descriptorSetCount = 1;
6683 alloc_info.descriptorPool = ds_pool;
6684 alloc_info.pSetLayouts = &ds_layout;
6685 VkDescriptorSet descriptorSet;
6686 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6687 ASSERT_VK_SUCCESS(err);
6688
6689 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6690 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6691 pipeline_layout_ci.pNext = NULL;
6692 pipeline_layout_ci.setLayoutCount = 1;
6693 pipeline_layout_ci.pSetLayouts = &ds_layout;
6694
6695 VkPipelineLayout pipeline_layout;
6696 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6697 ASSERT_VK_SUCCESS(err);
6698
Mark Mueller5c838ce2016-06-16 09:54:29 -06006699 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006700 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6701 descriptor_write.dstSet = descriptorSet;
6702 descriptor_write.dstBinding = 0;
6703 descriptor_write.descriptorCount = 1;
6704 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6705
Mark Mueller5c838ce2016-06-16 09:54:29 -06006706 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06006707 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6708 m_errorMonitor->VerifyFound();
6709
6710 // Create a buffer to update the descriptor with
6711 uint32_t qfi = 0;
6712 VkBufferCreateInfo buffCI = {};
6713 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6714 buffCI.size = 1024;
6715 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6716 buffCI.queueFamilyIndexCount = 1;
6717 buffCI.pQueueFamilyIndices = &qfi;
6718
6719 VkBuffer dyub;
6720 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6721 ASSERT_VK_SUCCESS(err);
6722 VkDescriptorBufferInfo buffInfo = {};
6723 buffInfo.buffer = dyub;
6724 buffInfo.offset = 0;
6725 buffInfo.range = 1024;
6726
6727 descriptor_write.pBufferInfo = &buffInfo;
6728 descriptor_write.descriptorCount = 2;
6729
Mark Mueller5c838ce2016-06-16 09:54:29 -06006730 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06006731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
6732 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6733 m_errorMonitor->VerifyFound();
6734
Mark Mueller5c838ce2016-06-16 09:54:29 -06006735 // 3) The second descriptor has a null_ptr pImmutableSamplers and
6736 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06006737 descriptor_write.dstBinding = 1;
6738 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06006739
6740
6741 // Make pImageInfo index non-null to avoid complaints of it missing
6742 VkDescriptorImageInfo imageInfo = {};
6743 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6744 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06006745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
6746 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6747 m_errorMonitor->VerifyFound();
6748
Mark Muellerd4914412016-06-13 17:52:06 -06006749 vkDestroyBuffer(m_device->device(), dyub, NULL);
6750 vkDestroySampler(m_device->device(), sampler, NULL);
6751 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6752 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6753 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6754}
6755
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06006756TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
6757 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6758 "due to a buffer dependency being destroyed.");
6759 ASSERT_NO_FATAL_FAILURE(InitState());
6760
6761 VkImageObj image(m_device);
6762 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6763 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
6764 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
6765 VK_IMAGE_TILING_OPTIMAL, 0);
6766 ASSERT_TRUE(image.initialized());
6767
6768 VkBuffer buffer;
6769 VkDeviceMemory mem;
6770 VkMemoryRequirements mem_reqs;
6771
6772 VkBufferCreateInfo buf_info = {};
6773 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6774 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6775 buf_info.size = 256;
6776 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6777 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
6778 ASSERT_VK_SUCCESS(err);
6779
6780 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
6781
6782 VkMemoryAllocateInfo alloc_info = {};
6783 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6784 alloc_info.allocationSize = 256;
6785 bool pass = false;
6786 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
6787 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6788 if (!pass) {
6789 vkDestroyBuffer(m_device->device(), buffer, NULL);
6790 return;
6791 }
6792 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
6793 ASSERT_VK_SUCCESS(err);
6794
6795 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
6796 ASSERT_VK_SUCCESS(err);
6797
6798 VkBufferImageCopy region = {};
6799 region.bufferRowLength = 128;
6800 region.bufferImageHeight = 128;
6801 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6802
6803 region.imageSubresource.layerCount = 1;
6804 region.imageExtent.height = 4;
6805 region.imageExtent.width = 4;
6806 region.imageExtent.depth = 1;
6807 m_commandBuffer->BeginCommandBuffer();
6808 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
6809 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
6810 1, &region);
6811 m_commandBuffer->EndCommandBuffer();
6812
6813 m_errorMonitor->SetDesiredFailureMsg(
6814 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6815 " that is invalid because bound buffer ");
6816 // Destroy buffer dependency prior to submit to cause ERROR
6817 vkDestroyBuffer(m_device->device(), buffer, NULL);
6818
6819 VkSubmitInfo submit_info = {};
6820 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6821 submit_info.commandBufferCount = 1;
6822 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6823 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6824
6825 m_errorMonitor->VerifyFound();
6826 vkFreeMemory(m_device->handle(), mem, NULL);
6827}
6828
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006829TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
6830 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6831 "due to an image dependency being destroyed.");
6832 ASSERT_NO_FATAL_FAILURE(InitState());
6833
6834 VkImage image;
6835 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6836 VkImageCreateInfo image_create_info = {};
6837 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6838 image_create_info.pNext = NULL;
6839 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6840 image_create_info.format = tex_format;
6841 image_create_info.extent.width = 32;
6842 image_create_info.extent.height = 32;
6843 image_create_info.extent.depth = 1;
6844 image_create_info.mipLevels = 1;
6845 image_create_info.arrayLayers = 1;
6846 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6847 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6848 image_create_info.usage =
6849 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6850 image_create_info.flags = 0;
6851 VkResult err =
6852 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6853 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006854 // Have to bind memory to image before recording cmd in cmd buffer using it
6855 VkMemoryRequirements mem_reqs;
6856 VkDeviceMemory image_mem;
6857 bool pass;
6858 VkMemoryAllocateInfo mem_alloc = {};
6859 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6860 mem_alloc.pNext = NULL;
6861 mem_alloc.memoryTypeIndex = 0;
6862 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
6863 mem_alloc.allocationSize = mem_reqs.size;
6864 pass =
6865 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
6866 ASSERT_TRUE(pass);
6867 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
6868 ASSERT_VK_SUCCESS(err);
6869 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
6870 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006871
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006872 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06006873 VkClearColorValue ccv;
6874 ccv.float32[0] = 1.0f;
6875 ccv.float32[1] = 1.0f;
6876 ccv.float32[2] = 1.0f;
6877 ccv.float32[3] = 1.0f;
6878 VkImageSubresourceRange isr = {};
6879 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006880 isr.baseArrayLayer = 0;
6881 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06006882 isr.layerCount = 1;
6883 isr.levelCount = 1;
6884 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
6885 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006886 m_commandBuffer->EndCommandBuffer();
6887
6888 m_errorMonitor->SetDesiredFailureMsg(
6889 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
6890 // Destroy image dependency prior to submit to cause ERROR
6891 vkDestroyImage(m_device->device(), image, NULL);
6892
6893 VkSubmitInfo submit_info = {};
6894 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6895 submit_info.commandBufferCount = 1;
6896 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6897 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6898
6899 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006900 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006901}
6902
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06006903TEST_F(VkLayerTest, ImageMemoryNotBound) {
6904 TEST_DESCRIPTION(
6905 "Attempt to draw with an image which has not had memory bound to it.");
6906 ASSERT_NO_FATAL_FAILURE(InitState());
6907
6908 VkImage image;
6909 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6910 VkImageCreateInfo image_create_info = {};
6911 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6912 image_create_info.pNext = NULL;
6913 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6914 image_create_info.format = tex_format;
6915 image_create_info.extent.width = 32;
6916 image_create_info.extent.height = 32;
6917 image_create_info.extent.depth = 1;
6918 image_create_info.mipLevels = 1;
6919 image_create_info.arrayLayers = 1;
6920 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6921 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6922 image_create_info.usage =
6923 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6924 image_create_info.flags = 0;
6925 VkResult err =
6926 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6927 ASSERT_VK_SUCCESS(err);
6928 // Have to bind memory to image before recording cmd in cmd buffer using it
6929 VkMemoryRequirements mem_reqs;
6930 VkDeviceMemory image_mem;
6931 bool pass;
6932 VkMemoryAllocateInfo mem_alloc = {};
6933 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6934 mem_alloc.pNext = NULL;
6935 mem_alloc.memoryTypeIndex = 0;
6936 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
6937 mem_alloc.allocationSize = mem_reqs.size;
6938 pass =
6939 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
6940 ASSERT_TRUE(pass);
6941 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
6942 ASSERT_VK_SUCCESS(err);
6943
6944 // Introduce error, do not call vkBindImageMemory(m_device->device(), image,
6945 // image_mem, 0);
6946 m_errorMonitor->SetDesiredFailureMsg(
6947 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6948 "used without first calling vkBindImageMemory");
6949
6950 m_commandBuffer->BeginCommandBuffer();
6951 VkClearColorValue ccv;
6952 ccv.float32[0] = 1.0f;
6953 ccv.float32[1] = 1.0f;
6954 ccv.float32[2] = 1.0f;
6955 ccv.float32[3] = 1.0f;
6956 VkImageSubresourceRange isr = {};
6957 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6958 isr.baseArrayLayer = 0;
6959 isr.baseMipLevel = 0;
6960 isr.layerCount = 1;
6961 isr.levelCount = 1;
6962 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
6963 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
6964 m_commandBuffer->EndCommandBuffer();
6965
6966 m_errorMonitor->VerifyFound();
6967 vkDestroyImage(m_device->device(), image, NULL);
6968 vkFreeMemory(m_device->device(), image_mem, nullptr);
6969}
6970
6971TEST_F(VkLayerTest, BufferMemoryNotBound) {
6972 TEST_DESCRIPTION(
6973 "Attempt to copy from a buffer which has not had memory bound to it.");
6974 ASSERT_NO_FATAL_FAILURE(InitState());
6975
6976 VkImageObj image(m_device);
6977 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6978 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
6979 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
6980 VK_IMAGE_TILING_OPTIMAL, 0);
6981 ASSERT_TRUE(image.initialized());
6982
6983 VkBuffer buffer;
6984 VkDeviceMemory mem;
6985 VkMemoryRequirements mem_reqs;
6986
6987 VkBufferCreateInfo buf_info = {};
6988 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6989 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6990 buf_info.size = 256;
6991 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6992 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
6993 ASSERT_VK_SUCCESS(err);
6994
6995 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
6996
6997 VkMemoryAllocateInfo alloc_info = {};
6998 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6999 alloc_info.allocationSize = 256;
7000 bool pass = false;
7001 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
7002 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
7003 if (!pass) {
7004 vkDestroyBuffer(m_device->device(), buffer, NULL);
7005 return;
7006 }
7007 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
7008 ASSERT_VK_SUCCESS(err);
7009
7010 // Introduce failure by not calling vkBindBufferMemory(m_device->device(),
7011 // buffer, mem, 0);
7012 m_errorMonitor->SetDesiredFailureMsg(
7013 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7014 "used without first calling vkBindBufferMemory");
7015 VkBufferImageCopy region = {};
7016 region.bufferRowLength = 128;
7017 region.bufferImageHeight = 128;
7018 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7019
7020 region.imageSubresource.layerCount = 1;
7021 region.imageExtent.height = 4;
7022 region.imageExtent.width = 4;
7023 region.imageExtent.depth = 1;
7024 m_commandBuffer->BeginCommandBuffer();
7025 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
7026 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
7027 1, &region);
7028 m_commandBuffer->EndCommandBuffer();
7029
7030 m_errorMonitor->VerifyFound();
7031
7032 vkDestroyBuffer(m_device->device(), buffer, NULL);
7033 vkFreeMemory(m_device->handle(), mem, NULL);
7034}
7035
Tobin Ehlis85940f52016-07-07 16:57:21 -06007036TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
7037 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7038 "due to an event dependency being destroyed.");
7039 ASSERT_NO_FATAL_FAILURE(InitState());
7040
7041 VkEvent event;
7042 VkEventCreateInfo evci = {};
7043 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
7044 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
7045 ASSERT_VK_SUCCESS(result);
7046
7047 m_commandBuffer->BeginCommandBuffer();
7048 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event,
7049 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
7050 m_commandBuffer->EndCommandBuffer();
7051
7052 m_errorMonitor->SetDesiredFailureMsg(
7053 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
7054 // Destroy event dependency prior to submit to cause ERROR
7055 vkDestroyEvent(m_device->device(), event, NULL);
7056
7057 VkSubmitInfo submit_info = {};
7058 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7059 submit_info.commandBufferCount = 1;
7060 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7061 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7062
7063 m_errorMonitor->VerifyFound();
7064}
7065
Tobin Ehlisdbea7552016-07-08 14:33:31 -06007066TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
7067 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7068 "due to a query pool dependency being destroyed.");
7069 ASSERT_NO_FATAL_FAILURE(InitState());
7070
7071 VkQueryPool query_pool;
7072 VkQueryPoolCreateInfo qpci{};
7073 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
7074 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
7075 qpci.queryCount = 1;
7076 VkResult result =
7077 vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
7078 ASSERT_VK_SUCCESS(result);
7079
7080 m_commandBuffer->BeginCommandBuffer();
7081 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
7082 m_commandBuffer->EndCommandBuffer();
7083
7084 m_errorMonitor->SetDesiredFailureMsg(
7085 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7086 " that is invalid because bound query pool ");
7087 // Destroy query pool dependency prior to submit to cause ERROR
7088 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
7089
7090 VkSubmitInfo submit_info = {};
7091 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7092 submit_info.commandBufferCount = 1;
7093 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7094 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7095
7096 m_errorMonitor->VerifyFound();
7097}
7098
Tobin Ehlis24130d92016-07-08 15:50:53 -06007099TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
7100 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7101 "due to a pipeline dependency being destroyed.");
7102 ASSERT_NO_FATAL_FAILURE(InitState());
7103 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7104
7105 VkResult err;
7106
7107 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7108 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7109
7110 VkPipelineLayout pipeline_layout;
7111 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7112 &pipeline_layout);
7113 ASSERT_VK_SUCCESS(err);
7114
7115 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7116 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7117 vp_state_ci.viewportCount = 1;
7118 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06007119 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06007120 vp_state_ci.scissorCount = 1;
7121 VkRect2D scissors = {}; // Dummy scissors to point to
7122 vp_state_ci.pScissors = &scissors;
7123 // No dynamic state
7124 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7125 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7126
7127 VkPipelineShaderStageCreateInfo shaderStages[2];
7128 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7129
7130 VkShaderObj vs(m_device, bindStateVertShaderText,
7131 VK_SHADER_STAGE_VERTEX_BIT, this);
7132 VkShaderObj fs(m_device, bindStateFragShaderText,
7133 VK_SHADER_STAGE_FRAGMENT_BIT,
7134 this); // We shouldn't need a fragment shader
7135 // but add it to be able to run on more devices
7136 shaderStages[0] = vs.GetStageCreateInfo();
7137 shaderStages[1] = fs.GetStageCreateInfo();
7138
7139 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7140 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7141
7142 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7143 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7144 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7145
7146 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7147 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7148
7149 VkPipelineColorBlendAttachmentState att = {};
7150 att.blendEnable = VK_FALSE;
7151 att.colorWriteMask = 0xf;
7152
7153 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7154 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7155 cb_ci.attachmentCount = 1;
7156 cb_ci.pAttachments = &att;
7157
7158 VkGraphicsPipelineCreateInfo gp_ci = {};
7159 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7160 gp_ci.stageCount = 2;
7161 gp_ci.pStages = shaderStages;
7162 gp_ci.pVertexInputState = &vi_ci;
7163 gp_ci.pInputAssemblyState = &ia_ci;
7164 gp_ci.pViewportState = &vp_state_ci;
7165 gp_ci.pRasterizationState = &rs_ci;
7166 gp_ci.pColorBlendState = &cb_ci;
7167 gp_ci.pDynamicState = &dyn_state_ci;
7168 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7169 gp_ci.layout = pipeline_layout;
7170 gp_ci.renderPass = renderPass();
7171
7172 VkPipelineCacheCreateInfo pc_ci = {};
7173 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7174
7175 VkPipeline pipeline;
7176 VkPipelineCache pipelineCache;
7177 err =
7178 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
7179 ASSERT_VK_SUCCESS(err);
7180
7181 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7182 &gp_ci, NULL, &pipeline);
7183 ASSERT_VK_SUCCESS(err);
7184
7185 m_commandBuffer->BeginCommandBuffer();
7186 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7187 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
7188 m_commandBuffer->EndCommandBuffer();
7189 // Now destroy pipeline in order to cause error when submitting
7190 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
7191
7192 m_errorMonitor->SetDesiredFailureMsg(
7193 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7194 " that is invalid because bound pipeline ");
7195
7196 VkSubmitInfo submit_info = {};
7197 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7198 submit_info.commandBufferCount = 1;
7199 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7200 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7201
7202 m_errorMonitor->VerifyFound();
7203 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7204 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7205}
7206
Karl Schultz6addd812016-02-02 17:17:23 -07007207TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06007208 // Attempt to bind an invalid Pipeline to a valid Command Buffer
7209 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007210 // Create a valid cmd buffer
7211 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06007212 uint64_t fake_pipeline_handle = 0xbaad6001;
7213 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06007214 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06007215 "Invalid Pipeline Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06007216 ASSERT_NO_FATAL_FAILURE(InitState());
7217 BeginCommandBuffer();
7218 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7219 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
7220 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06007221 // Now issue a draw call with no pipeline bound
7222 m_errorMonitor->SetDesiredFailureMsg(
7223 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7224 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tony Barbourdf4c0042016-06-01 15:55:43 -06007225
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06007226 BeginCommandBuffer();
7227 Draw(1, 0, 0, 0);
7228 m_errorMonitor->VerifyFound();
7229 // Finally same check once more but with Dispatch/Compute
7230 m_errorMonitor->SetDesiredFailureMsg(
7231 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7232 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06007233 BeginCommandBuffer();
7234 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
7235 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007236}
7237
Karl Schultz6addd812016-02-02 17:17:23 -07007238TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
7239 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
7240 // CommandBuffer
7241 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007242
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007243 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007244 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007245
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007246 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06007247 ASSERT_NO_FATAL_FAILURE(InitViewport());
7248 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007249 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007250 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7251 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007252
7253 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007254 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7255 ds_pool_ci.pNext = NULL;
7256 ds_pool_ci.maxSets = 1;
7257 ds_pool_ci.poolSizeCount = 1;
7258 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06007259
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007260 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007261 err =
7262 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007263 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007264
Tony Barboureb254902015-07-15 12:50:33 -06007265 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007266 dsl_binding.binding = 0;
7267 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7268 dsl_binding.descriptorCount = 1;
7269 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7270 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007271
Tony Barboureb254902015-07-15 12:50:33 -06007272 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007273 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7274 ds_layout_ci.pNext = NULL;
7275 ds_layout_ci.bindingCount = 1;
7276 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007277 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007278 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7279 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007280 ASSERT_VK_SUCCESS(err);
7281
7282 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007283 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007284 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007285 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007286 alloc_info.descriptorPool = ds_pool;
7287 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007288 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7289 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007290 ASSERT_VK_SUCCESS(err);
7291
Tony Barboureb254902015-07-15 12:50:33 -06007292 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007293 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7294 pipeline_layout_ci.pNext = NULL;
7295 pipeline_layout_ci.setLayoutCount = 1;
7296 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007297
7298 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007299 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7300 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007301 ASSERT_VK_SUCCESS(err);
7302
Karl Schultz6addd812016-02-02 17:17:23 -07007303 VkShaderObj vs(m_device, bindStateVertShaderText,
7304 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06007305 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07007306 // on more devices
7307 VkShaderObj fs(m_device, bindStateFragShaderText,
7308 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007309
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007310 VkPipelineObj pipe(m_device);
7311 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007312 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06007313 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007314 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007315
7316 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007317 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7318 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7319 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7320 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7321 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007322
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007323 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007324
Chia-I Wuf7458c52015-10-26 21:10:41 +08007325 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7326 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7327 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007328}
7329
Karl Schultz6addd812016-02-02 17:17:23 -07007330TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007331 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07007332 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007333
Karl Schultz6addd812016-02-02 17:17:23 -07007334 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007335 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
7336 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007337
7338 ASSERT_NO_FATAL_FAILURE(InitState());
7339 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007340 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7341 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007342
7343 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007344 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7345 ds_pool_ci.pNext = NULL;
7346 ds_pool_ci.maxSets = 1;
7347 ds_pool_ci.poolSizeCount = 1;
7348 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007349
7350 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007351 err =
7352 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007353 ASSERT_VK_SUCCESS(err);
7354
7355 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007356 dsl_binding.binding = 0;
7357 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7358 dsl_binding.descriptorCount = 1;
7359 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7360 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007361
7362 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007363 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7364 ds_layout_ci.pNext = NULL;
7365 ds_layout_ci.bindingCount = 1;
7366 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007367 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007368 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7369 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007370 ASSERT_VK_SUCCESS(err);
7371
7372 VkDescriptorSet descriptorSet;
7373 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007374 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007375 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007376 alloc_info.descriptorPool = ds_pool;
7377 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007378 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7379 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007380 ASSERT_VK_SUCCESS(err);
7381
Karl Schultz6addd812016-02-02 17:17:23 -07007382 VkBufferView view =
7383 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007384 VkWriteDescriptorSet descriptor_write;
7385 memset(&descriptor_write, 0, sizeof(descriptor_write));
7386 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7387 descriptor_write.dstSet = descriptorSet;
7388 descriptor_write.dstBinding = 0;
7389 descriptor_write.descriptorCount = 1;
7390 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7391 descriptor_write.pTexelBufferView = &view;
7392
7393 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7394
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007395 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007396
7397 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7398 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7399}
7400
Mark Youngd339ba32016-05-30 13:28:35 -06007401TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
7402 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has"
7403 " no memory bound to it.");
7404
7405 VkResult err;
7406 m_errorMonitor->SetDesiredFailureMsg(
7407 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -06007408 "used without first calling vkBindBufferMemory");
Mark Youngd339ba32016-05-30 13:28:35 -06007409
7410 ASSERT_NO_FATAL_FAILURE(InitState());
7411
7412 // Create a buffer with no bound memory and then attempt to create
7413 // a buffer view.
7414 VkBufferCreateInfo buff_ci = {};
7415 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7416 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7417 buff_ci.size = 256;
7418 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7419 VkBuffer buffer;
7420 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
7421 ASSERT_VK_SUCCESS(err);
7422
7423 VkBufferViewCreateInfo buff_view_ci = {};
7424 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
7425 buff_view_ci.buffer = buffer;
7426 buff_view_ci.format = VK_FORMAT_R8_UNORM;
7427 buff_view_ci.range = VK_WHOLE_SIZE;
7428 VkBufferView buff_view;
7429 err =
7430 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
7431
7432 m_errorMonitor->VerifyFound();
7433 vkDestroyBuffer(m_device->device(), buffer, NULL);
7434 // If last error is success, it still created the view, so delete it.
7435 if (err == VK_SUCCESS) {
7436 vkDestroyBufferView(m_device->device(), buff_view, NULL);
7437 }
7438}
7439
Karl Schultz6addd812016-02-02 17:17:23 -07007440TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
7441 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
7442 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07007443 // 1. No dynamicOffset supplied
7444 // 2. Too many dynamicOffsets supplied
7445 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07007446 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007448 " requires 1 dynamicOffsets, but only "
7449 "0 dynamicOffsets are left in "
7450 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007451
7452 ASSERT_NO_FATAL_FAILURE(InitState());
7453 ASSERT_NO_FATAL_FAILURE(InitViewport());
7454 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7455
7456 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007457 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7458 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007459
7460 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007461 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7462 ds_pool_ci.pNext = NULL;
7463 ds_pool_ci.maxSets = 1;
7464 ds_pool_ci.poolSizeCount = 1;
7465 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007466
7467 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007468 err =
7469 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007470 ASSERT_VK_SUCCESS(err);
7471
7472 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007473 dsl_binding.binding = 0;
7474 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7475 dsl_binding.descriptorCount = 1;
7476 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7477 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007478
7479 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007480 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7481 ds_layout_ci.pNext = NULL;
7482 ds_layout_ci.bindingCount = 1;
7483 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007484 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007485 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7486 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007487 ASSERT_VK_SUCCESS(err);
7488
7489 VkDescriptorSet descriptorSet;
7490 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007491 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007492 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007493 alloc_info.descriptorPool = ds_pool;
7494 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007495 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7496 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007497 ASSERT_VK_SUCCESS(err);
7498
7499 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007500 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7501 pipeline_layout_ci.pNext = NULL;
7502 pipeline_layout_ci.setLayoutCount = 1;
7503 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007504
7505 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007506 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7507 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007508 ASSERT_VK_SUCCESS(err);
7509
7510 // Create a buffer to update the descriptor with
7511 uint32_t qfi = 0;
7512 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007513 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7514 buffCI.size = 1024;
7515 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7516 buffCI.queueFamilyIndexCount = 1;
7517 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007518
7519 VkBuffer dyub;
7520 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7521 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007522 // Allocate memory and bind to buffer so we can make it to the appropriate
7523 // error
7524 VkMemoryAllocateInfo mem_alloc = {};
7525 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7526 mem_alloc.pNext = NULL;
7527 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12007528 mem_alloc.memoryTypeIndex = 0;
7529
7530 VkMemoryRequirements memReqs;
7531 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
7532 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
7533 0);
7534 if (!pass) {
7535 vkDestroyBuffer(m_device->device(), dyub, NULL);
7536 return;
7537 }
7538
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007539 VkDeviceMemory mem;
7540 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
7541 ASSERT_VK_SUCCESS(err);
7542 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
7543 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007544 // Correctly update descriptor to avoid "NOT_UPDATED" error
7545 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007546 buffInfo.buffer = dyub;
7547 buffInfo.offset = 0;
7548 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007549
7550 VkWriteDescriptorSet descriptor_write;
7551 memset(&descriptor_write, 0, sizeof(descriptor_write));
7552 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7553 descriptor_write.dstSet = descriptorSet;
7554 descriptor_write.dstBinding = 0;
7555 descriptor_write.descriptorCount = 1;
7556 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7557 descriptor_write.pBufferInfo = &buffInfo;
7558
7559 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7560
7561 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007562 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7563 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7564 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007565 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007566 uint32_t pDynOff[2] = {512, 756};
7567 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07007568 m_errorMonitor->SetDesiredFailureMsg(
7569 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07007570 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07007571 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7572 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7573 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12007574 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007575 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007576 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7577 " dynamic offset 512 combined with "
7578 "offset 0 and range 1024 that "
7579 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07007580 // Create PSO to be used for draw-time errors below
7581 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007582 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007583 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007584 "out gl_PerVertex { \n"
7585 " vec4 gl_Position;\n"
7586 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007587 "void main(){\n"
7588 " gl_Position = vec4(1);\n"
7589 "}\n";
7590 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007591 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007592 "\n"
7593 "layout(location=0) out vec4 x;\n"
7594 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7595 "void main(){\n"
7596 " x = vec4(bar.y);\n"
7597 "}\n";
7598 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7599 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7600 VkPipelineObj pipe(m_device);
7601 pipe.AddShader(&vs);
7602 pipe.AddShader(&fs);
7603 pipe.AddColorAttachment();
7604 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7605
Karl Schultz6addd812016-02-02 17:17:23 -07007606 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7607 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7608 // This update should succeed, but offset size of 512 will overstep buffer
7609 // /w range 1024 & size 1024
7610 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7611 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7612 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07007613 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007614 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007615
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007616 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06007617 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007618
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007619 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007620 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007621 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7622}
7623
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007624TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
7625 TEST_DESCRIPTION("Attempt to update a descriptor with a non-sparse buffer "
7626 "that doesn't have memory bound");
7627 VkResult err;
7628 m_errorMonitor->SetDesiredFailureMsg(
7629 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7630 " used without first calling vkBindBufferMemory.");
7631
7632 ASSERT_NO_FATAL_FAILURE(InitState());
7633 ASSERT_NO_FATAL_FAILURE(InitViewport());
7634 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7635
7636 VkDescriptorPoolSize ds_type_count = {};
7637 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7638 ds_type_count.descriptorCount = 1;
7639
7640 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7641 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7642 ds_pool_ci.pNext = NULL;
7643 ds_pool_ci.maxSets = 1;
7644 ds_pool_ci.poolSizeCount = 1;
7645 ds_pool_ci.pPoolSizes = &ds_type_count;
7646
7647 VkDescriptorPool ds_pool;
7648 err =
7649 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
7650 ASSERT_VK_SUCCESS(err);
7651
7652 VkDescriptorSetLayoutBinding dsl_binding = {};
7653 dsl_binding.binding = 0;
7654 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7655 dsl_binding.descriptorCount = 1;
7656 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7657 dsl_binding.pImmutableSamplers = NULL;
7658
7659 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7660 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7661 ds_layout_ci.pNext = NULL;
7662 ds_layout_ci.bindingCount = 1;
7663 ds_layout_ci.pBindings = &dsl_binding;
7664 VkDescriptorSetLayout ds_layout;
7665 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7666 &ds_layout);
7667 ASSERT_VK_SUCCESS(err);
7668
7669 VkDescriptorSet descriptorSet;
7670 VkDescriptorSetAllocateInfo alloc_info = {};
7671 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7672 alloc_info.descriptorSetCount = 1;
7673 alloc_info.descriptorPool = ds_pool;
7674 alloc_info.pSetLayouts = &ds_layout;
7675 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7676 &descriptorSet);
7677 ASSERT_VK_SUCCESS(err);
7678
7679 // Create a buffer to update the descriptor with
7680 uint32_t qfi = 0;
7681 VkBufferCreateInfo buffCI = {};
7682 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7683 buffCI.size = 1024;
7684 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7685 buffCI.queueFamilyIndexCount = 1;
7686 buffCI.pQueueFamilyIndices = &qfi;
7687
7688 VkBuffer dyub;
7689 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7690 ASSERT_VK_SUCCESS(err);
7691
7692 // Attempt to update descriptor without binding memory to it
7693 VkDescriptorBufferInfo buffInfo = {};
7694 buffInfo.buffer = dyub;
7695 buffInfo.offset = 0;
7696 buffInfo.range = 1024;
7697
7698 VkWriteDescriptorSet descriptor_write;
7699 memset(&descriptor_write, 0, sizeof(descriptor_write));
7700 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7701 descriptor_write.dstSet = descriptorSet;
7702 descriptor_write.dstBinding = 0;
7703 descriptor_write.descriptorCount = 1;
7704 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7705 descriptor_write.pBufferInfo = &buffInfo;
7706
7707 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7708 m_errorMonitor->VerifyFound();
7709
7710 vkDestroyBuffer(m_device->device(), dyub, NULL);
7711 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7712 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7713}
7714
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007715TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007716 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007717 ASSERT_NO_FATAL_FAILURE(InitState());
7718 ASSERT_NO_FATAL_FAILURE(InitViewport());
7719 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7720
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007721 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007722 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007723 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7724 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7725 pipeline_layout_ci.pushConstantRangeCount = 1;
7726 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7727
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007728 //
7729 // Check for invalid push constant ranges in pipeline layouts.
7730 //
7731 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007732 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007733 char const *msg;
7734 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007735
Karl Schultzc81037d2016-05-12 08:11:23 -06007736 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7737 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7738 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7739 "vkCreatePipelineLayout() call has push constants index 0 with "
7740 "size 0."},
7741 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7742 "vkCreatePipelineLayout() call has push constants index 0 with "
7743 "size 1."},
7744 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7745 "vkCreatePipelineLayout() call has push constants index 0 with "
7746 "size 1."},
7747 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7748 "vkCreatePipelineLayout() call has push constants index 0 with "
7749 "size 0."},
7750 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7751 "vkCreatePipelineLayout() call has push constants index 0 with "
7752 "offset 1. Offset must"},
7753 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7754 "vkCreatePipelineLayout() call has push constants index 0 "
7755 "with offset "},
7756 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7757 "vkCreatePipelineLayout() call has push constants "
7758 "index 0 with offset "},
7759 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
7760 "vkCreatePipelineLayout() call has push constants index 0 "
7761 "with offset "},
7762 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7763 "vkCreatePipelineLayout() call has push "
7764 "constants index 0 with offset "},
7765 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7766 "vkCreatePipelineLayout() call has push "
7767 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007768 }};
7769
7770 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007771 for (const auto &iter : range_tests) {
7772 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7774 iter.msg);
7775 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7776 NULL, &pipeline_layout);
7777 m_errorMonitor->VerifyFound();
7778 if (VK_SUCCESS == err) {
7779 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7780 }
7781 }
7782
7783 // Check for invalid stage flag
7784 pc_range.offset = 0;
7785 pc_range.size = 16;
7786 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007787 m_errorMonitor->SetDesiredFailureMsg(
7788 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007789 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007790 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7791 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007792 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007793 if (VK_SUCCESS == err) {
7794 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7795 }
7796
7797 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06007798 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007799 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007800 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007801 char const *msg;
7802 };
7803
Karl Schultzc81037d2016-05-12 08:11:23 -06007804 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007805 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7806 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7807 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7808 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7809 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7810 "vkCreatePipelineLayout() call has push constants with overlapping "
7811 "ranges: 0:[0, 4), 1:[0, 4)"},
7812 {
7813 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7814 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7815 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7816 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7817 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7818 "vkCreatePipelineLayout() call has push constants with "
7819 "overlapping "
7820 "ranges: 3:[12, 20), 4:[16, 20)",
7821 },
7822 {
7823 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7824 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7825 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7826 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7827 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7828 "vkCreatePipelineLayout() call has push constants with "
7829 "overlapping "
7830 "ranges: 0:[16, 20), 1:[12, 20)",
7831 },
7832 {
7833 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7834 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7835 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7836 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7837 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7838 "vkCreatePipelineLayout() call has push constants with "
7839 "overlapping "
7840 "ranges: 0:[16, 20), 3:[12, 20)",
7841 },
7842 {
7843 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7844 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
7845 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
7846 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
7847 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
7848 "vkCreatePipelineLayout() call has push constants with "
7849 "overlapping "
7850 "ranges: 0:[16, 20), 2:[4, 100)",
7851 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007852
Karl Schultzc81037d2016-05-12 08:11:23 -06007853 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007854 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007855 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
7856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007857 iter.msg);
7858 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7859 NULL, &pipeline_layout);
7860 m_errorMonitor->VerifyFound();
7861 if (VK_SUCCESS == err) {
7862 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7863 }
7864 }
7865
7866 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06007867 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
7868 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7869 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7870 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7871 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
7872 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7873 ""},
7874 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
7875 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
7876 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
7877 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
7878 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7879 ""}}};
7880 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007881 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
7882 m_errorMonitor->ExpectSuccess();
7883 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7884 NULL, &pipeline_layout);
7885 m_errorMonitor->VerifyNotFound();
7886 if (VK_SUCCESS == err) {
7887 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7888 }
7889 }
7890
7891 //
7892 // CmdPushConstants tests
7893 //
Karl Schultzc81037d2016-05-12 08:11:23 -06007894 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007895
7896 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06007897 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
7898 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7899 "vkCmdPushConstants() call has push constants with size 0. Size "
7900 "must be greater than zero and a multiple of 4."},
7901 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7902 "vkCmdPushConstants() call has push constants with size 1. Size "
7903 "must be greater than zero and a multiple of 4."},
7904 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7905 "vkCmdPushConstants() call has push constants with size 1. Size "
7906 "must be greater than zero and a multiple of 4."},
7907 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7908 "vkCmdPushConstants() call has push constants with offset 1. "
7909 "Offset must be a multiple of 4."},
7910 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7911 "vkCmdPushConstants() call has push constants with offset 1. "
7912 "Offset must be a multiple of 4."},
7913 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
7914 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
7915 "0x1 not within flag-matching ranges in pipeline layout"},
7916 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
7917 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
7918 "0x1 not within flag-matching ranges in pipeline layout"},
7919 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
7920 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
7921 "0x1 not within flag-matching ranges in pipeline layout"},
7922 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
7923 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
7924 "0x1 not within flag-matching ranges in pipeline layout"},
7925 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7926 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
7927 "any of the ranges in pipeline layout"},
7928 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7929 0, 16},
7930 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
7931 "any of the ranges in pipeline layout"},
7932 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007933 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007934 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007935 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007936 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007937 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007938 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007939 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007940 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007941 "vkCmdPushConstants() call has push constants with offset "},
7942 }};
7943
7944 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06007945 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007946 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06007947 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007948 };
Karl Schultzc81037d2016-05-12 08:11:23 -06007949 pipeline_layout_ci.pushConstantRangeCount =
7950 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007951 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007952 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7953 &pipeline_layout);
7954 ASSERT_VK_SUCCESS(err);
7955 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06007956 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7958 iter.msg);
7959 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06007960 iter.range.stageFlags, iter.range.offset,
7961 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007962 m_errorMonitor->VerifyFound();
7963 }
7964
7965 // Check for invalid stage flag
7966 m_errorMonitor->SetDesiredFailureMsg(
7967 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7968 "vkCmdPushConstants() call has no stageFlags set.");
7969 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06007970 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007971 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06007972 EndCommandBuffer();
7973 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
7974 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007975
Karl Schultzc81037d2016-05-12 08:11:23 -06007976 // overlapping range tests with cmd
7977 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
7978 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
7979 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
7980 "0x1 not within flag-matching ranges in pipeline layout"},
7981 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7982 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
7983 "0x1 not within flag-matching ranges in pipeline layout"},
7984 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
7985 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
7986 "0x1 not within flag-matching ranges in pipeline layout"},
7987 }};
7988 const VkPushConstantRange pc_range3[] = {
7989 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
7990 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7991 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7992 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
7993 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
7994 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
7995 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
7996 };
7997 pipeline_layout_ci.pushConstantRangeCount =
7998 sizeof(pc_range3) / sizeof(VkPushConstantRange);
7999 pipeline_layout_ci.pPushConstantRanges = pc_range3;
8000 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8001 &pipeline_layout);
8002 ASSERT_VK_SUCCESS(err);
8003 BeginCommandBuffer();
8004 for (const auto &iter : cmd_overlap_tests) {
8005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8006 iter.msg);
8007 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
8008 iter.range.stageFlags, iter.range.offset,
8009 iter.range.size, dummy_values);
8010 m_errorMonitor->VerifyFound();
8011 }
8012 EndCommandBuffer();
8013 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
8014 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8015
8016 // positive overlapping range tests with cmd
8017 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
8018 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
8019 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
8020 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
8021 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
8022 }};
8023 const VkPushConstantRange pc_range4[] = {
8024 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
8025 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
8026 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
8027 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8028 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
8029 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
8030 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
8031 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
8032 };
8033 pipeline_layout_ci.pushConstantRangeCount =
8034 sizeof(pc_range4) / sizeof(VkPushConstantRange);
8035 pipeline_layout_ci.pPushConstantRanges = pc_range4;
8036 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8037 &pipeline_layout);
8038 ASSERT_VK_SUCCESS(err);
8039 BeginCommandBuffer();
8040 for (const auto &iter : cmd_overlap_tests_pos) {
8041 m_errorMonitor->ExpectSuccess();
8042 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
8043 iter.range.stageFlags, iter.range.offset,
8044 iter.range.size, dummy_values);
8045 m_errorMonitor->VerifyNotFound();
8046 }
8047 EndCommandBuffer();
8048 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008049 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8050}
8051
Karl Schultz6addd812016-02-02 17:17:23 -07008052TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07008053 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07008054 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008055
8056 ASSERT_NO_FATAL_FAILURE(InitState());
8057 ASSERT_NO_FATAL_FAILURE(InitViewport());
8058 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8059
Mike Stroyanb8a61002016-06-20 16:00:28 -06008060 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
8061 VkImageTiling tiling;
8062 VkFormatProperties format_properties;
8063 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
8064 if (format_properties.linearTilingFeatures &
8065 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
8066 tiling = VK_IMAGE_TILING_LINEAR;
8067 } else if (format_properties.optimalTilingFeatures &
8068 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
8069 tiling = VK_IMAGE_TILING_OPTIMAL;
8070 } else {
8071 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
8072 "skipped.\n");
8073 return;
8074 }
8075
Tobin Ehlis559c6382015-11-05 09:52:49 -07008076 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
8077 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008078 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8079 ds_type_count[0].descriptorCount = 10;
8080 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8081 ds_type_count[1].descriptorCount = 2;
8082 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
8083 ds_type_count[2].descriptorCount = 2;
8084 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
8085 ds_type_count[3].descriptorCount = 5;
8086 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
8087 // type
8088 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8089 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
8090 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008091
8092 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008093 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8094 ds_pool_ci.pNext = NULL;
8095 ds_pool_ci.maxSets = 5;
8096 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
8097 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008098
8099 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008100 err =
8101 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008102 ASSERT_VK_SUCCESS(err);
8103
8104 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
8105 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008106 dsl_binding[0].binding = 0;
8107 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8108 dsl_binding[0].descriptorCount = 5;
8109 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
8110 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008111
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008112 // Create layout identical to set0 layout but w/ different stageFlags
8113 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008114 dsl_fs_stage_only.binding = 0;
8115 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8116 dsl_fs_stage_only.descriptorCount = 5;
8117 dsl_fs_stage_only.stageFlags =
8118 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
8119 // bind time
8120 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008121 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008122 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8123 ds_layout_ci.pNext = NULL;
8124 ds_layout_ci.bindingCount = 1;
8125 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008126 static const uint32_t NUM_LAYOUTS = 4;
8127 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008128 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008129 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
8130 // layout for error case
8131 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8132 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008133 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008134 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07008135 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8136 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008137 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008138 dsl_binding[0].binding = 0;
8139 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008140 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008141 dsl_binding[1].binding = 1;
8142 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
8143 dsl_binding[1].descriptorCount = 2;
8144 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
8145 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008146 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008147 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07008148 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8149 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008150 ASSERT_VK_SUCCESS(err);
8151 dsl_binding[0].binding = 0;
8152 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008153 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008154 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008155 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8156 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008157 ASSERT_VK_SUCCESS(err);
8158 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008159 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07008160 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8161 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008162 ASSERT_VK_SUCCESS(err);
8163
8164 static const uint32_t NUM_SETS = 4;
8165 VkDescriptorSet descriptorSet[NUM_SETS] = {};
8166 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008167 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008168 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008169 alloc_info.descriptorPool = ds_pool;
8170 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008171 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8172 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008173 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008174 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008175 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008176 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07008177 err =
8178 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008179 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008180
8181 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008182 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8183 pipeline_layout_ci.pNext = NULL;
8184 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
8185 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008186
8187 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008188 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8189 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008190 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008191 // Create pipelineLayout with only one setLayout
8192 pipeline_layout_ci.setLayoutCount = 1;
8193 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008194 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8195 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008196 ASSERT_VK_SUCCESS(err);
8197 // Create pipelineLayout with 2 descriptor setLayout at index 0
8198 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
8199 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07008200 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8201 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008202 ASSERT_VK_SUCCESS(err);
8203 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
8204 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
8205 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07008206 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8207 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008208 ASSERT_VK_SUCCESS(err);
8209 // Create pipelineLayout with UB type, but stageFlags for FS only
8210 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
8211 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07008212 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8213 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008214 ASSERT_VK_SUCCESS(err);
8215 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
8216 VkDescriptorSetLayout pl_bad_s0[2] = {};
8217 pl_bad_s0[0] = ds_layout_fs_only;
8218 pl_bad_s0[1] = ds_layout[1];
8219 pipeline_layout_ci.setLayoutCount = 2;
8220 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
8221 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07008222 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8223 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008224 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008225
8226 // Create a buffer to update the descriptor with
8227 uint32_t qfi = 0;
8228 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008229 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8230 buffCI.size = 1024;
8231 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
8232 buffCI.queueFamilyIndexCount = 1;
8233 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008234
8235 VkBuffer dyub;
8236 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
8237 ASSERT_VK_SUCCESS(err);
8238 // Correctly update descriptor to avoid "NOT_UPDATED" error
8239 static const uint32_t NUM_BUFFS = 5;
8240 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008241 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07008242 buffInfo[i].buffer = dyub;
8243 buffInfo[i].offset = 0;
8244 buffInfo[i].range = 1024;
8245 }
Karl Schultz6addd812016-02-02 17:17:23 -07008246 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07008247 const int32_t tex_width = 32;
8248 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008249 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008250 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8251 image_create_info.pNext = NULL;
8252 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8253 image_create_info.format = tex_format;
8254 image_create_info.extent.width = tex_width;
8255 image_create_info.extent.height = tex_height;
8256 image_create_info.extent.depth = 1;
8257 image_create_info.mipLevels = 1;
8258 image_create_info.arrayLayers = 1;
8259 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06008260 image_create_info.tiling = tiling;
8261 image_create_info.usage =
8262 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07008263 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008264 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8265 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008266
Karl Schultz6addd812016-02-02 17:17:23 -07008267 VkMemoryRequirements memReqs;
8268 VkDeviceMemory imageMem;
8269 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008270 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008271 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8272 memAlloc.pNext = NULL;
8273 memAlloc.allocationSize = 0;
8274 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008275 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
8276 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008277 pass =
8278 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008279 ASSERT_TRUE(pass);
8280 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
8281 ASSERT_VK_SUCCESS(err);
8282 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
8283 ASSERT_VK_SUCCESS(err);
8284
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008285 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008286 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8287 image_view_create_info.image = image;
8288 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8289 image_view_create_info.format = tex_format;
8290 image_view_create_info.subresourceRange.layerCount = 1;
8291 image_view_create_info.subresourceRange.baseMipLevel = 0;
8292 image_view_create_info.subresourceRange.levelCount = 1;
8293 image_view_create_info.subresourceRange.aspectMask =
8294 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008295
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008296 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008297 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8298 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008299 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008300 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008301 imageInfo[0].imageView = view;
8302 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
8303 imageInfo[1].imageView = view;
8304 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008305 imageInfo[2].imageView = view;
8306 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
8307 imageInfo[3].imageView = view;
8308 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008309
8310 static const uint32_t NUM_SET_UPDATES = 3;
8311 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
8312 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8313 descriptor_write[0].dstSet = descriptorSet[0];
8314 descriptor_write[0].dstBinding = 0;
8315 descriptor_write[0].descriptorCount = 5;
8316 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8317 descriptor_write[0].pBufferInfo = buffInfo;
8318 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8319 descriptor_write[1].dstSet = descriptorSet[1];
8320 descriptor_write[1].dstBinding = 0;
8321 descriptor_write[1].descriptorCount = 2;
8322 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8323 descriptor_write[1].pImageInfo = imageInfo;
8324 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8325 descriptor_write[2].dstSet = descriptorSet[1];
8326 descriptor_write[2].dstBinding = 1;
8327 descriptor_write[2].descriptorCount = 2;
8328 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008329 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008330
8331 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008332
Tobin Ehlis88452832015-12-03 09:40:56 -07008333 // Create PSO to be used for draw-time errors below
8334 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12008335 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008336 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008337 "out gl_PerVertex {\n"
8338 " vec4 gl_Position;\n"
8339 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008340 "void main(){\n"
8341 " gl_Position = vec4(1);\n"
8342 "}\n";
8343 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12008344 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008345 "\n"
8346 "layout(location=0) out vec4 x;\n"
8347 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
8348 "void main(){\n"
8349 " x = vec4(bar.y);\n"
8350 "}\n";
8351 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8352 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008353 VkPipelineObj pipe(m_device);
8354 pipe.AddShader(&vs);
8355 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07008356 pipe.AddColorAttachment();
8357 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07008358
8359 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07008360
Karl Schultz6addd812016-02-02 17:17:23 -07008361 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8362 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8363 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
8364 // of PSO
8365 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
8366 // cmd_pipeline.c
8367 // due to the fact that cmd_alloc_dset_data() has not been called in
8368 // cmd_bind_graphics_pipeline()
8369 // TODO : Want to cause various binding incompatibility issues here to test
8370 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07008371 // First cause various verify_layout_compatibility() fails
8372 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008373 // verify_set_layout_compatibility fail cases:
8374 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07008375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06008376 "Invalid Pipeline Layout Object ");
Karl Schultz6addd812016-02-02 17:17:23 -07008377 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8378 VK_PIPELINE_BIND_POINT_GRAPHICS,
8379 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
8380 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008381 m_errorMonitor->VerifyFound();
8382
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008383 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07008384 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8385 " attempting to bind set to index 1");
8386 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8387 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
8388 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008389 m_errorMonitor->VerifyFound();
8390
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008391 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008392 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
8393 // descriptors
8394 m_errorMonitor->SetDesiredFailureMsg(
8395 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008396 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07008397 vkCmdBindDescriptorSets(
8398 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8399 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008400 m_errorMonitor->VerifyFound();
8401
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008402 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
8403 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07008404 m_errorMonitor->SetDesiredFailureMsg(
8405 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008406 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07008407 vkCmdBindDescriptorSets(
8408 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8409 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008410 m_errorMonitor->VerifyFound();
8411
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008412 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
8413 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07008414 m_errorMonitor->SetDesiredFailureMsg(
8415 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008416 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07008417 vkCmdBindDescriptorSets(
8418 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8419 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008420 m_errorMonitor->VerifyFound();
8421
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008422 // Cause INFO messages due to disturbing previously bound Sets
8423 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07008424 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8425 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8426 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008427 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07008428 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008429 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008430 " previously bound as set #0 was disturbed ");
8431 vkCmdBindDescriptorSets(
8432 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8433 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008434 m_errorMonitor->VerifyFound();
8435
Karl Schultz6addd812016-02-02 17:17:23 -07008436 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8437 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8438 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008439 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008441 " newly bound as set #0 so set #1 and "
8442 "any subsequent sets were disturbed ");
8443 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8444 VK_PIPELINE_BIND_POINT_GRAPHICS,
8445 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008446 m_errorMonitor->VerifyFound();
8447
Tobin Ehlis10fad692016-07-07 12:00:36 -06008448 // Now that we're done actively using the pipelineLayout that gfx pipeline
8449 // was created with, we should be able to delete it. Do that now to verify
8450 // that validation obeys pipelineLayout lifetime
8451 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
8452
Tobin Ehlis88452832015-12-03 09:40:56 -07008453 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07008454 // 1. Error due to not binding required set (we actually use same code as
8455 // above to disturb set0)
8456 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8457 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8458 2, &descriptorSet[0], 0, NULL);
8459 vkCmdBindDescriptorSets(
8460 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8461 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
8462 m_errorMonitor->SetDesiredFailureMsg(
8463 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8464 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07008465 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008466 m_errorMonitor->VerifyFound();
8467
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008468 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008469 // 2. Error due to bound set not being compatible with PSO's
8470 // VkPipelineLayout (diff stageFlags in this case)
8471 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8472 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8473 2, &descriptorSet[0], 0, NULL);
8474 m_errorMonitor->SetDesiredFailureMsg(
8475 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8476 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07008477 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008478 m_errorMonitor->VerifyFound();
8479
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008480 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07008481 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008482 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
8483 }
8484 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06008485 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
8486 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008487 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008488 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8489 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008490 vkFreeMemory(m_device->device(), imageMem, NULL);
8491 vkDestroyImage(m_device->device(), image, NULL);
8492 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008493}
Tobin Ehlis559c6382015-11-05 09:52:49 -07008494
Karl Schultz6addd812016-02-02 17:17:23 -07008495TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008496
Karl Schultz6addd812016-02-02 17:17:23 -07008497 m_errorMonitor->SetDesiredFailureMsg(
8498 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008499 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008500
8501 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008502 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008503 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008504 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008505
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008506 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008507}
8508
Karl Schultz6addd812016-02-02 17:17:23 -07008509TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
8510 VkResult err;
8511 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008512
Karl Schultz6addd812016-02-02 17:17:23 -07008513 m_errorMonitor->SetDesiredFailureMsg(
8514 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07008515 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008516
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008517 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008518
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008519 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008520 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008521 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008522 cmd.commandPool = m_commandPool;
8523 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008524 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06008525
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008526 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06008527 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008528
8529 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008530 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008531 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008532 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008533 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008534 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
8535 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008536 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008537
8538 // The error should be caught by validation of the BeginCommandBuffer call
8539 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
8540
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008541 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008542 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008543}
8544
Karl Schultz6addd812016-02-02 17:17:23 -07008545TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008546 // Cause error due to Begin while recording CB
8547 // Then cause 2 errors for attempting to reset CB w/o having
8548 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
8549 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008550 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008551 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008552
8553 ASSERT_NO_FATAL_FAILURE(InitState());
8554
8555 // Calls AllocateCommandBuffers
8556 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
8557
Karl Schultz6addd812016-02-02 17:17:23 -07008558 // Force the failure by setting the Renderpass and Framebuffer fields with
8559 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008560 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008561 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008562 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8563 cmd_buf_info.pNext = NULL;
8564 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008565 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008566
8567 // Begin CB to transition to recording state
8568 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
8569 // Can't re-begin. This should trigger error
8570 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008571 m_errorMonitor->VerifyFound();
8572
Karl Schultz6addd812016-02-02 17:17:23 -07008573 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8574 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008575 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
8576 // Reset attempt will trigger error due to incorrect CommandPool state
8577 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008578 m_errorMonitor->VerifyFound();
8579
Karl Schultz6addd812016-02-02 17:17:23 -07008580 m_errorMonitor->SetDesiredFailureMsg(
8581 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8582 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008583 // Transition CB to RECORDED state
8584 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
8585 // Now attempting to Begin will implicitly reset, which triggers error
8586 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008587 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008588}
8589
Karl Schultz6addd812016-02-02 17:17:23 -07008590TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008591 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008592 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008593
Karl Schultz6addd812016-02-02 17:17:23 -07008594 m_errorMonitor->SetDesiredFailureMsg(
8595 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008596 "Invalid Pipeline CreateInfo State: Vtx Shader required");
8597
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008598 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008599 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008600
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008601 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008602 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8603 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06008604
8605 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008606 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8607 ds_pool_ci.pNext = NULL;
8608 ds_pool_ci.maxSets = 1;
8609 ds_pool_ci.poolSizeCount = 1;
8610 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008611
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008612 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008613 err =
8614 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008615 ASSERT_VK_SUCCESS(err);
8616
Tony Barboureb254902015-07-15 12:50:33 -06008617 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008618 dsl_binding.binding = 0;
8619 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8620 dsl_binding.descriptorCount = 1;
8621 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8622 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008623
Tony Barboureb254902015-07-15 12:50:33 -06008624 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008625 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8626 ds_layout_ci.pNext = NULL;
8627 ds_layout_ci.bindingCount = 1;
8628 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06008629
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008630 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008631 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8632 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008633 ASSERT_VK_SUCCESS(err);
8634
8635 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008636 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008637 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008638 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008639 alloc_info.descriptorPool = ds_pool;
8640 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008641 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8642 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008643 ASSERT_VK_SUCCESS(err);
8644
Tony Barboureb254902015-07-15 12:50:33 -06008645 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008646 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8647 pipeline_layout_ci.setLayoutCount = 1;
8648 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008649
8650 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008651 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8652 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008653 ASSERT_VK_SUCCESS(err);
8654
Tobin Ehlise68360f2015-10-01 11:15:13 -06008655 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008656 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06008657
8658 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008659 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8660 vp_state_ci.scissorCount = 1;
8661 vp_state_ci.pScissors = &sc;
8662 vp_state_ci.viewportCount = 1;
8663 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008664
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008665 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8666 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8667 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8668 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8669 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8670 rs_state_ci.depthClampEnable = VK_FALSE;
8671 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8672 rs_state_ci.depthBiasEnable = VK_FALSE;
8673
Tony Barboureb254902015-07-15 12:50:33 -06008674 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008675 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8676 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008677 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008678 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8679 gp_ci.layout = pipeline_layout;
8680 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06008681
8682 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008683 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8684 pc_ci.initialDataSize = 0;
8685 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008686
8687 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06008688 VkPipelineCache pipelineCache;
8689
Karl Schultz6addd812016-02-02 17:17:23 -07008690 err =
8691 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06008692 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008693 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8694 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008695
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008696 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008697
Chia-I Wuf7458c52015-10-26 21:10:41 +08008698 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8699 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8700 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8701 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008702}
Tobin Ehlis912df022015-09-17 08:46:18 -06008703/*// TODO : This test should be good, but needs Tess support in compiler to run
8704TEST_F(VkLayerTest, InvalidPatchControlPoints)
8705{
8706 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06008707 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008708
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008710 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
8711primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008712
Tobin Ehlis912df022015-09-17 08:46:18 -06008713 ASSERT_NO_FATAL_FAILURE(InitState());
8714 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06008715
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008716 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06008717 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008718 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008719
8720 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8721 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8722 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008723 ds_pool_ci.poolSizeCount = 1;
8724 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06008725
8726 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008727 err = vkCreateDescriptorPool(m_device->device(),
8728VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06008729 ASSERT_VK_SUCCESS(err);
8730
8731 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08008732 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06008733 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08008734 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008735 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8736 dsl_binding.pImmutableSamplers = NULL;
8737
8738 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008739 ds_layout_ci.sType =
8740VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008741 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008742 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008743 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06008744
8745 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008746 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8747&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008748 ASSERT_VK_SUCCESS(err);
8749
8750 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07008751 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
8752VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06008753 ASSERT_VK_SUCCESS(err);
8754
8755 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008756 pipeline_layout_ci.sType =
8757VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008758 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008759 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008760 pipeline_layout_ci.pSetLayouts = &ds_layout;
8761
8762 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008763 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8764&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008765 ASSERT_VK_SUCCESS(err);
8766
8767 VkPipelineShaderStageCreateInfo shaderStages[3];
8768 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
8769
Karl Schultz6addd812016-02-02 17:17:23 -07008770 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
8771this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008772 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07008773 VkShaderObj
8774tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
8775this);
8776 VkShaderObj
8777te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
8778this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008779
Karl Schultz6addd812016-02-02 17:17:23 -07008780 shaderStages[0].sType =
8781VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008782 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008783 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008784 shaderStages[1].sType =
8785VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008786 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008787 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008788 shaderStages[2].sType =
8789VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008790 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008791 shaderStages[2].shader = te.handle();
8792
8793 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008794 iaCI.sType =
8795VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08008796 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06008797
8798 VkPipelineTessellationStateCreateInfo tsCI = {};
8799 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
8800 tsCI.patchControlPoints = 0; // This will cause an error
8801
8802 VkGraphicsPipelineCreateInfo gp_ci = {};
8803 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8804 gp_ci.pNext = NULL;
8805 gp_ci.stageCount = 3;
8806 gp_ci.pStages = shaderStages;
8807 gp_ci.pVertexInputState = NULL;
8808 gp_ci.pInputAssemblyState = &iaCI;
8809 gp_ci.pTessellationState = &tsCI;
8810 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008811 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06008812 gp_ci.pMultisampleState = NULL;
8813 gp_ci.pDepthStencilState = NULL;
8814 gp_ci.pColorBlendState = NULL;
8815 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8816 gp_ci.layout = pipeline_layout;
8817 gp_ci.renderPass = renderPass();
8818
8819 VkPipelineCacheCreateInfo pc_ci = {};
8820 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8821 pc_ci.pNext = NULL;
8822 pc_ci.initialSize = 0;
8823 pc_ci.initialData = 0;
8824 pc_ci.maxSize = 0;
8825
8826 VkPipeline pipeline;
8827 VkPipelineCache pipelineCache;
8828
Karl Schultz6addd812016-02-02 17:17:23 -07008829 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
8830&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06008831 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008832 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8833&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06008834
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008835 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008836
Chia-I Wuf7458c52015-10-26 21:10:41 +08008837 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8838 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8839 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8840 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06008841}
8842*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06008843// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07008844TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008845 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008846
Karl Schultz6addd812016-02-02 17:17:23 -07008847 m_errorMonitor->SetDesiredFailureMsg(
8848 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008849 "Gfx Pipeline viewport count (1) must match scissor count (0).");
8850
Tobin Ehlise68360f2015-10-01 11:15:13 -06008851 ASSERT_NO_FATAL_FAILURE(InitState());
8852 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008853
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008854 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008855 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8856 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008857
8858 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008859 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8860 ds_pool_ci.maxSets = 1;
8861 ds_pool_ci.poolSizeCount = 1;
8862 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008863
8864 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008865 err =
8866 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008867 ASSERT_VK_SUCCESS(err);
8868
8869 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008870 dsl_binding.binding = 0;
8871 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8872 dsl_binding.descriptorCount = 1;
8873 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008874
8875 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008876 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8877 ds_layout_ci.bindingCount = 1;
8878 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008879
8880 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008881 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8882 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008883 ASSERT_VK_SUCCESS(err);
8884
8885 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008886 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008887 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008888 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008889 alloc_info.descriptorPool = ds_pool;
8890 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008891 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8892 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008893 ASSERT_VK_SUCCESS(err);
8894
8895 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008896 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8897 pipeline_layout_ci.setLayoutCount = 1;
8898 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008899
8900 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008901 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8902 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008903 ASSERT_VK_SUCCESS(err);
8904
8905 VkViewport vp = {}; // Just need dummy vp to point to
8906
8907 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008908 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8909 vp_state_ci.scissorCount = 0;
8910 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
8911 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008912
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008913 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8914 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8915 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8916 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8917 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8918 rs_state_ci.depthClampEnable = VK_FALSE;
8919 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8920 rs_state_ci.depthBiasEnable = VK_FALSE;
8921
Cody Northropeb3a6c12015-10-05 14:44:45 -06008922 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008923 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008924
Karl Schultz6addd812016-02-02 17:17:23 -07008925 VkShaderObj vs(m_device, bindStateVertShaderText,
8926 VK_SHADER_STAGE_VERTEX_BIT, this);
8927 VkShaderObj fs(m_device, bindStateFragShaderText,
8928 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008929 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008930 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008931 shaderStages[0] = vs.GetStageCreateInfo();
8932 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008933
8934 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008935 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8936 gp_ci.stageCount = 2;
8937 gp_ci.pStages = shaderStages;
8938 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008939 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008940 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8941 gp_ci.layout = pipeline_layout;
8942 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008943
8944 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008945 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008946
8947 VkPipeline pipeline;
8948 VkPipelineCache pipelineCache;
8949
Karl Schultz6addd812016-02-02 17:17:23 -07008950 err =
8951 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008952 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008953 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8954 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008955
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008956 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008957
Chia-I Wuf7458c52015-10-26 21:10:41 +08008958 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8959 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8960 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8961 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008962}
Karl Schultz6addd812016-02-02 17:17:23 -07008963// Don't set viewport state in PSO. This is an error b/c we always need this
8964// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06008965// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008966TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06008967 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008968 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008969
Karl Schultz6addd812016-02-02 17:17:23 -07008970 m_errorMonitor->SetDesiredFailureMsg(
8971 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008972 "Gfx Pipeline pViewportState is null. Even if ");
8973
Tobin Ehlise68360f2015-10-01 11:15:13 -06008974 ASSERT_NO_FATAL_FAILURE(InitState());
8975 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008976
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008977 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008978 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8979 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008980
8981 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008982 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8983 ds_pool_ci.maxSets = 1;
8984 ds_pool_ci.poolSizeCount = 1;
8985 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008986
8987 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008988 err =
8989 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008990 ASSERT_VK_SUCCESS(err);
8991
8992 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008993 dsl_binding.binding = 0;
8994 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8995 dsl_binding.descriptorCount = 1;
8996 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008997
8998 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008999 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9000 ds_layout_ci.bindingCount = 1;
9001 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009002
9003 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009004 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9005 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009006 ASSERT_VK_SUCCESS(err);
9007
9008 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009009 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009010 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009011 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009012 alloc_info.descriptorPool = ds_pool;
9013 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009014 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9015 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009016 ASSERT_VK_SUCCESS(err);
9017
9018 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009019 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9020 pipeline_layout_ci.setLayoutCount = 1;
9021 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009022
9023 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009024 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9025 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009026 ASSERT_VK_SUCCESS(err);
9027
9028 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
9029 // Set scissor as dynamic to avoid second error
9030 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009031 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9032 dyn_state_ci.dynamicStateCount = 1;
9033 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009034
Cody Northropeb3a6c12015-10-05 14:44:45 -06009035 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009036 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009037
Karl Schultz6addd812016-02-02 17:17:23 -07009038 VkShaderObj vs(m_device, bindStateVertShaderText,
9039 VK_SHADER_STAGE_VERTEX_BIT, this);
9040 VkShaderObj fs(m_device, bindStateFragShaderText,
9041 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009042 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009043 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009044 shaderStages[0] = vs.GetStageCreateInfo();
9045 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009046
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009047
9048 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
9049 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9050 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
9051 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
9052 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9053 rs_state_ci.depthClampEnable = VK_FALSE;
9054 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
9055 rs_state_ci.depthBiasEnable = VK_FALSE;
9056
Tobin Ehlise68360f2015-10-01 11:15:13 -06009057 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009058 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9059 gp_ci.stageCount = 2;
9060 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009061 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07009062 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
9063 // should cause validation error
9064 gp_ci.pDynamicState = &dyn_state_ci;
9065 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9066 gp_ci.layout = pipeline_layout;
9067 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009068
9069 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009070 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009071
9072 VkPipeline pipeline;
9073 VkPipelineCache pipelineCache;
9074
Karl Schultz6addd812016-02-02 17:17:23 -07009075 err =
9076 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009077 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009078 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9079 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009080
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009081 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009082
Chia-I Wuf7458c52015-10-26 21:10:41 +08009083 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9084 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9085 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9086 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009087}
9088// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07009089// Then run second test where dynamic scissor count doesn't match PSO scissor
9090// count
9091TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
9092 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009093
Karl Schultz6addd812016-02-02 17:17:23 -07009094 m_errorMonitor->SetDesiredFailureMsg(
9095 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009096 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
9097
Tobin Ehlise68360f2015-10-01 11:15:13 -06009098 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009099
9100 if (!m_device->phy().features().multiViewport) {
9101 printf("Device does not support multiple viewports/scissors; skipped.\n");
9102 return;
9103 }
9104
Tobin Ehlise68360f2015-10-01 11:15:13 -06009105 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06009106
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009107 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009108 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9109 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009110
9111 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009112 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9113 ds_pool_ci.maxSets = 1;
9114 ds_pool_ci.poolSizeCount = 1;
9115 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009116
9117 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009118 err =
9119 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009120 ASSERT_VK_SUCCESS(err);
9121
9122 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009123 dsl_binding.binding = 0;
9124 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9125 dsl_binding.descriptorCount = 1;
9126 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009127
9128 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009129 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9130 ds_layout_ci.bindingCount = 1;
9131 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009132
9133 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009134 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9135 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009136 ASSERT_VK_SUCCESS(err);
9137
9138 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009139 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009140 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009141 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009142 alloc_info.descriptorPool = ds_pool;
9143 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009144 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9145 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009146 ASSERT_VK_SUCCESS(err);
9147
9148 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009149 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9150 pipeline_layout_ci.setLayoutCount = 1;
9151 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009152
9153 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009154 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9155 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009156 ASSERT_VK_SUCCESS(err);
9157
9158 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009159 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9160 vp_state_ci.viewportCount = 1;
9161 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
9162 vp_state_ci.scissorCount = 1;
9163 vp_state_ci.pScissors =
9164 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06009165
9166 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
9167 // Set scissor as dynamic to avoid that error
9168 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009169 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9170 dyn_state_ci.dynamicStateCount = 1;
9171 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009172
Cody Northropeb3a6c12015-10-05 14:44:45 -06009173 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009174 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009175
Karl Schultz6addd812016-02-02 17:17:23 -07009176 VkShaderObj vs(m_device, bindStateVertShaderText,
9177 VK_SHADER_STAGE_VERTEX_BIT, this);
9178 VkShaderObj fs(m_device, bindStateFragShaderText,
9179 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009180 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009181 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009182 shaderStages[0] = vs.GetStageCreateInfo();
9183 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009184
Cody Northropf6622dc2015-10-06 10:33:21 -06009185 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9186 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9187 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009188 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06009189 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009190 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06009191 vi_ci.pVertexAttributeDescriptions = nullptr;
9192
9193 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9194 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9195 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9196
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009197 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009198 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06009199 rs_ci.pNext = nullptr;
9200
Mark Youngc89c6312016-03-31 16:03:20 -06009201 VkPipelineColorBlendAttachmentState att = {};
9202 att.blendEnable = VK_FALSE;
9203 att.colorWriteMask = 0xf;
9204
Cody Northropf6622dc2015-10-06 10:33:21 -06009205 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9206 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9207 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06009208 cb_ci.attachmentCount = 1;
9209 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06009210
Tobin Ehlise68360f2015-10-01 11:15:13 -06009211 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009212 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9213 gp_ci.stageCount = 2;
9214 gp_ci.pStages = shaderStages;
9215 gp_ci.pVertexInputState = &vi_ci;
9216 gp_ci.pInputAssemblyState = &ia_ci;
9217 gp_ci.pViewportState = &vp_state_ci;
9218 gp_ci.pRasterizationState = &rs_ci;
9219 gp_ci.pColorBlendState = &cb_ci;
9220 gp_ci.pDynamicState = &dyn_state_ci;
9221 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9222 gp_ci.layout = pipeline_layout;
9223 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009224
9225 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009226 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009227
9228 VkPipeline pipeline;
9229 VkPipelineCache pipelineCache;
9230
Karl Schultz6addd812016-02-02 17:17:23 -07009231 err =
9232 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009233 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009234 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9235 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009236
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009237 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009238
Tobin Ehlisd332f282015-10-02 11:00:56 -06009239 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07009240 // First need to successfully create the PSO from above by setting
9241 // pViewports
9242 m_errorMonitor->SetDesiredFailureMsg(
9243 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009244 "Dynamic scissor(s) 0 are used by PSO, ");
Karl Schultz6addd812016-02-02 17:17:23 -07009245
9246 VkViewport vp = {}; // Just need dummy vp to point to
9247 vp_state_ci.pViewports = &vp;
9248 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9249 &gp_ci, NULL, &pipeline);
9250 ASSERT_VK_SUCCESS(err);
9251 BeginCommandBuffer();
9252 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9253 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009254 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07009255 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009256 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07009257 Draw(1, 0, 0, 0);
9258
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009259 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07009260
9261 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9262 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9263 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9264 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009265 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07009266}
9267// Create PSO w/o non-zero scissorCount but no scissor data
9268// Then run second test where dynamic viewportCount doesn't match PSO
9269// viewportCount
9270TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
9271 VkResult err;
9272
9273 m_errorMonitor->SetDesiredFailureMsg(
9274 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9275 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
9276
9277 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009278
9279 if (!m_device->phy().features().multiViewport) {
9280 printf("Device does not support multiple viewports/scissors; skipped.\n");
9281 return;
9282 }
9283
Karl Schultz6addd812016-02-02 17:17:23 -07009284 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9285
9286 VkDescriptorPoolSize ds_type_count = {};
9287 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9288 ds_type_count.descriptorCount = 1;
9289
9290 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9291 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9292 ds_pool_ci.maxSets = 1;
9293 ds_pool_ci.poolSizeCount = 1;
9294 ds_pool_ci.pPoolSizes = &ds_type_count;
9295
9296 VkDescriptorPool ds_pool;
9297 err =
9298 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9299 ASSERT_VK_SUCCESS(err);
9300
9301 VkDescriptorSetLayoutBinding dsl_binding = {};
9302 dsl_binding.binding = 0;
9303 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9304 dsl_binding.descriptorCount = 1;
9305 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9306
9307 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9308 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9309 ds_layout_ci.bindingCount = 1;
9310 ds_layout_ci.pBindings = &dsl_binding;
9311
9312 VkDescriptorSetLayout ds_layout;
9313 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9314 &ds_layout);
9315 ASSERT_VK_SUCCESS(err);
9316
9317 VkDescriptorSet descriptorSet;
9318 VkDescriptorSetAllocateInfo alloc_info = {};
9319 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9320 alloc_info.descriptorSetCount = 1;
9321 alloc_info.descriptorPool = ds_pool;
9322 alloc_info.pSetLayouts = &ds_layout;
9323 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9324 &descriptorSet);
9325 ASSERT_VK_SUCCESS(err);
9326
9327 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9328 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9329 pipeline_layout_ci.setLayoutCount = 1;
9330 pipeline_layout_ci.pSetLayouts = &ds_layout;
9331
9332 VkPipelineLayout pipeline_layout;
9333 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9334 &pipeline_layout);
9335 ASSERT_VK_SUCCESS(err);
9336
9337 VkPipelineViewportStateCreateInfo vp_state_ci = {};
9338 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9339 vp_state_ci.scissorCount = 1;
9340 vp_state_ci.pScissors =
9341 NULL; // Null scissor w/ count of 1 should cause error
9342 vp_state_ci.viewportCount = 1;
9343 vp_state_ci.pViewports =
9344 NULL; // vp is dynamic (below) so this won't cause error
9345
9346 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
9347 // Set scissor as dynamic to avoid that error
9348 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
9349 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9350 dyn_state_ci.dynamicStateCount = 1;
9351 dyn_state_ci.pDynamicStates = &vp_state;
9352
9353 VkPipelineShaderStageCreateInfo shaderStages[2];
9354 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
9355
9356 VkShaderObj vs(m_device, bindStateVertShaderText,
9357 VK_SHADER_STAGE_VERTEX_BIT, this);
9358 VkShaderObj fs(m_device, bindStateFragShaderText,
9359 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009360 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009361 // but add it to be able to run on more devices
9362 shaderStages[0] = vs.GetStageCreateInfo();
9363 shaderStages[1] = fs.GetStageCreateInfo();
9364
9365 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9366 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9367 vi_ci.pNext = nullptr;
9368 vi_ci.vertexBindingDescriptionCount = 0;
9369 vi_ci.pVertexBindingDescriptions = nullptr;
9370 vi_ci.vertexAttributeDescriptionCount = 0;
9371 vi_ci.pVertexAttributeDescriptions = nullptr;
9372
9373 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9374 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9375 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9376
9377 VkPipelineRasterizationStateCreateInfo rs_ci = {};
9378 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9379 rs_ci.pNext = nullptr;
9380
Mark Youngc89c6312016-03-31 16:03:20 -06009381 VkPipelineColorBlendAttachmentState att = {};
9382 att.blendEnable = VK_FALSE;
9383 att.colorWriteMask = 0xf;
9384
Karl Schultz6addd812016-02-02 17:17:23 -07009385 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9386 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9387 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06009388 cb_ci.attachmentCount = 1;
9389 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07009390
9391 VkGraphicsPipelineCreateInfo gp_ci = {};
9392 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9393 gp_ci.stageCount = 2;
9394 gp_ci.pStages = shaderStages;
9395 gp_ci.pVertexInputState = &vi_ci;
9396 gp_ci.pInputAssemblyState = &ia_ci;
9397 gp_ci.pViewportState = &vp_state_ci;
9398 gp_ci.pRasterizationState = &rs_ci;
9399 gp_ci.pColorBlendState = &cb_ci;
9400 gp_ci.pDynamicState = &dyn_state_ci;
9401 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9402 gp_ci.layout = pipeline_layout;
9403 gp_ci.renderPass = renderPass();
9404
9405 VkPipelineCacheCreateInfo pc_ci = {};
9406 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9407
9408 VkPipeline pipeline;
9409 VkPipelineCache pipelineCache;
9410
9411 err =
9412 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9413 ASSERT_VK_SUCCESS(err);
9414 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9415 &gp_ci, NULL, &pipeline);
9416
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009417 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07009418
9419 // Now hit second fail case where we set scissor w/ different count than PSO
9420 // First need to successfully create the PSO from above by setting
9421 // pViewports
9422 m_errorMonitor->SetDesiredFailureMsg(
9423 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009424 "Dynamic viewport(s) 0 are used by PSO, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009425
Tobin Ehlisd332f282015-10-02 11:00:56 -06009426 VkRect2D sc = {}; // Just need dummy vp to point to
9427 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07009428 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9429 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009430 ASSERT_VK_SUCCESS(err);
9431 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009432 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9433 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009434 VkViewport viewports[1] = {}; // don't care about data
Tobin Ehlisd332f282015-10-02 11:00:56 -06009435 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009436 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009437 Draw(1, 0, 0, 0);
9438
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009439 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009440
Chia-I Wuf7458c52015-10-26 21:10:41 +08009441 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9442 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9443 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9444 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009445 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009446}
9447
Mark Young7394fdd2016-03-31 14:56:43 -06009448TEST_F(VkLayerTest, PSOLineWidthInvalid) {
9449 VkResult err;
9450
9451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009452 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009453
9454 ASSERT_NO_FATAL_FAILURE(InitState());
9455 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9456
9457 VkDescriptorPoolSize ds_type_count = {};
9458 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9459 ds_type_count.descriptorCount = 1;
9460
9461 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9462 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9463 ds_pool_ci.maxSets = 1;
9464 ds_pool_ci.poolSizeCount = 1;
9465 ds_pool_ci.pPoolSizes = &ds_type_count;
9466
9467 VkDescriptorPool ds_pool;
9468 err =
9469 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9470 ASSERT_VK_SUCCESS(err);
9471
9472 VkDescriptorSetLayoutBinding dsl_binding = {};
9473 dsl_binding.binding = 0;
9474 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9475 dsl_binding.descriptorCount = 1;
9476 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9477
9478 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9479 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9480 ds_layout_ci.bindingCount = 1;
9481 ds_layout_ci.pBindings = &dsl_binding;
9482
9483 VkDescriptorSetLayout ds_layout;
9484 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9485 &ds_layout);
9486 ASSERT_VK_SUCCESS(err);
9487
9488 VkDescriptorSet descriptorSet;
9489 VkDescriptorSetAllocateInfo alloc_info = {};
9490 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9491 alloc_info.descriptorSetCount = 1;
9492 alloc_info.descriptorPool = ds_pool;
9493 alloc_info.pSetLayouts = &ds_layout;
9494 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9495 &descriptorSet);
9496 ASSERT_VK_SUCCESS(err);
9497
9498 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9499 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9500 pipeline_layout_ci.setLayoutCount = 1;
9501 pipeline_layout_ci.pSetLayouts = &ds_layout;
9502
9503 VkPipelineLayout pipeline_layout;
9504 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9505 &pipeline_layout);
9506 ASSERT_VK_SUCCESS(err);
9507
9508 VkPipelineViewportStateCreateInfo vp_state_ci = {};
9509 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9510 vp_state_ci.scissorCount = 1;
9511 vp_state_ci.pScissors = NULL;
9512 vp_state_ci.viewportCount = 1;
9513 vp_state_ci.pViewports = NULL;
9514
9515 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
9516 VK_DYNAMIC_STATE_SCISSOR,
9517 VK_DYNAMIC_STATE_LINE_WIDTH};
9518 // Set scissor as dynamic to avoid that error
9519 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
9520 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9521 dyn_state_ci.dynamicStateCount = 2;
9522 dyn_state_ci.pDynamicStates = dynamic_states;
9523
9524 VkPipelineShaderStageCreateInfo shaderStages[2];
9525 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
9526
9527 VkShaderObj vs(m_device, bindStateVertShaderText,
9528 VK_SHADER_STAGE_VERTEX_BIT, this);
9529 VkShaderObj fs(m_device, bindStateFragShaderText,
9530 VK_SHADER_STAGE_FRAGMENT_BIT,
9531 this); // TODO - We shouldn't need a fragment shader
9532 // but add it to be able to run on more devices
9533 shaderStages[0] = vs.GetStageCreateInfo();
9534 shaderStages[1] = fs.GetStageCreateInfo();
9535
9536 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9537 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9538 vi_ci.pNext = nullptr;
9539 vi_ci.vertexBindingDescriptionCount = 0;
9540 vi_ci.pVertexBindingDescriptions = nullptr;
9541 vi_ci.vertexAttributeDescriptionCount = 0;
9542 vi_ci.pVertexAttributeDescriptions = nullptr;
9543
9544 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9545 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9546 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9547
9548 VkPipelineRasterizationStateCreateInfo rs_ci = {};
9549 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9550 rs_ci.pNext = nullptr;
9551
Mark Young47107952016-05-02 15:59:55 -06009552 // Check too low (line width of -1.0f).
9553 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06009554
9555 VkPipelineColorBlendAttachmentState att = {};
9556 att.blendEnable = VK_FALSE;
9557 att.colorWriteMask = 0xf;
9558
9559 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9560 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9561 cb_ci.pNext = nullptr;
9562 cb_ci.attachmentCount = 1;
9563 cb_ci.pAttachments = &att;
9564
9565 VkGraphicsPipelineCreateInfo gp_ci = {};
9566 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9567 gp_ci.stageCount = 2;
9568 gp_ci.pStages = shaderStages;
9569 gp_ci.pVertexInputState = &vi_ci;
9570 gp_ci.pInputAssemblyState = &ia_ci;
9571 gp_ci.pViewportState = &vp_state_ci;
9572 gp_ci.pRasterizationState = &rs_ci;
9573 gp_ci.pColorBlendState = &cb_ci;
9574 gp_ci.pDynamicState = &dyn_state_ci;
9575 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9576 gp_ci.layout = pipeline_layout;
9577 gp_ci.renderPass = renderPass();
9578
9579 VkPipelineCacheCreateInfo pc_ci = {};
9580 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9581
9582 VkPipeline pipeline;
9583 VkPipelineCache pipelineCache;
9584
9585 err =
9586 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9587 ASSERT_VK_SUCCESS(err);
9588 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9589 &gp_ci, NULL, &pipeline);
9590
9591 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009592 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009593
9594 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9595 "Attempt to set lineWidth to 65536");
9596
9597 // Check too high (line width of 65536.0f).
9598 rs_ci.lineWidth = 65536.0f;
9599
9600 err =
9601 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9602 ASSERT_VK_SUCCESS(err);
9603 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9604 &gp_ci, NULL, &pipeline);
9605
9606 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009607 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009608
9609 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009610 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009611
9612 dyn_state_ci.dynamicStateCount = 3;
9613
9614 rs_ci.lineWidth = 1.0f;
9615
9616 err =
9617 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9618 ASSERT_VK_SUCCESS(err);
9619 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9620 &gp_ci, NULL, &pipeline);
9621 BeginCommandBuffer();
9622 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9623 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
9624
9625 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06009626 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06009627 m_errorMonitor->VerifyFound();
9628
9629 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9630 "Attempt to set lineWidth to 65536");
9631
9632 // Check too high with dynamic setting.
9633 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
9634 m_errorMonitor->VerifyFound();
9635 EndCommandBuffer();
9636
9637 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9638 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9639 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9640 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009641 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009642}
9643
Karl Schultz6addd812016-02-02 17:17:23 -07009644TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009645 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009646 m_errorMonitor->SetDesiredFailureMsg(
9647 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009648 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009649
9650 ASSERT_NO_FATAL_FAILURE(InitState());
9651 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009652
Tony Barbourfe3351b2015-07-28 10:17:20 -06009653 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009654 // Don't care about RenderPass handle b/c error should be flagged before
9655 // that
9656 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
9657 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009658
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009659 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009660}
9661
Karl Schultz6addd812016-02-02 17:17:23 -07009662TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009663 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009664 m_errorMonitor->SetDesiredFailureMsg(
9665 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009666 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009667
9668 ASSERT_NO_FATAL_FAILURE(InitState());
9669 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009670
Tony Barbourfe3351b2015-07-28 10:17:20 -06009671 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009672 // Just create a dummy Renderpass that's non-NULL so we can get to the
9673 // proper error
Chris Forbes38ae7c42016-06-21 20:51:44 +12009674 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
Karl Schultz6addd812016-02-02 17:17:23 -07009675 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009676
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009677 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009678}
9679
Chris Forbes2eeabe32016-06-21 20:52:34 +12009680TEST_F(VkLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
9681 m_errorMonitor->ExpectSuccess();
9682
9683 ASSERT_NO_FATAL_FAILURE(InitState());
9684 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9685
9686 BeginCommandBuffer(); // framework implicitly begins the renderpass.
9687 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // end implicit.
9688
9689 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9690 VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9691 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9692 m_errorMonitor->VerifyNotFound();
9693 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9694 VK_SUBPASS_CONTENTS_INLINE);
9695 m_errorMonitor->VerifyNotFound();
9696 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9697 m_errorMonitor->VerifyNotFound();
9698
9699 m_commandBuffer->EndCommandBuffer();
9700 m_errorMonitor->VerifyNotFound();
9701}
9702
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009703TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
9704 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
9705 "the number of renderPass attachments that use loadOp"
9706 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
9707
9708 ASSERT_NO_FATAL_FAILURE(InitState());
9709 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9710
9711 // Create a renderPass with a single attachment that uses loadOp CLEAR
9712 VkAttachmentReference attach = {};
9713 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9714 VkSubpassDescription subpass = {};
9715 subpass.inputAttachmentCount = 1;
9716 subpass.pInputAttachments = &attach;
9717 VkRenderPassCreateInfo rpci = {};
9718 rpci.subpassCount = 1;
9719 rpci.pSubpasses = &subpass;
9720 rpci.attachmentCount = 1;
9721 VkAttachmentDescription attach_desc = {};
9722 attach_desc.format = VK_FORMAT_UNDEFINED;
9723 // Set loadOp to CLEAR
9724 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9725 rpci.pAttachments = &attach_desc;
9726 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9727 VkRenderPass rp;
9728 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9729
9730 VkCommandBufferInheritanceInfo hinfo = {};
9731 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9732 hinfo.renderPass = VK_NULL_HANDLE;
9733 hinfo.subpass = 0;
9734 hinfo.framebuffer = VK_NULL_HANDLE;
9735 hinfo.occlusionQueryEnable = VK_FALSE;
9736 hinfo.queryFlags = 0;
9737 hinfo.pipelineStatistics = 0;
9738 VkCommandBufferBeginInfo info = {};
9739 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9740 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9741 info.pInheritanceInfo = &hinfo;
9742
9743 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9744 VkRenderPassBeginInfo rp_begin = {};
9745 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9746 rp_begin.pNext = NULL;
9747 rp_begin.renderPass = renderPass();
9748 rp_begin.framebuffer = framebuffer();
9749 rp_begin.clearValueCount = 0; // Should be 1
9750
9751 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7f0416c2016-07-15 16:01:13 -06009752 " has a clearValueCount of 0 but "
9753 "there must be at least 1 entries in "
9754 "pClearValues array to account for ");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009755
9756 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
9757 VK_SUBPASS_CONTENTS_INLINE);
9758
9759 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06009760
9761 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009762}
9763
Cody Northrop3bb4d962016-05-09 16:15:57 -06009764TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
9765
9766 TEST_DESCRIPTION("End a command buffer with an active render pass");
9767
9768 m_errorMonitor->SetDesiredFailureMsg(
9769 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9770 "It is invalid to issue this call inside an active render pass");
9771
9772 ASSERT_NO_FATAL_FAILURE(InitState());
9773 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9774
9775 // The framework's BeginCommandBuffer calls CreateRenderPass
9776 BeginCommandBuffer();
9777
9778 // Call directly into vkEndCommandBuffer instead of the
9779 // the framework's EndCommandBuffer, which inserts a
9780 // vkEndRenderPass
9781 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
9782
9783 m_errorMonitor->VerifyFound();
9784
9785 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
9786 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
9787}
9788
Karl Schultz6addd812016-02-02 17:17:23 -07009789TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009790 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009791 m_errorMonitor->SetDesiredFailureMsg(
9792 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009793 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009794
9795 ASSERT_NO_FATAL_FAILURE(InitState());
9796 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009797
9798 // Renderpass is started here
9799 BeginCommandBuffer();
9800
9801 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009802 vk_testing::Buffer dstBuffer;
9803 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009804
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009805 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009806
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009807 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009808}
9809
Karl Schultz6addd812016-02-02 17:17:23 -07009810TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009811 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009812 m_errorMonitor->SetDesiredFailureMsg(
9813 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009814 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009815
9816 ASSERT_NO_FATAL_FAILURE(InitState());
9817 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009818
9819 // Renderpass is started here
9820 BeginCommandBuffer();
9821
9822 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009823 vk_testing::Buffer dstBuffer;
9824 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009825
Karl Schultz6addd812016-02-02 17:17:23 -07009826 VkDeviceSize dstOffset = 0;
9827 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -06009828 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009829
Karl Schultz6addd812016-02-02 17:17:23 -07009830 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
9831 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009832
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009833 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009834}
9835
Karl Schultz6addd812016-02-02 17:17:23 -07009836TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009837 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009838 m_errorMonitor->SetDesiredFailureMsg(
9839 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009840 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009841
9842 ASSERT_NO_FATAL_FAILURE(InitState());
9843 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009844
9845 // Renderpass is started here
9846 BeginCommandBuffer();
9847
Michael Lentine0a369f62016-02-03 16:51:46 -06009848 VkClearColorValue clear_color;
9849 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07009850 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9851 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9852 const int32_t tex_width = 32;
9853 const int32_t tex_height = 32;
9854 VkImageCreateInfo image_create_info = {};
9855 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9856 image_create_info.pNext = NULL;
9857 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9858 image_create_info.format = tex_format;
9859 image_create_info.extent.width = tex_width;
9860 image_create_info.extent.height = tex_height;
9861 image_create_info.extent.depth = 1;
9862 image_create_info.mipLevels = 1;
9863 image_create_info.arrayLayers = 1;
9864 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9865 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9866 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009867
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009868 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07009869 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
9870 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009871
Karl Schultz6addd812016-02-02 17:17:23 -07009872 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
9873 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009874
Karl Schultz6addd812016-02-02 17:17:23 -07009875 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
9876 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009877
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009878 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009879}
9880
Karl Schultz6addd812016-02-02 17:17:23 -07009881TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009882 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009883 m_errorMonitor->SetDesiredFailureMsg(
9884 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009885 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009886
9887 ASSERT_NO_FATAL_FAILURE(InitState());
9888 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009889
9890 // Renderpass is started here
9891 BeginCommandBuffer();
9892
9893 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07009894 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009895 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
9896 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9897 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
9898 image_create_info.extent.width = 64;
9899 image_create_info.extent.height = 64;
9900 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9901 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009902
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009903 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07009904 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
9905 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009906
Karl Schultz6addd812016-02-02 17:17:23 -07009907 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
9908 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009909
Karl Schultz6addd812016-02-02 17:17:23 -07009910 vkCmdClearDepthStencilImage(
9911 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
9912 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
9913 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009914
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009915 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009916}
9917
Karl Schultz6addd812016-02-02 17:17:23 -07009918TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009919 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009920 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009921
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009922 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -06009923 "vkCmdClearAttachments(): This call "
Karl Schultz6addd812016-02-02 17:17:23 -07009924 "must be issued inside an active "
9925 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009926
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009927 ASSERT_NO_FATAL_FAILURE(InitState());
9928 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009929
9930 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009931 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009932 ASSERT_VK_SUCCESS(err);
9933
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009934 VkClearAttachment color_attachment;
9935 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9936 color_attachment.clearValue.color.float32[0] = 0;
9937 color_attachment.clearValue.color.float32[1] = 0;
9938 color_attachment.clearValue.color.float32[2] = 0;
9939 color_attachment.clearValue.color.float32[3] = 0;
9940 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009941 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
9942 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
9943 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009944
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009945 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009946}
9947
Karl Schultz9e66a292016-04-21 15:57:51 -06009948TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9949 // Try to add a buffer memory barrier with no buffer.
9950 m_errorMonitor->SetDesiredFailureMsg(
9951 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9952 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
9953
9954 ASSERT_NO_FATAL_FAILURE(InitState());
9955 BeginCommandBuffer();
9956
9957 VkBufferMemoryBarrier buf_barrier = {};
9958 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9959 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9960 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9961 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9962 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9963 buf_barrier.buffer = VK_NULL_HANDLE;
9964 buf_barrier.offset = 0;
9965 buf_barrier.size = VK_WHOLE_SIZE;
9966 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9967 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
9968 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
9969
9970 m_errorMonitor->VerifyFound();
9971}
9972
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009973TEST_F(VkLayerTest, InvalidBarriers) {
9974 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9975
9976 m_errorMonitor->SetDesiredFailureMsg(
9977 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
9978
9979 ASSERT_NO_FATAL_FAILURE(InitState());
9980 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9981
9982 VkMemoryBarrier mem_barrier = {};
9983 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9984 mem_barrier.pNext = NULL;
9985 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9986 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9987 BeginCommandBuffer();
9988 // BeginCommandBuffer() starts a render pass
9989 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9990 VK_PIPELINE_STAGE_HOST_BIT,
9991 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
9992 &mem_barrier, 0, nullptr, 0, nullptr);
9993 m_errorMonitor->VerifyFound();
9994
9995 m_errorMonitor->SetDesiredFailureMsg(
9996 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9997 "Image Layout cannot be transitioned to UNDEFINED");
9998 VkImageObj image(m_device);
9999 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
10000 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10001 ASSERT_TRUE(image.initialized());
10002 VkImageMemoryBarrier img_barrier = {};
10003 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10004 img_barrier.pNext = NULL;
10005 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10006 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10007 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10008 // New layout can't be UNDEFINED
10009 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
10010 img_barrier.image = image.handle();
10011 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10012 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10013 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10014 img_barrier.subresourceRange.baseArrayLayer = 0;
10015 img_barrier.subresourceRange.baseMipLevel = 0;
10016 img_barrier.subresourceRange.layerCount = 1;
10017 img_barrier.subresourceRange.levelCount = 1;
10018 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10019 VK_PIPELINE_STAGE_HOST_BIT,
10020 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10021 nullptr, 1, &img_barrier);
10022 m_errorMonitor->VerifyFound();
10023 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10024
10025 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10026 "Subresource must have the sum of the "
10027 "baseArrayLayer");
10028 // baseArrayLayer + layerCount must be <= image's arrayLayers
10029 img_barrier.subresourceRange.baseArrayLayer = 1;
10030 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10031 VK_PIPELINE_STAGE_HOST_BIT,
10032 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10033 nullptr, 1, &img_barrier);
10034 m_errorMonitor->VerifyFound();
10035 img_barrier.subresourceRange.baseArrayLayer = 0;
10036
10037 m_errorMonitor->SetDesiredFailureMsg(
10038 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10039 "Subresource must have the sum of the baseMipLevel");
10040 // baseMipLevel + levelCount must be <= image's mipLevels
10041 img_barrier.subresourceRange.baseMipLevel = 1;
10042 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10043 VK_PIPELINE_STAGE_HOST_BIT,
10044 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10045 nullptr, 1, &img_barrier);
10046 m_errorMonitor->VerifyFound();
10047 img_barrier.subresourceRange.baseMipLevel = 0;
10048
10049 m_errorMonitor->SetDesiredFailureMsg(
10050 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10051 "Buffer Barriers cannot be used during a render pass");
10052 vk_testing::Buffer buffer;
10053 buffer.init(*m_device, 256);
10054 VkBufferMemoryBarrier buf_barrier = {};
10055 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
10056 buf_barrier.pNext = NULL;
10057 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10058 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10059 buf_barrier.buffer = buffer.handle();
10060 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10061 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10062 buf_barrier.offset = 0;
10063 buf_barrier.size = VK_WHOLE_SIZE;
10064 // Can't send buffer barrier during a render pass
10065 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10066 VK_PIPELINE_STAGE_HOST_BIT,
10067 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10068 &buf_barrier, 0, nullptr);
10069 m_errorMonitor->VerifyFound();
10070 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
10071
10072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10073 "which is not less than total size");
10074 buf_barrier.offset = 257;
10075 // Offset greater than total size
10076 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10077 VK_PIPELINE_STAGE_HOST_BIT,
10078 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10079 &buf_barrier, 0, nullptr);
10080 m_errorMonitor->VerifyFound();
10081 buf_barrier.offset = 0;
10082
10083 m_errorMonitor->SetDesiredFailureMsg(
10084 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
10085 buf_barrier.size = 257;
10086 // Size greater than total size
10087 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10088 VK_PIPELINE_STAGE_HOST_BIT,
10089 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10090 &buf_barrier, 0, nullptr);
10091 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010092
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010093 // Now exercise barrier aspect bit errors, first DS
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010094 m_errorMonitor->SetDesiredFailureMsg(
10095 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10096 "Image is a depth and stencil format and thus must "
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010097 "have either one or both of VK_IMAGE_ASPECT_DEPTH_BIT and "
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010098 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
10099 VkDepthStencilObj ds_image(m_device);
10100 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
10101 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010102 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10103 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010104 img_barrier.image = ds_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010105 // Use of COLOR aspect on DS image is error
10106 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010107 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10108 VK_PIPELINE_STAGE_HOST_BIT,
10109 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10110 nullptr, 1, &img_barrier);
10111 m_errorMonitor->VerifyFound();
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010112 // Now test depth-only
10113 VkFormatProperties format_props;
10114
10115 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(),
10116 VK_FORMAT_D16_UNORM, &format_props);
10117 if (format_props.optimalTilingFeatures &
10118 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
10119 m_errorMonitor->SetDesiredFailureMsg(
10120 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10121 "Image is a depth-only format and thus must "
10122 "have VK_IMAGE_ASPECT_DEPTH_BIT set.");
10123 VkDepthStencilObj d_image(m_device);
10124 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
10125 ASSERT_TRUE(d_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010126 img_barrier.oldLayout =
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010127 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -060010128 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010129 img_barrier.image = d_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010130 // Use of COLOR aspect on depth image is error
10131 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010132 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10133 VK_PIPELINE_STAGE_HOST_BIT,
10134 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
10135 0, nullptr, 1, &img_barrier);
10136 m_errorMonitor->VerifyFound();
10137 }
10138 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(),
10139 VK_FORMAT_S8_UINT, &format_props);
10140 if (format_props.optimalTilingFeatures &
10141 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
10142 // Now test stencil-only
10143 m_errorMonitor->SetDesiredFailureMsg(
10144 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10145 "Image is a stencil-only format and thus must "
10146 "have VK_IMAGE_ASPECT_STENCIL_BIT set.");
10147 VkDepthStencilObj s_image(m_device);
10148 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
10149 ASSERT_TRUE(s_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010150 img_barrier.oldLayout =
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010151 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -060010152 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010153 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010154 // Use of COLOR aspect on depth image is error
10155 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010156 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10157 VK_PIPELINE_STAGE_HOST_BIT,
10158 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
10159 0, nullptr, 1, &img_barrier);
10160 m_errorMonitor->VerifyFound();
10161 }
10162 // Finally test color
10163 m_errorMonitor->SetDesiredFailureMsg(
10164 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image is a color format and thus must "
10165 "have VK_IMAGE_ASPECT_COLOR_BIT set.");
10166 VkImageObj c_image(m_device);
10167 c_image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
10168 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10169 0);
10170 ASSERT_TRUE(c_image.initialized());
10171 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10172 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
10173 img_barrier.image = c_image.handle();
10174 // Set aspect to depth (non-color)
10175 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
10176 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10177 VK_PIPELINE_STAGE_HOST_BIT,
10178 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10179 nullptr, 1, &img_barrier);
10180 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010181}
10182
Karl Schultz6addd812016-02-02 17:17:23 -070010183TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010184 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010185 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010186
Karl Schultz6addd812016-02-02 17:17:23 -070010187 m_errorMonitor->SetDesiredFailureMsg(
10188 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010189 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
10190
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010191 ASSERT_NO_FATAL_FAILURE(InitState());
10192 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010193 uint32_t qfi = 0;
10194 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010195 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10196 buffCI.size = 1024;
10197 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10198 buffCI.queueFamilyIndexCount = 1;
10199 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010200
10201 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010202 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010203 ASSERT_VK_SUCCESS(err);
10204
10205 BeginCommandBuffer();
10206 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -070010207 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10208 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010209 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -070010210 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
10211 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010212
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010213 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010214
Chia-I Wuf7458c52015-10-26 21:10:41 +080010215 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010216}
10217
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010218TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
10219 // Create an out-of-range queueFamilyIndex
10220 m_errorMonitor->SetDesiredFailureMsg(
10221 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -060010222 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
10223 "of the indices specified when the device was created, via the "
10224 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010225
10226 ASSERT_NO_FATAL_FAILURE(InitState());
10227 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10228 VkBufferCreateInfo buffCI = {};
10229 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10230 buffCI.size = 1024;
10231 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10232 buffCI.queueFamilyIndexCount = 1;
10233 // Introduce failure by specifying invalid queue_family_index
10234 uint32_t qfi = 777;
10235 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -060010236 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010237
10238 VkBuffer ib;
10239 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
10240
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010241 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060010242 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010243}
10244
Karl Schultz6addd812016-02-02 17:17:23 -070010245TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010246 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands w/ a primary cmd buffer"
10247 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010248
Karl Schultz6addd812016-02-02 17:17:23 -070010249 m_errorMonitor->SetDesiredFailureMsg(
10250 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010251 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010252
10253 ASSERT_NO_FATAL_FAILURE(InitState());
10254 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010255
10256 BeginCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010257
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010258 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
10259 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010260
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010261 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010262}
10263
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010264TEST_F(VkLayerTest, DSUsageBitsErrors) {
10265 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
10266 "that do not have correct usage bits sets.");
10267 VkResult err;
10268
10269 ASSERT_NO_FATAL_FAILURE(InitState());
10270 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10271 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10272 ds_type_count[i].type = VkDescriptorType(i);
10273 ds_type_count[i].descriptorCount = 1;
10274 }
10275 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10276 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10277 ds_pool_ci.pNext = NULL;
10278 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10279 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10280 ds_pool_ci.pPoolSizes = ds_type_count;
10281
10282 VkDescriptorPool ds_pool;
10283 err =
10284 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10285 ASSERT_VK_SUCCESS(err);
10286
10287 // Create 10 layouts where each has a single descriptor of different type
10288 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] =
10289 {};
10290 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10291 dsl_binding[i].binding = 0;
10292 dsl_binding[i].descriptorType = VkDescriptorType(i);
10293 dsl_binding[i].descriptorCount = 1;
10294 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
10295 dsl_binding[i].pImmutableSamplers = NULL;
10296 }
10297
10298 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10299 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10300 ds_layout_ci.pNext = NULL;
10301 ds_layout_ci.bindingCount = 1;
10302 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
10303 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10304 ds_layout_ci.pBindings = dsl_binding + i;
10305 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
10306 NULL, ds_layouts + i);
10307 ASSERT_VK_SUCCESS(err);
10308 }
10309 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10310 VkDescriptorSetAllocateInfo alloc_info = {};
10311 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10312 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10313 alloc_info.descriptorPool = ds_pool;
10314 alloc_info.pSetLayouts = ds_layouts;
10315 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10316 descriptor_sets);
10317 ASSERT_VK_SUCCESS(err);
10318
10319 // Create a buffer & bufferView to be used for invalid updates
10320 VkBufferCreateInfo buff_ci = {};
10321 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10322 // This usage is not valid for any descriptor type
10323 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
10324 buff_ci.size = 256;
10325 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10326 VkBuffer buffer;
10327 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10328 ASSERT_VK_SUCCESS(err);
10329
10330 VkBufferViewCreateInfo buff_view_ci = {};
10331 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
10332 buff_view_ci.buffer = buffer;
10333 buff_view_ci.format = VK_FORMAT_R8_UNORM;
10334 buff_view_ci.range = VK_WHOLE_SIZE;
10335 VkBufferView buff_view;
10336 err =
10337 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
10338 ASSERT_VK_SUCCESS(err);
10339
10340 // Create an image to be used for invalid updates
10341 VkImageCreateInfo image_ci = {};
10342 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10343 image_ci.imageType = VK_IMAGE_TYPE_2D;
10344 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
10345 image_ci.extent.width = 64;
10346 image_ci.extent.height = 64;
10347 image_ci.extent.depth = 1;
10348 image_ci.mipLevels = 1;
10349 image_ci.arrayLayers = 1;
10350 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
10351 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10352 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10353 // This usage is not valid for any descriptor type
10354 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10355 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10356 VkImage image;
10357 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10358 ASSERT_VK_SUCCESS(err);
10359 // Bind memory to image
10360 VkMemoryRequirements mem_reqs;
10361 VkDeviceMemory image_mem;
10362 bool pass;
10363 VkMemoryAllocateInfo mem_alloc = {};
10364 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10365 mem_alloc.pNext = NULL;
10366 mem_alloc.allocationSize = 0;
10367 mem_alloc.memoryTypeIndex = 0;
10368 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10369 mem_alloc.allocationSize = mem_reqs.size;
10370 pass =
10371 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10372 ASSERT_TRUE(pass);
10373 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10374 ASSERT_VK_SUCCESS(err);
10375 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10376 ASSERT_VK_SUCCESS(err);
10377 // Now create view for image
10378 VkImageViewCreateInfo image_view_ci = {};
10379 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10380 image_view_ci.image = image;
10381 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
10382 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10383 image_view_ci.subresourceRange.layerCount = 1;
10384 image_view_ci.subresourceRange.baseArrayLayer = 0;
10385 image_view_ci.subresourceRange.levelCount = 1;
10386 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10387 VkImageView image_view;
10388 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10389 &image_view);
10390 ASSERT_VK_SUCCESS(err);
10391
10392 VkDescriptorBufferInfo buff_info = {};
10393 buff_info.buffer = buffer;
10394 VkDescriptorImageInfo img_info = {};
10395 img_info.imageView = image_view;
10396 VkWriteDescriptorSet descriptor_write = {};
10397 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10398 descriptor_write.dstBinding = 0;
10399 descriptor_write.descriptorCount = 1;
10400 descriptor_write.pTexelBufferView = &buff_view;
10401 descriptor_write.pBufferInfo = &buff_info;
10402 descriptor_write.pImageInfo = &img_info;
10403
10404 // These error messages align with VkDescriptorType struct
10405 const char *error_msgs[] = {
10406 "", // placeholder, no error for SAMPLER descriptor
10407 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
10408 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
10409 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
10410 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
10411 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
10412 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
10413 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
10414 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
10415 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
10416 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
10417 // Start loop at 1 as SAMPLER desc type has no usage bit error
10418 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10419 descriptor_write.descriptorType = VkDescriptorType(i);
10420 descriptor_write.dstSet = descriptor_sets[i];
10421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10422 error_msgs[i]);
10423
10424 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
10425 NULL);
10426
10427 m_errorMonitor->VerifyFound();
10428 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
10429 }
10430 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
10431 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010432 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010433 vkDestroyImageView(m_device->device(), image_view, NULL);
10434 vkDestroyBuffer(m_device->device(), buffer, NULL);
10435 vkDestroyBufferView(m_device->device(), buff_view, NULL);
10436 vkFreeDescriptorSets(m_device->device(), ds_pool,
10437 VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
10438 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10439}
10440
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010441TEST_F(VkLayerTest, DSBufferInfoErrors) {
10442 TEST_DESCRIPTION(
10443 "Attempt to update buffer descriptor set that has incorrect "
10444 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
10445 "1. offset value greater than buffer size\n"
10446 "2. range value of 0\n"
10447 "3. range value greater than buffer (size - offset)");
10448 VkResult err;
10449
10450 ASSERT_NO_FATAL_FAILURE(InitState());
10451 VkDescriptorPoolSize ds_type_count = {};
10452 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10453 ds_type_count.descriptorCount = 1;
10454
10455 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10456 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10457 ds_pool_ci.pNext = NULL;
10458 ds_pool_ci.maxSets = 1;
10459 ds_pool_ci.poolSizeCount = 1;
10460 ds_pool_ci.pPoolSizes = &ds_type_count;
10461
10462 VkDescriptorPool ds_pool;
10463 err =
10464 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10465 ASSERT_VK_SUCCESS(err);
10466
10467 // Create layout with single uniform buffer descriptor
10468 VkDescriptorSetLayoutBinding dsl_binding = {};
10469 dsl_binding.binding = 0;
10470 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10471 dsl_binding.descriptorCount = 1;
10472 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10473 dsl_binding.pImmutableSamplers = NULL;
10474
10475 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10476 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10477 ds_layout_ci.pNext = NULL;
10478 ds_layout_ci.bindingCount = 1;
10479 ds_layout_ci.pBindings = &dsl_binding;
10480 VkDescriptorSetLayout ds_layout;
10481 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10482 &ds_layout);
10483 ASSERT_VK_SUCCESS(err);
10484
10485 VkDescriptorSet descriptor_set = {};
10486 VkDescriptorSetAllocateInfo alloc_info = {};
10487 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10488 alloc_info.descriptorSetCount = 1;
10489 alloc_info.descriptorPool = ds_pool;
10490 alloc_info.pSetLayouts = &ds_layout;
10491 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10492 &descriptor_set);
10493 ASSERT_VK_SUCCESS(err);
10494
10495 // Create a buffer to be used for invalid updates
10496 VkBufferCreateInfo buff_ci = {};
10497 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10498 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10499 buff_ci.size = 256;
10500 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10501 VkBuffer buffer;
10502 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10503 ASSERT_VK_SUCCESS(err);
10504 // Have to bind memory to buffer before descriptor update
10505 VkMemoryAllocateInfo mem_alloc = {};
10506 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10507 mem_alloc.pNext = NULL;
10508 mem_alloc.allocationSize = 256;
10509 mem_alloc.memoryTypeIndex = 0;
10510
10511 VkMemoryRequirements mem_reqs;
10512 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
10513 bool pass =
10514 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10515 if (!pass) {
10516 vkDestroyBuffer(m_device->device(), buffer, NULL);
10517 return;
10518 }
10519
10520 VkDeviceMemory mem;
10521 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
10522 ASSERT_VK_SUCCESS(err);
10523 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10524 ASSERT_VK_SUCCESS(err);
10525
10526 VkDescriptorBufferInfo buff_info = {};
10527 buff_info.buffer = buffer;
10528 // First make offset 1 larger than buffer size
10529 buff_info.offset = 257;
10530 buff_info.range = VK_WHOLE_SIZE;
10531 VkWriteDescriptorSet descriptor_write = {};
10532 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10533 descriptor_write.dstBinding = 0;
10534 descriptor_write.descriptorCount = 1;
10535 descriptor_write.pTexelBufferView = nullptr;
10536 descriptor_write.pBufferInfo = &buff_info;
10537 descriptor_write.pImageInfo = nullptr;
10538
10539 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10540 descriptor_write.dstSet = descriptor_set;
10541 m_errorMonitor->SetDesiredFailureMsg(
10542 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10543 " offset of 257 is greater than buffer ");
10544
10545 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10546
10547 m_errorMonitor->VerifyFound();
10548 // Now cause error due to range of 0
10549 buff_info.offset = 0;
10550 buff_info.range = 0;
10551 m_errorMonitor->SetDesiredFailureMsg(
10552 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10553 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
10554
10555 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10556
10557 m_errorMonitor->VerifyFound();
10558 // Now cause error due to range exceeding buffer size - offset
10559 buff_info.offset = 128;
10560 buff_info.range = 200;
10561 m_errorMonitor->SetDesiredFailureMsg(
10562 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10563 " range is 200 which is greater than buffer size ");
10564
10565 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10566
10567 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010568 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010569 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10570 vkDestroyBuffer(m_device->device(), buffer, NULL);
10571 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10572 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10573}
10574
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010575TEST_F(VkLayerTest, DSAspectBitsErrors) {
10576 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10577 // are set, but could expand this test to hit more cases.
10578 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
10579 "that do not have correct aspect bits sets.");
10580 VkResult err;
10581
10582 ASSERT_NO_FATAL_FAILURE(InitState());
10583 VkDescriptorPoolSize ds_type_count = {};
10584 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10585 ds_type_count.descriptorCount = 1;
10586
10587 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10588 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10589 ds_pool_ci.pNext = NULL;
10590 ds_pool_ci.maxSets = 5;
10591 ds_pool_ci.poolSizeCount = 1;
10592 ds_pool_ci.pPoolSizes = &ds_type_count;
10593
10594 VkDescriptorPool ds_pool;
10595 err =
10596 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10597 ASSERT_VK_SUCCESS(err);
10598
10599 VkDescriptorSetLayoutBinding dsl_binding = {};
10600 dsl_binding.binding = 0;
10601 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10602 dsl_binding.descriptorCount = 1;
10603 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10604 dsl_binding.pImmutableSamplers = NULL;
10605
10606 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10607 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10608 ds_layout_ci.pNext = NULL;
10609 ds_layout_ci.bindingCount = 1;
10610 ds_layout_ci.pBindings = &dsl_binding;
10611 VkDescriptorSetLayout ds_layout;
10612 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10613 &ds_layout);
10614 ASSERT_VK_SUCCESS(err);
10615
10616 VkDescriptorSet descriptor_set = {};
10617 VkDescriptorSetAllocateInfo alloc_info = {};
10618 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10619 alloc_info.descriptorSetCount = 1;
10620 alloc_info.descriptorPool = ds_pool;
10621 alloc_info.pSetLayouts = &ds_layout;
10622 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10623 &descriptor_set);
10624 ASSERT_VK_SUCCESS(err);
10625
10626 // Create an image to be used for invalid updates
10627 VkImageCreateInfo image_ci = {};
10628 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10629 image_ci.imageType = VK_IMAGE_TYPE_2D;
10630 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10631 image_ci.extent.width = 64;
10632 image_ci.extent.height = 64;
10633 image_ci.extent.depth = 1;
10634 image_ci.mipLevels = 1;
10635 image_ci.arrayLayers = 1;
10636 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
10637 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10638 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10639 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10640 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10641 VkImage image;
10642 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10643 ASSERT_VK_SUCCESS(err);
10644 // Bind memory to image
10645 VkMemoryRequirements mem_reqs;
10646 VkDeviceMemory image_mem;
10647 bool pass;
10648 VkMemoryAllocateInfo mem_alloc = {};
10649 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10650 mem_alloc.pNext = NULL;
10651 mem_alloc.allocationSize = 0;
10652 mem_alloc.memoryTypeIndex = 0;
10653 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10654 mem_alloc.allocationSize = mem_reqs.size;
10655 pass =
10656 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10657 ASSERT_TRUE(pass);
10658 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10659 ASSERT_VK_SUCCESS(err);
10660 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10661 ASSERT_VK_SUCCESS(err);
10662 // Now create view for image
10663 VkImageViewCreateInfo image_view_ci = {};
10664 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10665 image_view_ci.image = image;
10666 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10667 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10668 image_view_ci.subresourceRange.layerCount = 1;
10669 image_view_ci.subresourceRange.baseArrayLayer = 0;
10670 image_view_ci.subresourceRange.levelCount = 1;
10671 // Setting both depth & stencil aspect bits is illegal for descriptor
10672 image_view_ci.subresourceRange.aspectMask =
10673 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
10674
10675 VkImageView image_view;
10676 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10677 &image_view);
10678 ASSERT_VK_SUCCESS(err);
10679
10680 VkDescriptorImageInfo img_info = {};
10681 img_info.imageView = image_view;
10682 VkWriteDescriptorSet descriptor_write = {};
10683 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10684 descriptor_write.dstBinding = 0;
10685 descriptor_write.descriptorCount = 1;
10686 descriptor_write.pTexelBufferView = NULL;
10687 descriptor_write.pBufferInfo = NULL;
10688 descriptor_write.pImageInfo = &img_info;
10689 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10690 descriptor_write.dstSet = descriptor_set;
10691 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10692 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
10693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10694 error_msg);
10695
10696 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10697
10698 m_errorMonitor->VerifyFound();
10699 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10700 vkDestroyImage(m_device->device(), image, NULL);
10701 vkFreeMemory(m_device->device(), image_mem, NULL);
10702 vkDestroyImageView(m_device->device(), image_view, NULL);
10703 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10704 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10705}
10706
Karl Schultz6addd812016-02-02 17:17:23 -070010707TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010708 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010709 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010710
Karl Schultz6addd812016-02-02 17:17:23 -070010711 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010712 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10713 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10714 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010715
Tobin Ehlis3b780662015-05-28 12:11:26 -060010716 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010717 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010718 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010719 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10720 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010721
10722 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010723 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10724 ds_pool_ci.pNext = NULL;
10725 ds_pool_ci.maxSets = 1;
10726 ds_pool_ci.poolSizeCount = 1;
10727 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010728
Tobin Ehlis3b780662015-05-28 12:11:26 -060010729 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010730 err =
10731 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010732 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010733 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010734 dsl_binding.binding = 0;
10735 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10736 dsl_binding.descriptorCount = 1;
10737 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10738 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010739
Tony Barboureb254902015-07-15 12:50:33 -060010740 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010741 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10742 ds_layout_ci.pNext = NULL;
10743 ds_layout_ci.bindingCount = 1;
10744 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010745
Tobin Ehlis3b780662015-05-28 12:11:26 -060010746 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010747 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10748 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010749 ASSERT_VK_SUCCESS(err);
10750
10751 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010752 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010753 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010754 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010755 alloc_info.descriptorPool = ds_pool;
10756 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010757 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10758 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010759 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010760
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010761 VkSamplerCreateInfo sampler_ci = {};
10762 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10763 sampler_ci.pNext = NULL;
10764 sampler_ci.magFilter = VK_FILTER_NEAREST;
10765 sampler_ci.minFilter = VK_FILTER_NEAREST;
10766 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10767 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10768 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10769 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10770 sampler_ci.mipLodBias = 1.0;
10771 sampler_ci.anisotropyEnable = VK_FALSE;
10772 sampler_ci.maxAnisotropy = 1;
10773 sampler_ci.compareEnable = VK_FALSE;
10774 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10775 sampler_ci.minLod = 1.0;
10776 sampler_ci.maxLod = 1.0;
10777 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10778 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10779 VkSampler sampler;
10780 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10781 ASSERT_VK_SUCCESS(err);
10782
10783 VkDescriptorImageInfo info = {};
10784 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010785
10786 VkWriteDescriptorSet descriptor_write;
10787 memset(&descriptor_write, 0, sizeof(descriptor_write));
10788 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010789 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010790 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010791 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010792 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010793 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010794
10795 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10796
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010797 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010798
Chia-I Wuf7458c52015-10-26 21:10:41 +080010799 vkDestroySampler(m_device->device(), sampler, NULL);
10800 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10801 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010802}
10803
Karl Schultz6addd812016-02-02 17:17:23 -070010804TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010805 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010806 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010807
Karl Schultz6addd812016-02-02 17:17:23 -070010808 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010809 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10810 " binding #0 with 1 total descriptors but update of 1 descriptors "
10811 "starting at binding offset of 0 combined with update array element "
10812 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010813
Tobin Ehlis3b780662015-05-28 12:11:26 -060010814 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010815 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010816 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010817 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10818 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010819
10820 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010821 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10822 ds_pool_ci.pNext = NULL;
10823 ds_pool_ci.maxSets = 1;
10824 ds_pool_ci.poolSizeCount = 1;
10825 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010826
Tobin Ehlis3b780662015-05-28 12:11:26 -060010827 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010828 err =
10829 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010830 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010831
Tony Barboureb254902015-07-15 12:50:33 -060010832 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010833 dsl_binding.binding = 0;
10834 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10835 dsl_binding.descriptorCount = 1;
10836 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10837 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010838
10839 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010840 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10841 ds_layout_ci.pNext = NULL;
10842 ds_layout_ci.bindingCount = 1;
10843 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010844
Tobin Ehlis3b780662015-05-28 12:11:26 -060010845 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010846 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10847 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010848 ASSERT_VK_SUCCESS(err);
10849
10850 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010851 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010852 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010853 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010854 alloc_info.descriptorPool = ds_pool;
10855 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010856 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10857 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010858 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010859
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010860 // Correctly update descriptor to avoid "NOT_UPDATED" error
10861 VkDescriptorBufferInfo buff_info = {};
10862 buff_info.buffer =
10863 VkBuffer(0); // Don't care about buffer handle for this test
10864 buff_info.offset = 0;
10865 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010866
10867 VkWriteDescriptorSet descriptor_write;
10868 memset(&descriptor_write, 0, sizeof(descriptor_write));
10869 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010870 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010871 descriptor_write.dstArrayElement =
10872 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010873 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010874 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10875 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010876
10877 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10878
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010879 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010880
Chia-I Wuf7458c52015-10-26 21:10:41 +080010881 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10882 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010883}
10884
Karl Schultz6addd812016-02-02 17:17:23 -070010885TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
10886 // Create layout w/ count of 1 and attempt update to that layout w/ binding
10887 // index 2
10888 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010889
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010890 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10891 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010892
Tobin Ehlis3b780662015-05-28 12:11:26 -060010893 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010894 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010895 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010896 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10897 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010898
10899 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010900 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10901 ds_pool_ci.pNext = NULL;
10902 ds_pool_ci.maxSets = 1;
10903 ds_pool_ci.poolSizeCount = 1;
10904 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010905
Tobin Ehlis3b780662015-05-28 12:11:26 -060010906 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010907 err =
10908 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010909 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010910
Tony Barboureb254902015-07-15 12:50:33 -060010911 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010912 dsl_binding.binding = 0;
10913 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10914 dsl_binding.descriptorCount = 1;
10915 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10916 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010917
10918 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010919 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10920 ds_layout_ci.pNext = NULL;
10921 ds_layout_ci.bindingCount = 1;
10922 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010923 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010924 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10925 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010926 ASSERT_VK_SUCCESS(err);
10927
10928 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010929 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010930 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010931 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010932 alloc_info.descriptorPool = ds_pool;
10933 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010934 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10935 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010936 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010937
Tony Barboureb254902015-07-15 12:50:33 -060010938 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010939 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10940 sampler_ci.pNext = NULL;
10941 sampler_ci.magFilter = VK_FILTER_NEAREST;
10942 sampler_ci.minFilter = VK_FILTER_NEAREST;
10943 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10944 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10945 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10946 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10947 sampler_ci.mipLodBias = 1.0;
10948 sampler_ci.anisotropyEnable = VK_FALSE;
10949 sampler_ci.maxAnisotropy = 1;
10950 sampler_ci.compareEnable = VK_FALSE;
10951 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10952 sampler_ci.minLod = 1.0;
10953 sampler_ci.maxLod = 1.0;
10954 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10955 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010956
Tobin Ehlis3b780662015-05-28 12:11:26 -060010957 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010958 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010959 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010960
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010961 VkDescriptorImageInfo info = {};
10962 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010963
10964 VkWriteDescriptorSet descriptor_write;
10965 memset(&descriptor_write, 0, sizeof(descriptor_write));
10966 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010967 descriptor_write.dstSet = descriptorSet;
10968 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010969 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010970 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010971 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010972 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010973
10974 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10975
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010976 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010977
Chia-I Wuf7458c52015-10-26 21:10:41 +080010978 vkDestroySampler(m_device->device(), sampler, NULL);
10979 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10980 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010981}
10982
Karl Schultz6addd812016-02-02 17:17:23 -070010983TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10984 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10985 // types
10986 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010987
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010988 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis660bcdc2016-05-17 10:39:46 -060010989 ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010990
Tobin Ehlis3b780662015-05-28 12:11:26 -060010991 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010992
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010993 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010994 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10995 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010996
10997 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010998 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10999 ds_pool_ci.pNext = NULL;
11000 ds_pool_ci.maxSets = 1;
11001 ds_pool_ci.poolSizeCount = 1;
11002 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011003
Tobin Ehlis3b780662015-05-28 12:11:26 -060011004 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011005 err =
11006 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011007 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060011008 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011009 dsl_binding.binding = 0;
11010 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11011 dsl_binding.descriptorCount = 1;
11012 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11013 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011014
Tony Barboureb254902015-07-15 12:50:33 -060011015 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011016 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11017 ds_layout_ci.pNext = NULL;
11018 ds_layout_ci.bindingCount = 1;
11019 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011020
Tobin Ehlis3b780662015-05-28 12:11:26 -060011021 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011022 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11023 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011024 ASSERT_VK_SUCCESS(err);
11025
11026 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011027 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011028 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011029 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011030 alloc_info.descriptorPool = ds_pool;
11031 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011032 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11033 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011034 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011035
Tony Barboureb254902015-07-15 12:50:33 -060011036 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011037 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11038 sampler_ci.pNext = NULL;
11039 sampler_ci.magFilter = VK_FILTER_NEAREST;
11040 sampler_ci.minFilter = VK_FILTER_NEAREST;
11041 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11042 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11043 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11044 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11045 sampler_ci.mipLodBias = 1.0;
11046 sampler_ci.anisotropyEnable = VK_FALSE;
11047 sampler_ci.maxAnisotropy = 1;
11048 sampler_ci.compareEnable = VK_FALSE;
11049 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11050 sampler_ci.minLod = 1.0;
11051 sampler_ci.maxLod = 1.0;
11052 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11053 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011054 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011055 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011056 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011057
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011058 VkDescriptorImageInfo info = {};
11059 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011060
11061 VkWriteDescriptorSet descriptor_write;
11062 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -070011063 descriptor_write.sType =
11064 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011065 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011066 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011067 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011068 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011069 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011070
11071 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11072
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011073 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011074
Chia-I Wuf7458c52015-10-26 21:10:41 +080011075 vkDestroySampler(m_device->device(), sampler, NULL);
11076 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11077 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011078}
11079
Karl Schultz6addd812016-02-02 17:17:23 -070011080TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011081 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070011082 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011083
Karl Schultz6addd812016-02-02 17:17:23 -070011084 m_errorMonitor->SetDesiredFailureMsg(
11085 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011086 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011087
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011088 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011089 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
11090 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011091 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011092 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11093 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011094
11095 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011096 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11097 ds_pool_ci.pNext = NULL;
11098 ds_pool_ci.maxSets = 1;
11099 ds_pool_ci.poolSizeCount = 1;
11100 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011101
11102 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011103 err =
11104 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011105 ASSERT_VK_SUCCESS(err);
11106
11107 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011108 dsl_binding.binding = 0;
11109 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11110 dsl_binding.descriptorCount = 1;
11111 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11112 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011113
11114 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011115 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11116 ds_layout_ci.pNext = NULL;
11117 ds_layout_ci.bindingCount = 1;
11118 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011119 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011120 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11121 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011122 ASSERT_VK_SUCCESS(err);
11123
11124 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011125 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011126 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011127 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011128 alloc_info.descriptorPool = ds_pool;
11129 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011130 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11131 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011132 ASSERT_VK_SUCCESS(err);
11133
Karl Schultz6addd812016-02-02 17:17:23 -070011134 VkSampler sampler =
11135 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011136
11137 VkDescriptorImageInfo descriptor_info;
11138 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11139 descriptor_info.sampler = sampler;
11140
11141 VkWriteDescriptorSet descriptor_write;
11142 memset(&descriptor_write, 0, sizeof(descriptor_write));
11143 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011144 descriptor_write.dstSet = descriptorSet;
11145 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011146 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011147 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11148 descriptor_write.pImageInfo = &descriptor_info;
11149
11150 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11151
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011152 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011153
Chia-I Wuf7458c52015-10-26 21:10:41 +080011154 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11155 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011156}
11157
Karl Schultz6addd812016-02-02 17:17:23 -070011158TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
11159 // Create a single combined Image/Sampler descriptor and send it an invalid
11160 // imageView
11161 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011162
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11164 "Attempted write update to combined "
11165 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -060011166 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011167
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011168 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011169 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011170 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11171 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011172
11173 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011174 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11175 ds_pool_ci.pNext = NULL;
11176 ds_pool_ci.maxSets = 1;
11177 ds_pool_ci.poolSizeCount = 1;
11178 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011179
11180 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011181 err =
11182 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011183 ASSERT_VK_SUCCESS(err);
11184
11185 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011186 dsl_binding.binding = 0;
11187 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11188 dsl_binding.descriptorCount = 1;
11189 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11190 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011191
11192 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011193 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11194 ds_layout_ci.pNext = NULL;
11195 ds_layout_ci.bindingCount = 1;
11196 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011197 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011198 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11199 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011200 ASSERT_VK_SUCCESS(err);
11201
11202 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011203 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011204 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011205 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011206 alloc_info.descriptorPool = ds_pool;
11207 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011208 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11209 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011210 ASSERT_VK_SUCCESS(err);
11211
11212 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011213 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11214 sampler_ci.pNext = NULL;
11215 sampler_ci.magFilter = VK_FILTER_NEAREST;
11216 sampler_ci.minFilter = VK_FILTER_NEAREST;
11217 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11218 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11219 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11220 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11221 sampler_ci.mipLodBias = 1.0;
11222 sampler_ci.anisotropyEnable = VK_FALSE;
11223 sampler_ci.maxAnisotropy = 1;
11224 sampler_ci.compareEnable = VK_FALSE;
11225 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11226 sampler_ci.minLod = 1.0;
11227 sampler_ci.maxLod = 1.0;
11228 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11229 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011230
11231 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011232 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011233 ASSERT_VK_SUCCESS(err);
11234
Karl Schultz6addd812016-02-02 17:17:23 -070011235 VkImageView view =
11236 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011237
11238 VkDescriptorImageInfo descriptor_info;
11239 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11240 descriptor_info.sampler = sampler;
11241 descriptor_info.imageView = view;
11242
11243 VkWriteDescriptorSet descriptor_write;
11244 memset(&descriptor_write, 0, sizeof(descriptor_write));
11245 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011246 descriptor_write.dstSet = descriptorSet;
11247 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011248 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011249 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11250 descriptor_write.pImageInfo = &descriptor_info;
11251
11252 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11253
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011254 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011255
Chia-I Wuf7458c52015-10-26 21:10:41 +080011256 vkDestroySampler(m_device->device(), sampler, NULL);
11257 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11258 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011259}
11260
Karl Schultz6addd812016-02-02 17:17:23 -070011261TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
11262 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
11263 // into the other
11264 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011265
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011266 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11267 " binding #1 with type "
11268 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
11269 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011270
Tobin Ehlis04356f92015-10-27 16:35:27 -060011271 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011272 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011273 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011274 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11275 ds_type_count[0].descriptorCount = 1;
11276 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
11277 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011278
11279 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011280 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11281 ds_pool_ci.pNext = NULL;
11282 ds_pool_ci.maxSets = 1;
11283 ds_pool_ci.poolSizeCount = 2;
11284 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011285
11286 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011287 err =
11288 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011289 ASSERT_VK_SUCCESS(err);
11290 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011291 dsl_binding[0].binding = 0;
11292 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11293 dsl_binding[0].descriptorCount = 1;
11294 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
11295 dsl_binding[0].pImmutableSamplers = NULL;
11296 dsl_binding[1].binding = 1;
11297 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11298 dsl_binding[1].descriptorCount = 1;
11299 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
11300 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011301
11302 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011303 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11304 ds_layout_ci.pNext = NULL;
11305 ds_layout_ci.bindingCount = 2;
11306 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011307
11308 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011309 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11310 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011311 ASSERT_VK_SUCCESS(err);
11312
11313 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011314 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011315 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011316 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011317 alloc_info.descriptorPool = ds_pool;
11318 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011319 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11320 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011321 ASSERT_VK_SUCCESS(err);
11322
11323 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011324 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11325 sampler_ci.pNext = NULL;
11326 sampler_ci.magFilter = VK_FILTER_NEAREST;
11327 sampler_ci.minFilter = VK_FILTER_NEAREST;
11328 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11329 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11330 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11331 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11332 sampler_ci.mipLodBias = 1.0;
11333 sampler_ci.anisotropyEnable = VK_FALSE;
11334 sampler_ci.maxAnisotropy = 1;
11335 sampler_ci.compareEnable = VK_FALSE;
11336 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11337 sampler_ci.minLod = 1.0;
11338 sampler_ci.maxLod = 1.0;
11339 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11340 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011341
11342 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011343 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011344 ASSERT_VK_SUCCESS(err);
11345
11346 VkDescriptorImageInfo info = {};
11347 info.sampler = sampler;
11348
11349 VkWriteDescriptorSet descriptor_write;
11350 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11351 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011352 descriptor_write.dstSet = descriptorSet;
11353 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011354 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011355 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11356 descriptor_write.pImageInfo = &info;
11357 // This write update should succeed
11358 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11359 // Now perform a copy update that fails due to type mismatch
11360 VkCopyDescriptorSet copy_ds_update;
11361 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11362 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11363 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -060011364 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011365 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011366 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +080011367 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011368 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11369
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011370 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011371 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070011372 m_errorMonitor->SetDesiredFailureMsg(
11373 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011374 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060011375 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11376 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11377 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011378 copy_ds_update.srcBinding =
11379 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011380 copy_ds_update.dstSet = descriptorSet;
11381 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -060011382 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011383 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11384
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011385 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011386
Tobin Ehlis04356f92015-10-27 16:35:27 -060011387 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070011388 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011389 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
11390 "update array offset of 0 and update of "
11391 "5 descriptors oversteps total number "
11392 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011393
Tobin Ehlis04356f92015-10-27 16:35:27 -060011394 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11395 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11396 copy_ds_update.srcSet = descriptorSet;
11397 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011398 copy_ds_update.dstSet = descriptorSet;
11399 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011400 copy_ds_update.descriptorCount =
11401 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011402 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11403
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011404 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011405
Chia-I Wuf7458c52015-10-26 21:10:41 +080011406 vkDestroySampler(m_device->device(), sampler, NULL);
11407 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11408 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011409}
11410
Karl Schultz6addd812016-02-02 17:17:23 -070011411TEST_F(VkLayerTest, NumSamplesMismatch) {
11412 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11413 // sampleCount
11414 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011415
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011416 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011417 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011418
Tobin Ehlis3b780662015-05-28 12:11:26 -060011419 ASSERT_NO_FATAL_FAILURE(InitState());
11420 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011421 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011422 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011423 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011424
11425 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011426 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11427 ds_pool_ci.pNext = NULL;
11428 ds_pool_ci.maxSets = 1;
11429 ds_pool_ci.poolSizeCount = 1;
11430 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011431
Tobin Ehlis3b780662015-05-28 12:11:26 -060011432 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011433 err =
11434 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011435 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011436
Tony Barboureb254902015-07-15 12:50:33 -060011437 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011438 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011439 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011440 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011441 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11442 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011443
Tony Barboureb254902015-07-15 12:50:33 -060011444 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11445 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11446 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011447 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011448 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011449
Tobin Ehlis3b780662015-05-28 12:11:26 -060011450 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011451 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11452 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011453 ASSERT_VK_SUCCESS(err);
11454
11455 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011456 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011457 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011458 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011459 alloc_info.descriptorPool = ds_pool;
11460 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011461 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11462 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011463 ASSERT_VK_SUCCESS(err);
11464
Tony Barboureb254902015-07-15 12:50:33 -060011465 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011466 pipe_ms_state_ci.sType =
11467 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11468 pipe_ms_state_ci.pNext = NULL;
11469 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11470 pipe_ms_state_ci.sampleShadingEnable = 0;
11471 pipe_ms_state_ci.minSampleShading = 1.0;
11472 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011473
Tony Barboureb254902015-07-15 12:50:33 -060011474 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011475 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11476 pipeline_layout_ci.pNext = NULL;
11477 pipeline_layout_ci.setLayoutCount = 1;
11478 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011479
11480 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011481 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11482 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011483 ASSERT_VK_SUCCESS(err);
11484
Karl Schultz6addd812016-02-02 17:17:23 -070011485 VkShaderObj vs(m_device, bindStateVertShaderText,
11486 VK_SHADER_STAGE_VERTEX_BIT, this);
11487 VkShaderObj fs(m_device, bindStateFragShaderText,
11488 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011489 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011490 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011491 VkPipelineObj pipe(m_device);
11492 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011493 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011494 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011495 pipe.SetMSAA(&pipe_ms_state_ci);
11496 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011497
Tony Barbourfe3351b2015-07-28 10:17:20 -060011498 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011499 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11500 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011501
Mark Young29927482016-05-04 14:38:51 -060011502 // Render triangle (the error should trigger on the attempt to draw).
11503 Draw(3, 1, 0, 0);
11504
11505 // Finalize recording of the command buffer
11506 EndCommandBuffer();
11507
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011508 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011509
Chia-I Wuf7458c52015-10-26 21:10:41 +080011510 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11511 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11512 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011513}
Mark Young29927482016-05-04 14:38:51 -060011514
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011515TEST_F(VkLayerTest, RenderPassIncompatible) {
11516 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
11517 "Initial case is drawing with an active renderpass that's "
11518 "not compatible with the bound PSO's creation renderpass");
11519 VkResult err;
11520
11521 ASSERT_NO_FATAL_FAILURE(InitState());
11522 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11523
11524 VkDescriptorSetLayoutBinding dsl_binding = {};
11525 dsl_binding.binding = 0;
11526 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11527 dsl_binding.descriptorCount = 1;
11528 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11529 dsl_binding.pImmutableSamplers = NULL;
11530
11531 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11532 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11533 ds_layout_ci.pNext = NULL;
11534 ds_layout_ci.bindingCount = 1;
11535 ds_layout_ci.pBindings = &dsl_binding;
11536
11537 VkDescriptorSetLayout ds_layout;
11538 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11539 &ds_layout);
11540 ASSERT_VK_SUCCESS(err);
11541
11542 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11543 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11544 pipeline_layout_ci.pNext = NULL;
11545 pipeline_layout_ci.setLayoutCount = 1;
11546 pipeline_layout_ci.pSetLayouts = &ds_layout;
11547
11548 VkPipelineLayout pipeline_layout;
11549 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11550 &pipeline_layout);
11551 ASSERT_VK_SUCCESS(err);
11552
11553 VkShaderObj vs(m_device, bindStateVertShaderText,
11554 VK_SHADER_STAGE_VERTEX_BIT, this);
11555 VkShaderObj fs(m_device, bindStateFragShaderText,
11556 VK_SHADER_STAGE_FRAGMENT_BIT,
11557 this); // We shouldn't need a fragment shader
11558 // but add it to be able to run on more devices
11559 // Create a renderpass that will be incompatible with default renderpass
11560 VkAttachmentReference attach = {};
11561 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11562 VkAttachmentReference color_att = {};
11563 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11564 VkSubpassDescription subpass = {};
11565 subpass.inputAttachmentCount = 1;
11566 subpass.pInputAttachments = &attach;
11567 subpass.colorAttachmentCount = 1;
11568 subpass.pColorAttachments = &color_att;
11569 VkRenderPassCreateInfo rpci = {};
11570 rpci.subpassCount = 1;
11571 rpci.pSubpasses = &subpass;
11572 rpci.attachmentCount = 1;
11573 VkAttachmentDescription attach_desc = {};
11574 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011575 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11576 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011577 rpci.pAttachments = &attach_desc;
11578 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11579 VkRenderPass rp;
11580 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11581 VkPipelineObj pipe(m_device);
11582 pipe.AddShader(&vs);
11583 pipe.AddShader(&fs);
11584 pipe.AddColorAttachment();
11585 VkViewport view_port = {};
11586 m_viewports.push_back(view_port);
11587 pipe.SetViewport(m_viewports);
11588 VkRect2D rect = {};
11589 m_scissors.push_back(rect);
11590 pipe.SetScissor(m_scissors);
11591 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11592
11593 VkCommandBufferInheritanceInfo cbii = {};
11594 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11595 cbii.renderPass = rp;
11596 cbii.subpass = 0;
11597 VkCommandBufferBeginInfo cbbi = {};
11598 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11599 cbbi.pInheritanceInfo = &cbii;
11600 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11601 VkRenderPassBeginInfo rpbi = {};
11602 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11603 rpbi.framebuffer = m_framebuffer;
11604 rpbi.renderPass = rp;
11605 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi,
11606 VK_SUBPASS_CONTENTS_INLINE);
11607 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11608 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11609
11610 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11611 " is incompatible w/ gfx pipeline ");
11612 // Render triangle (the error should trigger on the attempt to draw).
11613 Draw(3, 1, 0, 0);
11614
11615 // Finalize recording of the command buffer
11616 EndCommandBuffer();
11617
11618 m_errorMonitor->VerifyFound();
11619
11620 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11621 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11622 vkDestroyRenderPass(m_device->device(), rp, NULL);
11623}
11624
Mark Youngc89c6312016-03-31 16:03:20 -060011625TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11626 // Create Pipeline where the number of blend attachments doesn't match the
11627 // number of color attachments. In this case, we don't add any color
11628 // blend attachments even though we have a color attachment.
11629 VkResult err;
11630
11631 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -060011632 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060011633
11634 ASSERT_NO_FATAL_FAILURE(InitState());
11635 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11636 VkDescriptorPoolSize ds_type_count = {};
11637 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11638 ds_type_count.descriptorCount = 1;
11639
11640 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11641 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11642 ds_pool_ci.pNext = NULL;
11643 ds_pool_ci.maxSets = 1;
11644 ds_pool_ci.poolSizeCount = 1;
11645 ds_pool_ci.pPoolSizes = &ds_type_count;
11646
11647 VkDescriptorPool ds_pool;
11648 err =
11649 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11650 ASSERT_VK_SUCCESS(err);
11651
11652 VkDescriptorSetLayoutBinding dsl_binding = {};
11653 dsl_binding.binding = 0;
11654 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11655 dsl_binding.descriptorCount = 1;
11656 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11657 dsl_binding.pImmutableSamplers = NULL;
11658
11659 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11660 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11661 ds_layout_ci.pNext = NULL;
11662 ds_layout_ci.bindingCount = 1;
11663 ds_layout_ci.pBindings = &dsl_binding;
11664
11665 VkDescriptorSetLayout ds_layout;
11666 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11667 &ds_layout);
11668 ASSERT_VK_SUCCESS(err);
11669
11670 VkDescriptorSet descriptorSet;
11671 VkDescriptorSetAllocateInfo alloc_info = {};
11672 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11673 alloc_info.descriptorSetCount = 1;
11674 alloc_info.descriptorPool = ds_pool;
11675 alloc_info.pSetLayouts = &ds_layout;
11676 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11677 &descriptorSet);
11678 ASSERT_VK_SUCCESS(err);
11679
11680 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11681 pipe_ms_state_ci.sType =
11682 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11683 pipe_ms_state_ci.pNext = NULL;
11684 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11685 pipe_ms_state_ci.sampleShadingEnable = 0;
11686 pipe_ms_state_ci.minSampleShading = 1.0;
11687 pipe_ms_state_ci.pSampleMask = NULL;
11688
11689 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11690 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11691 pipeline_layout_ci.pNext = NULL;
11692 pipeline_layout_ci.setLayoutCount = 1;
11693 pipeline_layout_ci.pSetLayouts = &ds_layout;
11694
11695 VkPipelineLayout pipeline_layout;
11696 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11697 &pipeline_layout);
11698 ASSERT_VK_SUCCESS(err);
11699
11700 VkShaderObj vs(m_device, bindStateVertShaderText,
11701 VK_SHADER_STAGE_VERTEX_BIT, this);
11702 VkShaderObj fs(m_device, bindStateFragShaderText,
11703 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011704 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -060011705 // but add it to be able to run on more devices
11706 VkPipelineObj pipe(m_device);
11707 pipe.AddShader(&vs);
11708 pipe.AddShader(&fs);
11709 pipe.SetMSAA(&pipe_ms_state_ci);
11710 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11711
11712 BeginCommandBuffer();
11713 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11714 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11715
Mark Young29927482016-05-04 14:38:51 -060011716 // Render triangle (the error should trigger on the attempt to draw).
11717 Draw(3, 1, 0, 0);
11718
11719 // Finalize recording of the command buffer
11720 EndCommandBuffer();
11721
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011722 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011723
11724 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11725 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11726 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11727}
Mark Young29927482016-05-04 14:38:51 -060011728
Mark Muellerd4914412016-06-13 17:52:06 -060011729TEST_F(VkLayerTest, MissingClearAttachment) {
11730 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
11731 "structure passed to vkCmdClearAttachments");
11732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11733 "vkCmdClearAttachments() attachment index 1 not found in attachment "
11734 "reference array of active subpass 0");
11735
11736 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11737 m_errorMonitor->VerifyFound();
11738}
11739
Karl Schultz6addd812016-02-02 17:17:23 -070011740TEST_F(VkLayerTest, ClearCmdNoDraw) {
11741 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
11742 // to issuing a Draw
11743 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011744
Karl Schultz6addd812016-02-02 17:17:23 -070011745 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -070011746 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011747 "vkCmdClearAttachments() issued on CB object ");
11748
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011749 ASSERT_NO_FATAL_FAILURE(InitState());
11750 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011751
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011752 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011753 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11754 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011755
11756 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011757 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11758 ds_pool_ci.pNext = NULL;
11759 ds_pool_ci.maxSets = 1;
11760 ds_pool_ci.poolSizeCount = 1;
11761 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011762
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011763 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011764 err =
11765 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011766 ASSERT_VK_SUCCESS(err);
11767
Tony Barboureb254902015-07-15 12:50:33 -060011768 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011769 dsl_binding.binding = 0;
11770 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11771 dsl_binding.descriptorCount = 1;
11772 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11773 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011774
Tony Barboureb254902015-07-15 12:50:33 -060011775 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011776 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11777 ds_layout_ci.pNext = NULL;
11778 ds_layout_ci.bindingCount = 1;
11779 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011780
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011781 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011782 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11783 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011784 ASSERT_VK_SUCCESS(err);
11785
11786 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011787 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011788 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011789 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011790 alloc_info.descriptorPool = ds_pool;
11791 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011792 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11793 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011794 ASSERT_VK_SUCCESS(err);
11795
Tony Barboureb254902015-07-15 12:50:33 -060011796 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011797 pipe_ms_state_ci.sType =
11798 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11799 pipe_ms_state_ci.pNext = NULL;
11800 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11801 pipe_ms_state_ci.sampleShadingEnable = 0;
11802 pipe_ms_state_ci.minSampleShading = 1.0;
11803 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011804
Tony Barboureb254902015-07-15 12:50:33 -060011805 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011806 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11807 pipeline_layout_ci.pNext = NULL;
11808 pipeline_layout_ci.setLayoutCount = 1;
11809 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011810
11811 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011812 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11813 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011814 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011815
Karl Schultz6addd812016-02-02 17:17:23 -070011816 VkShaderObj vs(m_device, bindStateVertShaderText,
11817 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011818 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011819 // on more devices
11820 VkShaderObj fs(m_device, bindStateFragShaderText,
11821 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011822
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011823 VkPipelineObj pipe(m_device);
11824 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011825 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011826 pipe.SetMSAA(&pipe_ms_state_ci);
11827 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011828
11829 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011830
Karl Schultz6addd812016-02-02 17:17:23 -070011831 // Main thing we care about for this test is that the VkImage obj we're
11832 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011833 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011834 VkClearAttachment color_attachment;
11835 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11836 color_attachment.clearValue.color.float32[0] = 1.0;
11837 color_attachment.clearValue.color.float32[1] = 1.0;
11838 color_attachment.clearValue.color.float32[2] = 1.0;
11839 color_attachment.clearValue.color.float32[3] = 1.0;
11840 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011841 VkClearRect clear_rect = {
11842 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011843
Karl Schultz6addd812016-02-02 17:17:23 -070011844 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
11845 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011846
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011847 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011848
Chia-I Wuf7458c52015-10-26 21:10:41 +080011849 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11850 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11851 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011852}
11853
Karl Schultz6addd812016-02-02 17:17:23 -070011854TEST_F(VkLayerTest, VtxBufferBadIndex) {
11855 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011856
Karl Schultz6addd812016-02-02 17:17:23 -070011857 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070011858 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -070011859 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011860
Tobin Ehlis502480b2015-06-24 15:53:07 -060011861 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011862 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011863 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011864
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011865 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011866 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11867 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011868
11869 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011870 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11871 ds_pool_ci.pNext = NULL;
11872 ds_pool_ci.maxSets = 1;
11873 ds_pool_ci.poolSizeCount = 1;
11874 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011875
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011876 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011877 err =
11878 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011879 ASSERT_VK_SUCCESS(err);
11880
Tony Barboureb254902015-07-15 12:50:33 -060011881 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011882 dsl_binding.binding = 0;
11883 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11884 dsl_binding.descriptorCount = 1;
11885 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11886 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011887
Tony Barboureb254902015-07-15 12:50:33 -060011888 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011889 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11890 ds_layout_ci.pNext = NULL;
11891 ds_layout_ci.bindingCount = 1;
11892 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011893
Tobin Ehlis502480b2015-06-24 15:53:07 -060011894 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011895 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11896 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011897 ASSERT_VK_SUCCESS(err);
11898
11899 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011900 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011901 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011902 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011903 alloc_info.descriptorPool = ds_pool;
11904 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011905 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11906 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011907 ASSERT_VK_SUCCESS(err);
11908
Tony Barboureb254902015-07-15 12:50:33 -060011909 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011910 pipe_ms_state_ci.sType =
11911 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11912 pipe_ms_state_ci.pNext = NULL;
11913 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11914 pipe_ms_state_ci.sampleShadingEnable = 0;
11915 pipe_ms_state_ci.minSampleShading = 1.0;
11916 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011917
Tony Barboureb254902015-07-15 12:50:33 -060011918 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011919 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11920 pipeline_layout_ci.pNext = NULL;
11921 pipeline_layout_ci.setLayoutCount = 1;
11922 pipeline_layout_ci.pSetLayouts = &ds_layout;
11923 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011924
Karl Schultz6addd812016-02-02 17:17:23 -070011925 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11926 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011927 ASSERT_VK_SUCCESS(err);
11928
Karl Schultz6addd812016-02-02 17:17:23 -070011929 VkShaderObj vs(m_device, bindStateVertShaderText,
11930 VK_SHADER_STAGE_VERTEX_BIT, this);
11931 VkShaderObj fs(m_device, bindStateFragShaderText,
11932 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011933 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011934 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011935 VkPipelineObj pipe(m_device);
11936 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011937 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011938 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011939 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011940 pipe.SetViewport(m_viewports);
11941 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011942 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011943
11944 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011945 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11946 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011947 // Don't care about actual data, just need to get to draw to flag error
11948 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -070011949 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
11950 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011951 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011952 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011953
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011954 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011955
Chia-I Wuf7458c52015-10-26 21:10:41 +080011956 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11957 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11958 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011959}
Mark Muellerdfe37552016-07-07 14:47:42 -060011960
11961TEST_F(VkLayerTest, VertexBufferInvalid) {
11962 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
11963 "delete a buffer twice, use an invalid offset for each "
11964 "buffer type, and attempt to bind a null buffer");
11965
11966 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
11967 "using deleted buffer ";
11968 const char *double_destroy_message = "Cannot free buffer 0x";
11969 const char *invalid_offset_message = "vkBindBufferMemory(): "
11970 "memoryOffset is 0x";
11971 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
11972 "storage memoryOffset "
11973 "is 0x";
11974 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
11975 "texel memoryOffset "
11976 "is 0x";
11977 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
11978 "uniform memoryOffset "
11979 "is 0x";
11980 const char *bind_null_buffer_message = "In vkBindBufferMemory, attempting"
11981 " to Bind Obj(0x";
11982 const char *free_invalid_buffer_message = "Request to delete memory "
11983 "object 0x";
11984
11985 ASSERT_NO_FATAL_FAILURE(InitState());
11986 ASSERT_NO_FATAL_FAILURE(InitViewport());
11987 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11988
11989 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11990 pipe_ms_state_ci.sType =
11991 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11992 pipe_ms_state_ci.pNext = NULL;
11993 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11994 pipe_ms_state_ci.sampleShadingEnable = 0;
11995 pipe_ms_state_ci.minSampleShading = 1.0;
11996 pipe_ms_state_ci.pSampleMask = nullptr;
11997
11998 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11999 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12000 VkPipelineLayout pipeline_layout;
12001
12002 VkResult err = vkCreatePipelineLayout(m_device->device(),
12003 &pipeline_layout_ci, nullptr,
12004 &pipeline_layout);
12005 ASSERT_VK_SUCCESS(err);
12006
12007 VkShaderObj vs(m_device, bindStateVertShaderText,
12008 VK_SHADER_STAGE_VERTEX_BIT, this);
12009 VkShaderObj fs(m_device, bindStateFragShaderText,
12010 VK_SHADER_STAGE_FRAGMENT_BIT,
12011 this);
12012 VkPipelineObj pipe(m_device);
12013 pipe.AddShader(&vs);
12014 pipe.AddShader(&fs);
12015 pipe.AddColorAttachment();
12016 pipe.SetMSAA(&pipe_ms_state_ci);
12017 pipe.SetViewport(m_viewports);
12018 pipe.SetScissor(m_scissors);
12019 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12020
12021 BeginCommandBuffer();
12022 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
12023 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12024
12025 {
12026 // Create and bind a vertex buffer in a reduced scope, which will cause
12027 // it to be deleted upon leaving this scope
12028 const float vbo_data[3] = {1.f, 0.f, 1.f};
12029 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data),
12030 3, vbo_data);
12031 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
12032 draw_verticies.AddVertexInputToPipe(pipe);
12033 }
12034
12035 Draw(1, 0, 0, 0);
12036
12037 EndCommandBuffer();
12038
12039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12040 deleted_buffer_in_command_buffer);
12041 QueueCommandBuffer(false);
12042 m_errorMonitor->VerifyFound();
12043
12044 {
12045 // Create and bind a vertex buffer in a reduced scope, and delete it
12046 // twice, the second through the destructor
12047 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12048 VkBufferTest::eDoubleDelete);
12049 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12050 double_destroy_message);
12051 buffer_test.TestDoubleDestroy();
12052 }
12053 m_errorMonitor->VerifyFound();
12054
12055 if (VkBufferTest::
12056 GetTestConditionValid(m_device,
12057 VkBufferTest::eInvalidMemoryOffset)) {
12058 // Create and bind a memory buffer with an invalid offset.
12059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12060 invalid_offset_message);
12061 VkBufferTest buffer_test(m_device,
12062 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
12063 VkBufferTest::eInvalidMemoryOffset);
12064 (void) buffer_test;
12065 m_errorMonitor->VerifyFound();
12066 }
12067
12068 if (VkBufferTest::
12069 GetTestConditionValid(m_device,
12070 VkBufferTest::eInvalidDeviceOffset,
12071 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
12072 // Create and bind a memory buffer with an invalid offset again,
12073 // but look for a texel buffer message.
12074 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12075 invalid_texel_buffer_offset_message);
12076 VkBufferTest buffer_test(m_device,
12077 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
12078 VkBufferTest::eInvalidDeviceOffset);
12079 (void) buffer_test;
12080 m_errorMonitor->VerifyFound();
12081 }
12082
12083 if (VkBufferTest::
12084 GetTestConditionValid(m_device,
12085 VkBufferTest::eInvalidDeviceOffset,
12086 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
12087 // Create and bind a memory buffer with an invalid offset again, but
12088 // look for a uniform buffer message.
12089 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12090 invalid_uniform_buffer_offset_message);
12091 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
12092 VkBufferTest::eInvalidDeviceOffset);
12093 (void) buffer_test;
12094 m_errorMonitor->VerifyFound();
12095 }
12096
12097 if (VkBufferTest::
12098 GetTestConditionValid(m_device,
12099 VkBufferTest::eInvalidDeviceOffset,
12100 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
12101 // Create and bind a memory buffer with an invalid offset again, but
12102 // look for a storage buffer message.
12103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12104 invalid_storage_buffer_offset_message);
12105 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12106 VkBufferTest::eInvalidDeviceOffset);
12107 (void) buffer_test;
12108 m_errorMonitor->VerifyFound();
12109 }
12110
12111 {
12112 // Attempt to bind a null buffer.
12113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12114 bind_null_buffer_message);
12115 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12116 VkBufferTest::eBindNullBuffer);
12117 (void) buffer_test;
12118 m_errorMonitor->VerifyFound();
12119 }
12120
12121 {
12122 // Attempt to use an invalid handle to delete a buffer.
12123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12124 free_invalid_buffer_message);
12125 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12126 VkBufferTest::eFreeInvalidHandle);
12127 (void) buffer_test;
12128 }
12129 m_errorMonitor->VerifyFound();
12130
12131 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12132}
12133
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012134// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
12135TEST_F(VkLayerTest, InvalidImageLayout) {
12136 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
12137 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
12138 "images in the wrong layout when they're copied or transitioned.");
12139 // 3 in ValidateCmdBufImageLayouts
12140 // * -1 Attempt to submit cmd buf w/ deleted image
12141 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
12142 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
12143 m_errorMonitor->SetDesiredFailureMsg(
12144 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12145 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12146
12147 ASSERT_NO_FATAL_FAILURE(InitState());
12148 // Create src & dst images to use for copy operations
12149 VkImage src_image;
12150 VkImage dst_image;
12151
12152 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
12153 const int32_t tex_width = 32;
12154 const int32_t tex_height = 32;
12155
12156 VkImageCreateInfo image_create_info = {};
12157 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12158 image_create_info.pNext = NULL;
12159 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12160 image_create_info.format = tex_format;
12161 image_create_info.extent.width = tex_width;
12162 image_create_info.extent.height = tex_height;
12163 image_create_info.extent.depth = 1;
12164 image_create_info.mipLevels = 1;
12165 image_create_info.arrayLayers = 4;
12166 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12167 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12168 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
12169 image_create_info.flags = 0;
12170
12171 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
12172 ASSERT_VK_SUCCESS(err);
12173 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
12174 ASSERT_VK_SUCCESS(err);
12175
12176 BeginCommandBuffer();
12177 VkImageCopy copyRegion;
12178 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12179 copyRegion.srcSubresource.mipLevel = 0;
12180 copyRegion.srcSubresource.baseArrayLayer = 0;
12181 copyRegion.srcSubresource.layerCount = 1;
12182 copyRegion.srcOffset.x = 0;
12183 copyRegion.srcOffset.y = 0;
12184 copyRegion.srcOffset.z = 0;
12185 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12186 copyRegion.dstSubresource.mipLevel = 0;
12187 copyRegion.dstSubresource.baseArrayLayer = 0;
12188 copyRegion.dstSubresource.layerCount = 1;
12189 copyRegion.dstOffset.x = 0;
12190 copyRegion.dstOffset.y = 0;
12191 copyRegion.dstOffset.z = 0;
12192 copyRegion.extent.width = 1;
12193 copyRegion.extent.height = 1;
12194 copyRegion.extent.depth = 1;
12195 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12196 m_errorMonitor->VerifyFound();
12197 // Now cause error due to src image layout changing
12198 m_errorMonitor->SetDesiredFailureMsg(
12199 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12200 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
12201 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12202 m_errorMonitor->VerifyFound();
12203 // Final src error is due to bad layout type
12204 m_errorMonitor->SetDesiredFailureMsg(
12205 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12206 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
12207 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12208 m_errorMonitor->VerifyFound();
12209 // Now verify same checks for dst
12210 m_errorMonitor->SetDesiredFailureMsg(
12211 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12212 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
12213 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12214 m_errorMonitor->VerifyFound();
12215 // Now cause error due to src image layout changing
12216 m_errorMonitor->SetDesiredFailureMsg(
12217 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12218 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
12219 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
12220 m_errorMonitor->VerifyFound();
12221 m_errorMonitor->SetDesiredFailureMsg(
12222 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12223 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
12224 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
12225 m_errorMonitor->VerifyFound();
12226 // Now cause error due to bad image layout transition in PipelineBarrier
12227 VkImageMemoryBarrier image_barrier[1] = {};
12228 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12229 image_barrier[0].image = src_image;
12230 image_barrier[0].subresourceRange.layerCount = 2;
12231 image_barrier[0].subresourceRange.levelCount = 2;
12232 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12233 m_errorMonitor->SetDesiredFailureMsg(
12234 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12235 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
12236 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
12237 m_errorMonitor->VerifyFound();
12238
12239 // Finally some layout errors at RenderPass create time
12240 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12241 VkAttachmentReference attach = {};
12242 // perf warning for GENERAL layout w/ non-DS input attachment
12243 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12244 VkSubpassDescription subpass = {};
12245 subpass.inputAttachmentCount = 1;
12246 subpass.pInputAttachments = &attach;
12247 VkRenderPassCreateInfo rpci = {};
12248 rpci.subpassCount = 1;
12249 rpci.pSubpasses = &subpass;
12250 rpci.attachmentCount = 1;
12251 VkAttachmentDescription attach_desc = {};
12252 attach_desc.format = VK_FORMAT_UNDEFINED;
12253 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012254 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012255 VkRenderPass rp;
12256 m_errorMonitor->SetDesiredFailureMsg(
12257 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12258 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
12259 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12260 m_errorMonitor->VerifyFound();
12261 // error w/ non-general layout
12262 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12263
12264 m_errorMonitor->SetDesiredFailureMsg(
12265 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12266 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12267 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12268 m_errorMonitor->VerifyFound();
12269 subpass.inputAttachmentCount = 0;
12270 subpass.colorAttachmentCount = 1;
12271 subpass.pColorAttachments = &attach;
12272 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12273 // perf warning for GENERAL layout on color attachment
12274 m_errorMonitor->SetDesiredFailureMsg(
12275 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12276 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
12277 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12278 m_errorMonitor->VerifyFound();
12279 // error w/ non-color opt or GENERAL layout for color attachment
12280 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12281 m_errorMonitor->SetDesiredFailureMsg(
12282 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12283 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12284 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12285 m_errorMonitor->VerifyFound();
12286 subpass.colorAttachmentCount = 0;
12287 subpass.pDepthStencilAttachment = &attach;
12288 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12289 // perf warning for GENERAL layout on DS attachment
12290 m_errorMonitor->SetDesiredFailureMsg(
12291 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Chris Forbesc5dd9bc2016-08-09 08:17:14 +120012292 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012293 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12294 m_errorMonitor->VerifyFound();
12295 // error w/ non-ds opt or GENERAL layout for color attachment
12296 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12297 m_errorMonitor->SetDesiredFailureMsg(
12298 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesc5dd9bc2016-08-09 08:17:14 +120012299 "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 -060012300 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12301 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012302 // For this error we need a valid renderpass so create default one
12303 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12304 attach.attachment = 0;
12305 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
12306 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12307 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12308 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12309 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12310 // Can't do a CLEAR load on READ_ONLY initialLayout
12311 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12312 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12313 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12315 " with invalid first layout "
12316 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
12317 "ONLY_OPTIMAL");
12318 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12319 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012320
12321 vkDestroyImage(m_device->device(), src_image, NULL);
12322 vkDestroyImage(m_device->device(), dst_image, NULL);
12323}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012324
12325TEST_F(VkLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
12326 TEST_DESCRIPTION("Positive test where we create a renderpass with an "
12327 "attachment that uses LOAD_OP_CLEAR, the first subpass "
12328 "has a valid layout, and a second subpass then uses a "
12329 "valid *READ_ONLY* layout.");
12330 m_errorMonitor->ExpectSuccess();
12331 ASSERT_NO_FATAL_FAILURE(InitState());
12332
12333 VkAttachmentReference attach[2] = {};
12334 attach[0].attachment = 0;
12335 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
12336 attach[1].attachment = 0;
12337 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12338 VkSubpassDescription subpasses[2] = {};
12339 // First subpass clears DS attach on load
12340 subpasses[0].pDepthStencilAttachment = &attach[0];
12341 // 2nd subpass reads in DS as input attachment
12342 subpasses[1].inputAttachmentCount = 1;
12343 subpasses[1].pInputAttachments = &attach[1];
12344 VkAttachmentDescription attach_desc = {};
12345 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
12346 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12347 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12348 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12349 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12350 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12351 attach_desc.initialLayout =
12352 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
12353 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12354 VkRenderPassCreateInfo rpci = {};
12355 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
12356 rpci.attachmentCount = 1;
12357 rpci.pAttachments = &attach_desc;
12358 rpci.subpassCount = 2;
12359 rpci.pSubpasses = subpasses;
12360
12361 // Now create RenderPass and verify no errors
12362 VkRenderPass rp;
12363 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12364 m_errorMonitor->VerifyNotFound();
12365
12366 vkDestroyRenderPass(m_device->device(), rp, NULL);
12367}
Tobin Ehlis4af23302016-07-19 10:50:30 -060012368
12369TEST_F(VkLayerTest, FramebufferIncompatible) {
12370 TEST_DESCRIPTION("Bind a secondary command buffer with with a framebuffer "
12371 "that does not match the framebuffer for the active "
12372 "renderpass.");
12373 ASSERT_NO_FATAL_FAILURE(InitState());
12374 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12375
12376 // A renderpass with one color attachment.
12377 VkAttachmentDescription attachment = {
12378 0,
12379 VK_FORMAT_B8G8R8A8_UNORM,
12380 VK_SAMPLE_COUNT_1_BIT,
12381 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12382 VK_ATTACHMENT_STORE_OP_STORE,
12383 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12384 VK_ATTACHMENT_STORE_OP_DONT_CARE,
12385 VK_IMAGE_LAYOUT_UNDEFINED,
12386 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
12387
12388 VkAttachmentReference att_ref = {0,
12389 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
12390
12391 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS,
12392 0, nullptr,
12393 1, &att_ref,
12394 nullptr, nullptr,
12395 0, nullptr};
12396
12397 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
12398 nullptr,
12399 0,
12400 1,
12401 &attachment,
12402 1,
12403 &subpass,
12404 0,
12405 nullptr};
12406
12407 VkRenderPass rp;
12408 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
12409 ASSERT_VK_SUCCESS(err);
12410
12411 // A compatible framebuffer.
12412 VkImageObj image(m_device);
12413 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM,
12414 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12415 ASSERT_TRUE(image.initialized());
12416
12417 VkImageViewCreateInfo ivci = {
12418 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
12419 nullptr,
12420 0,
12421 image.handle(),
12422 VK_IMAGE_VIEW_TYPE_2D,
12423 VK_FORMAT_B8G8R8A8_UNORM,
12424 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
12425 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
12426 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
12427 };
12428 VkImageView view;
12429 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
12430 ASSERT_VK_SUCCESS(err);
12431
12432 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
12433 nullptr,
12434 0,
12435 rp,
12436 1,
12437 &view,
12438 32,
12439 32,
12440 1};
12441 VkFramebuffer fb;
12442 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
12443 ASSERT_VK_SUCCESS(err);
12444
12445 VkCommandBufferAllocateInfo cbai = {};
12446 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12447 cbai.commandPool = m_commandPool;
12448 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12449 cbai.commandBufferCount = 1;
12450
12451 VkCommandBuffer sec_cb;
12452 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
12453 ASSERT_VK_SUCCESS(err);
12454 VkCommandBufferBeginInfo cbbi = {};
12455 VkCommandBufferInheritanceInfo cbii = {};
12456 cbii.renderPass = renderPass();
12457 cbii.framebuffer = fb;
12458 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12459 cbbi.pNext = NULL;
12460 cbbi.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
12461 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
12462 cbbi.pInheritanceInfo = &cbii;
12463 vkBeginCommandBuffer(sec_cb, &cbbi);
12464 vkEndCommandBuffer(sec_cb);
12465
12466 BeginCommandBuffer();
12467
12468 m_errorMonitor->SetDesiredFailureMsg(
12469 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12470 " that is not the same as the primaryCB's current active framebuffer ");
12471 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
12472 m_errorMonitor->VerifyFound();
12473 // Cleanup
12474 vkDestroyImageView(m_device->device(), view, NULL);
12475 vkDestroyRenderPass(m_device->device(), rp, NULL);
12476 vkDestroyFramebuffer(m_device->device(), fb, NULL);
12477}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012478
12479TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
12480 TEST_DESCRIPTION("If logicOp is available on the device, set it to an "
12481 "invalid value. If logicOp is not available, attempt to "
12482 "use it and verify that we see the correct error.");
12483 ASSERT_NO_FATAL_FAILURE(InitState());
12484 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12485
12486 auto features = m_device->phy().features();
12487 // Set the expected error depending on whether or not logicOp available
12488 if (VK_FALSE == features.logicOp) {
12489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12490 "If logic operations feature not "
12491 "enabled, logicOpEnable must be "
12492 "VK_FALSE");
12493 } else {
12494 m_errorMonitor->SetDesiredFailureMsg(
12495 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12496 ", logicOp must be a valid VkLogicOp value");
12497 }
12498 // Create a pipeline using logicOp
12499 VkResult err;
12500
12501 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12502 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12503
12504 VkPipelineLayout pipeline_layout;
12505 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
12506 &pipeline_layout);
12507 ASSERT_VK_SUCCESS(err);
12508
12509 VkPipelineViewportStateCreateInfo vp_state_ci = {};
12510 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
12511 vp_state_ci.viewportCount = 1;
12512 VkViewport vp = {}; // Just need dummy vp to point to
12513 vp_state_ci.pViewports = &vp;
12514 vp_state_ci.scissorCount = 1;
12515 VkRect2D scissors = {}; // Dummy scissors to point to
12516 vp_state_ci.pScissors = &scissors;
12517 // No dynamic state
12518 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
12519 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
12520
12521 VkPipelineShaderStageCreateInfo shaderStages[2];
12522 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
12523
12524 VkShaderObj vs(m_device, bindStateVertShaderText,
12525 VK_SHADER_STAGE_VERTEX_BIT, this);
12526 VkShaderObj fs(m_device, bindStateFragShaderText,
12527 VK_SHADER_STAGE_FRAGMENT_BIT,
12528 this);
12529 shaderStages[0] = vs.GetStageCreateInfo();
12530 shaderStages[1] = fs.GetStageCreateInfo();
12531
12532 VkPipelineVertexInputStateCreateInfo vi_ci = {};
12533 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
12534
12535 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
12536 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
12537 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
12538
12539 VkPipelineRasterizationStateCreateInfo rs_ci = {};
12540 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
12541
12542 VkPipelineColorBlendAttachmentState att = {};
12543 att.blendEnable = VK_FALSE;
12544 att.colorWriteMask = 0xf;
12545
12546 VkPipelineColorBlendStateCreateInfo cb_ci = {};
12547 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
12548 // Enable logicOp & set logicOp to value 1 beyond allowed entries
12549 cb_ci.logicOpEnable = VK_TRUE;
12550 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
12551 cb_ci.attachmentCount = 1;
12552 cb_ci.pAttachments = &att;
12553
12554 VkGraphicsPipelineCreateInfo gp_ci = {};
12555 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
12556 gp_ci.stageCount = 2;
12557 gp_ci.pStages = shaderStages;
12558 gp_ci.pVertexInputState = &vi_ci;
12559 gp_ci.pInputAssemblyState = &ia_ci;
12560 gp_ci.pViewportState = &vp_state_ci;
12561 gp_ci.pRasterizationState = &rs_ci;
12562 gp_ci.pColorBlendState = &cb_ci;
12563 gp_ci.pDynamicState = &dyn_state_ci;
12564 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
12565 gp_ci.layout = pipeline_layout;
12566 gp_ci.renderPass = renderPass();
12567
12568 VkPipelineCacheCreateInfo pc_ci = {};
12569 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
12570
12571 VkPipeline pipeline;
12572 VkPipelineCache pipelineCache;
12573 err =
12574 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
12575 ASSERT_VK_SUCCESS(err);
12576
12577 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
12578 &gp_ci, NULL, &pipeline);
12579 m_errorMonitor->VerifyFound();
12580 if (VK_SUCCESS == err) {
12581 vkDestroyPipeline(m_device->device(), pipeline, NULL);
12582 }
12583 m_errorMonitor->VerifyFound();
12584 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
12585 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12586}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012587#endif // DRAW_STATE_TESTS
12588
Tobin Ehlis0788f522015-05-26 16:11:58 -060012589#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060012590#if GTEST_IS_THREADSAFE
12591struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012592 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012593 VkEvent event;
12594 bool bailout;
12595};
12596
Karl Schultz6addd812016-02-02 17:17:23 -070012597extern "C" void *AddToCommandBuffer(void *arg) {
12598 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012599
Mike Stroyana6d14942016-07-13 15:10:05 -060012600 for (int i = 0; i < 80000; i++) {
Karl Schultz6addd812016-02-02 17:17:23 -070012601 vkCmdSetEvent(data->commandBuffer, data->event,
12602 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012603 if (data->bailout) {
12604 break;
12605 }
12606 }
12607 return NULL;
12608}
12609
Karl Schultz6addd812016-02-02 17:17:23 -070012610TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012611 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012612
Karl Schultz6addd812016-02-02 17:17:23 -070012613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12614 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012615
Mike Stroyanaccf7692015-05-12 16:00:45 -060012616 ASSERT_NO_FATAL_FAILURE(InitState());
12617 ASSERT_NO_FATAL_FAILURE(InitViewport());
12618 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12619
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012620 // Calls AllocateCommandBuffers
12621 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012622
12623 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012624 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012625
12626 VkEventCreateInfo event_info;
12627 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012628 VkResult err;
12629
12630 memset(&event_info, 0, sizeof(event_info));
12631 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12632
Chia-I Wuf7458c52015-10-26 21:10:41 +080012633 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012634 ASSERT_VK_SUCCESS(err);
12635
Mike Stroyanaccf7692015-05-12 16:00:45 -060012636 err = vkResetEvent(device(), event);
12637 ASSERT_VK_SUCCESS(err);
12638
12639 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012640 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012641 data.event = event;
12642 data.bailout = false;
12643 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060012644
12645 // First do some correct operations using multiple threads.
12646 // Add many entries to command buffer from another thread.
12647 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
12648 // Make non-conflicting calls from this thread at the same time.
12649 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060012650 uint32_t count;
12651 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060012652 }
12653 test_platform_thread_join(thread, NULL);
12654
12655 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060012656 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012657 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012658 // Add many entries to command buffer from this thread at the same time.
12659 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012660
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012661 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012662 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012663
Mike Stroyan10b8cb72016-01-22 15:22:03 -070012664 m_errorMonitor->SetBailout(NULL);
12665
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012666 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012667
Chia-I Wuf7458c52015-10-26 21:10:41 +080012668 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012669}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012670#endif // GTEST_IS_THREADSAFE
12671#endif // THREADING_TESTS
12672
Chris Forbes9f7ff632015-05-25 11:13:08 +120012673#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070012674TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012675 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12676 "with an impossible code size");
12677
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012679 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012680
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012681 ASSERT_NO_FATAL_FAILURE(InitState());
12682 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12683
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012684 VkShaderModule module;
12685 VkShaderModuleCreateInfo moduleCreateInfo;
12686 struct icd_spv_header spv;
12687
12688 spv.magic = ICD_SPV_MAGIC;
12689 spv.version = ICD_SPV_VERSION;
12690 spv.gen_magic = 0;
12691
12692 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12693 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012694 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012695 moduleCreateInfo.codeSize = 4;
12696 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012697 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012698
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012699 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012700}
12701
Karl Schultz6addd812016-02-02 17:17:23 -070012702TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012703 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12704 "with a bad magic number");
12705
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012706 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012707 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012708
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012709 ASSERT_NO_FATAL_FAILURE(InitState());
12710 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12711
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012712 VkShaderModule module;
12713 VkShaderModuleCreateInfo moduleCreateInfo;
12714 struct icd_spv_header spv;
12715
12716 spv.magic = ~ICD_SPV_MAGIC;
12717 spv.version = ICD_SPV_VERSION;
12718 spv.gen_magic = 0;
12719
12720 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12721 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012722 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012723 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12724 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012725 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012726
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012727 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012728}
12729
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012730#if 0
12731// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070012732TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012733 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012734 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012735
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012736 ASSERT_NO_FATAL_FAILURE(InitState());
12737 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12738
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012739 VkShaderModule module;
12740 VkShaderModuleCreateInfo moduleCreateInfo;
12741 struct icd_spv_header spv;
12742
12743 spv.magic = ICD_SPV_MAGIC;
12744 spv.version = ~ICD_SPV_VERSION;
12745 spv.gen_magic = 0;
12746
12747 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12748 moduleCreateInfo.pNext = NULL;
12749
Karl Schultz6addd812016-02-02 17:17:23 -070012750 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012751 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12752 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012753 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012754
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012755 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012756}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012757#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012758
Karl Schultz6addd812016-02-02 17:17:23 -070012759TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012760 TEST_DESCRIPTION("Test that a warning is produced for a vertex output that "
12761 "is not consumed by the fragment stage");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012763 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012764
Chris Forbes9f7ff632015-05-25 11:13:08 +120012765 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012766 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012767
12768 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012769 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120012770 "\n"
12771 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012772 "out gl_PerVertex {\n"
12773 " vec4 gl_Position;\n"
12774 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120012775 "void main(){\n"
12776 " gl_Position = vec4(1);\n"
12777 " x = 0;\n"
12778 "}\n";
12779 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012780 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120012781 "\n"
12782 "layout(location=0) out vec4 color;\n"
12783 "void main(){\n"
12784 " color = vec4(1);\n"
12785 "}\n";
12786
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012787 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12788 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012789
12790 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012791 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012792 pipe.AddShader(&vs);
12793 pipe.AddShader(&fs);
12794
Chris Forbes9f7ff632015-05-25 11:13:08 +120012795 VkDescriptorSetObj descriptorSet(m_device);
12796 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012797 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012798
Tony Barbour5781e8f2015-08-04 16:23:11 -060012799 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012800
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012801 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012802}
Chris Forbes9f7ff632015-05-25 11:13:08 +120012803
Karl Schultz6addd812016-02-02 17:17:23 -070012804TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012805 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12806 "which is not present in the outputs of the previous stage");
12807
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012808 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012809 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012810
Chris Forbes59cb88d2015-05-25 11:13:13 +120012811 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012812 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012813
12814 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012815 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012816 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012817 "out gl_PerVertex {\n"
12818 " vec4 gl_Position;\n"
12819 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012820 "void main(){\n"
12821 " gl_Position = vec4(1);\n"
12822 "}\n";
12823 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012824 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012825 "\n"
12826 "layout(location=0) in float x;\n"
12827 "layout(location=0) out vec4 color;\n"
12828 "void main(){\n"
12829 " color = vec4(x);\n"
12830 "}\n";
12831
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012832 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12833 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012834
12835 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012836 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012837 pipe.AddShader(&vs);
12838 pipe.AddShader(&fs);
12839
Chris Forbes59cb88d2015-05-25 11:13:13 +120012840 VkDescriptorSetObj descriptorSet(m_device);
12841 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012842 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012843
Tony Barbour5781e8f2015-08-04 16:23:11 -060012844 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012845
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012846 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012847}
12848
Karl Schultz6addd812016-02-02 17:17:23 -070012849TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012850 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12851 "within an interace block, which is not present in the outputs "
12852 "of the previous stage.");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012854 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012855
12856 ASSERT_NO_FATAL_FAILURE(InitState());
12857 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12858
12859 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012860 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012861 "\n"
12862 "out gl_PerVertex {\n"
12863 " vec4 gl_Position;\n"
12864 "};\n"
12865 "void main(){\n"
12866 " gl_Position = vec4(1);\n"
12867 "}\n";
12868 char const *fsSource =
12869 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012870 "\n"
12871 "in block { layout(location=0) float x; } ins;\n"
12872 "layout(location=0) out vec4 color;\n"
12873 "void main(){\n"
12874 " color = vec4(ins.x);\n"
12875 "}\n";
12876
12877 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12878 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12879
12880 VkPipelineObj pipe(m_device);
12881 pipe.AddColorAttachment();
12882 pipe.AddShader(&vs);
12883 pipe.AddShader(&fs);
12884
12885 VkDescriptorSetObj descriptorSet(m_device);
12886 descriptorSet.AppendDummy();
12887 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12888
12889 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12890
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012891 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012892}
12893
Karl Schultz6addd812016-02-02 17:17:23 -070012894TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012895 TEST_DESCRIPTION("Test that an error is produced for mismatched array sizes "
12896 "across the VS->FS interface");
Chris Forbes0036fd12016-01-26 14:19:49 +130012897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +130012898 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -070012899 "output arr[2] of float32' vs 'ptr to "
12900 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130012901
12902 ASSERT_NO_FATAL_FAILURE(InitState());
12903 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12904
12905 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012906 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130012907 "\n"
12908 "layout(location=0) out float x[2];\n"
12909 "out gl_PerVertex {\n"
12910 " vec4 gl_Position;\n"
12911 "};\n"
12912 "void main(){\n"
12913 " x[0] = 0; x[1] = 0;\n"
12914 " gl_Position = vec4(1);\n"
12915 "}\n";
12916 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012917 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130012918 "\n"
12919 "layout(location=0) in float x[3];\n"
12920 "layout(location=0) out vec4 color;\n"
12921 "void main(){\n"
12922 " color = vec4(x[0] + x[1] + x[2]);\n"
12923 "}\n";
12924
12925 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12926 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12927
12928 VkPipelineObj pipe(m_device);
12929 pipe.AddColorAttachment();
12930 pipe.AddShader(&vs);
12931 pipe.AddShader(&fs);
12932
12933 VkDescriptorSetObj descriptorSet(m_device);
12934 descriptorSet.AppendDummy();
12935 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12936
12937 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12938
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012939 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130012940}
12941
Karl Schultz6addd812016-02-02 17:17:23 -070012942TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012943 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
12944 "the VS->FS interface");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012946 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012947
Chris Forbesb56af562015-05-25 11:13:17 +120012948 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012949 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120012950
12951 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012952 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012953 "\n"
12954 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012955 "out gl_PerVertex {\n"
12956 " vec4 gl_Position;\n"
12957 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012958 "void main(){\n"
12959 " x = 0;\n"
12960 " gl_Position = vec4(1);\n"
12961 "}\n";
12962 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012963 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012964 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012965 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +120012966 "layout(location=0) out vec4 color;\n"
12967 "void main(){\n"
12968 " color = vec4(x);\n"
12969 "}\n";
12970
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012971 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12972 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120012973
12974 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012975 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120012976 pipe.AddShader(&vs);
12977 pipe.AddShader(&fs);
12978
Chris Forbesb56af562015-05-25 11:13:17 +120012979 VkDescriptorSetObj descriptorSet(m_device);
12980 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012981 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120012982
Tony Barbour5781e8f2015-08-04 16:23:11 -060012983 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120012984
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012985 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120012986}
12987
Karl Schultz6addd812016-02-02 17:17:23 -070012988TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012989 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
12990 "the VS->FS interface, when the variable is contained within "
12991 "an interface block");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012992 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012993 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012994
12995 ASSERT_NO_FATAL_FAILURE(InitState());
12996 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12997
12998 char const *vsSource =
12999 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013000 "\n"
13001 "out block { layout(location=0) int x; } outs;\n"
13002 "out gl_PerVertex {\n"
13003 " vec4 gl_Position;\n"
13004 "};\n"
13005 "void main(){\n"
13006 " outs.x = 0;\n"
13007 " gl_Position = vec4(1);\n"
13008 "}\n";
13009 char const *fsSource =
13010 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013011 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013012 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +130013013 "layout(location=0) out vec4 color;\n"
13014 "void main(){\n"
13015 " color = vec4(ins.x);\n"
13016 "}\n";
13017
13018 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13019 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13020
13021 VkPipelineObj pipe(m_device);
13022 pipe.AddColorAttachment();
13023 pipe.AddShader(&vs);
13024 pipe.AddShader(&fs);
13025
13026 VkDescriptorSetObj descriptorSet(m_device);
13027 descriptorSet.AppendDummy();
13028 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13029
13030 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13031
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013032 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013033}
13034
13035TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013036 TEST_DESCRIPTION("Test that an error is produced for location mismatches across "
13037 "the VS->FS interface; This should manifest as a not-written/not-consumed "
13038 "pair, but flushes out broken walking of the interfaces");
Chris Forbese9928822016-02-17 14:44:52 +130013039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13040 "location 0.0 which is not written by vertex shader");
13041
13042 ASSERT_NO_FATAL_FAILURE(InitState());
13043 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13044
13045 char const *vsSource =
13046 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013047 "\n"
13048 "out block { layout(location=1) float x; } outs;\n"
13049 "out gl_PerVertex {\n"
13050 " vec4 gl_Position;\n"
13051 "};\n"
13052 "void main(){\n"
13053 " outs.x = 0;\n"
13054 " gl_Position = vec4(1);\n"
13055 "}\n";
13056 char const *fsSource =
13057 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013058 "\n"
13059 "in block { layout(location=0) float x; } ins;\n"
13060 "layout(location=0) out vec4 color;\n"
13061 "void main(){\n"
13062 " color = vec4(ins.x);\n"
13063 "}\n";
13064
13065 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13066 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13067
13068 VkPipelineObj pipe(m_device);
13069 pipe.AddColorAttachment();
13070 pipe.AddShader(&vs);
13071 pipe.AddShader(&fs);
13072
13073 VkDescriptorSetObj descriptorSet(m_device);
13074 descriptorSet.AppendDummy();
13075 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13076
13077 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13078
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013079 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013080}
13081
13082TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013083 TEST_DESCRIPTION("Test that an error is produced for component mismatches across the "
13084 "VS->FS interface. It's not enough to have the same set of locations in "
13085 "use; matching is defined in terms of spirv variables.");
Chris Forbese9928822016-02-17 14:44:52 +130013086 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13087 "location 0.1 which is not written by vertex shader");
13088
13089 ASSERT_NO_FATAL_FAILURE(InitState());
13090 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13091
13092 char const *vsSource =
13093 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013094 "\n"
13095 "out block { layout(location=0, component=0) float x; } outs;\n"
13096 "out gl_PerVertex {\n"
13097 " vec4 gl_Position;\n"
13098 "};\n"
13099 "void main(){\n"
13100 " outs.x = 0;\n"
13101 " gl_Position = vec4(1);\n"
13102 "}\n";
13103 char const *fsSource =
13104 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013105 "\n"
13106 "in block { layout(location=0, component=1) float x; } ins;\n"
13107 "layout(location=0) out vec4 color;\n"
13108 "void main(){\n"
13109 " color = vec4(ins.x);\n"
13110 "}\n";
13111
13112 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13113 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13114
13115 VkPipelineObj pipe(m_device);
13116 pipe.AddColorAttachment();
13117 pipe.AddShader(&vs);
13118 pipe.AddShader(&fs);
13119
13120 VkDescriptorSetObj descriptorSet(m_device);
13121 descriptorSet.AppendDummy();
13122 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13123
13124 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13125
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013126 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013127}
13128
Karl Schultz6addd812016-02-02 17:17:23 -070013129TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013130 TEST_DESCRIPTION("Test that a warning is produced for a vertex attribute which is "
13131 "not consumed by the vertex shader");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013133 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013134
Chris Forbesde136e02015-05-25 11:13:28 +120013135 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013136 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120013137
13138 VkVertexInputBindingDescription input_binding;
13139 memset(&input_binding, 0, sizeof(input_binding));
13140
13141 VkVertexInputAttributeDescription input_attrib;
13142 memset(&input_attrib, 0, sizeof(input_attrib));
13143 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13144
13145 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013146 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120013147 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013148 "out gl_PerVertex {\n"
13149 " vec4 gl_Position;\n"
13150 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +120013151 "void main(){\n"
13152 " gl_Position = vec4(1);\n"
13153 "}\n";
13154 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013155 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120013156 "\n"
13157 "layout(location=0) out vec4 color;\n"
13158 "void main(){\n"
13159 " color = vec4(1);\n"
13160 "}\n";
13161
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013162 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13163 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120013164
13165 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013166 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120013167 pipe.AddShader(&vs);
13168 pipe.AddShader(&fs);
13169
13170 pipe.AddVertexInputBindings(&input_binding, 1);
13171 pipe.AddVertexInputAttribs(&input_attrib, 1);
13172
Chris Forbesde136e02015-05-25 11:13:28 +120013173 VkDescriptorSetObj descriptorSet(m_device);
13174 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013175 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120013176
Tony Barbour5781e8f2015-08-04 16:23:11 -060013177 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120013178
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013179 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120013180}
13181
Karl Schultz6addd812016-02-02 17:17:23 -070013182TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013183 TEST_DESCRIPTION("Test that a warning is produced for a location mismatch on "
13184 "vertex attributes. This flushes out bad behavior in the interface walker");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013186 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +130013187
13188 ASSERT_NO_FATAL_FAILURE(InitState());
13189 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13190
13191 VkVertexInputBindingDescription input_binding;
13192 memset(&input_binding, 0, sizeof(input_binding));
13193
13194 VkVertexInputAttributeDescription input_attrib;
13195 memset(&input_attrib, 0, sizeof(input_attrib));
13196 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13197
13198 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013199 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130013200 "\n"
13201 "layout(location=1) in float x;\n"
13202 "out gl_PerVertex {\n"
13203 " vec4 gl_Position;\n"
13204 "};\n"
13205 "void main(){\n"
13206 " gl_Position = vec4(x);\n"
13207 "}\n";
13208 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013209 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130013210 "\n"
13211 "layout(location=0) out vec4 color;\n"
13212 "void main(){\n"
13213 " color = vec4(1);\n"
13214 "}\n";
13215
13216 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13217 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13218
13219 VkPipelineObj pipe(m_device);
13220 pipe.AddColorAttachment();
13221 pipe.AddShader(&vs);
13222 pipe.AddShader(&fs);
13223
13224 pipe.AddVertexInputBindings(&input_binding, 1);
13225 pipe.AddVertexInputAttribs(&input_attrib, 1);
13226
13227 VkDescriptorSetObj descriptorSet(m_device);
13228 descriptorSet.AppendDummy();
13229 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13230
13231 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13232
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013233 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130013234}
13235
Karl Schultz6addd812016-02-02 17:17:23 -070013236TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013237 TEST_DESCRIPTION("Test that an error is produced for a VS input which is not "
13238 "provided by a vertex attribute");
Karl Schultz6addd812016-02-02 17:17:23 -070013239 m_errorMonitor->SetDesiredFailureMsg(
13240 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013241 "VS consumes input at location 0 but not provided");
13242
Chris Forbes62e8e502015-05-25 11:13:29 +120013243 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013244 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120013245
13246 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013247 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120013248 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013249 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -070013250 "out gl_PerVertex {\n"
13251 " vec4 gl_Position;\n"
13252 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120013253 "void main(){\n"
13254 " gl_Position = x;\n"
13255 "}\n";
13256 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013257 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120013258 "\n"
13259 "layout(location=0) out vec4 color;\n"
13260 "void main(){\n"
13261 " color = vec4(1);\n"
13262 "}\n";
13263
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013264 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13265 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120013266
13267 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013268 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120013269 pipe.AddShader(&vs);
13270 pipe.AddShader(&fs);
13271
Chris Forbes62e8e502015-05-25 11:13:29 +120013272 VkDescriptorSetObj descriptorSet(m_device);
13273 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013274 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120013275
Tony Barbour5781e8f2015-08-04 16:23:11 -060013276 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120013277
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013278 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120013279}
13280
Karl Schultz6addd812016-02-02 17:17:23 -070013281TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013282 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the "
13283 "fundamental type (float/int/uint) of an attribute and the "
13284 "VS input that consumes it");
Karl Schultz6addd812016-02-02 17:17:23 -070013285 m_errorMonitor->SetDesiredFailureMsg(
13286 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013287 "location 0 does not match VS input type");
13288
Chris Forbesc97d98e2015-05-25 11:13:31 +120013289 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013290 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013291
13292 VkVertexInputBindingDescription input_binding;
13293 memset(&input_binding, 0, sizeof(input_binding));
13294
13295 VkVertexInputAttributeDescription input_attrib;
13296 memset(&input_attrib, 0, sizeof(input_attrib));
13297 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13298
13299 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013300 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120013301 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013302 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070013303 "out gl_PerVertex {\n"
13304 " vec4 gl_Position;\n"
13305 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120013306 "void main(){\n"
13307 " gl_Position = vec4(x);\n"
13308 "}\n";
13309 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013310 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120013311 "\n"
13312 "layout(location=0) out vec4 color;\n"
13313 "void main(){\n"
13314 " color = vec4(1);\n"
13315 "}\n";
13316
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013317 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13318 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013319
13320 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013321 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013322 pipe.AddShader(&vs);
13323 pipe.AddShader(&fs);
13324
13325 pipe.AddVertexInputBindings(&input_binding, 1);
13326 pipe.AddVertexInputAttribs(&input_attrib, 1);
13327
Chris Forbesc97d98e2015-05-25 11:13:31 +120013328 VkDescriptorSetObj descriptorSet(m_device);
13329 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013330 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013331
Tony Barbour5781e8f2015-08-04 16:23:11 -060013332 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013333
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013334 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013335}
13336
Chris Forbesc68b43c2016-04-06 11:18:47 +120013337TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013338 TEST_DESCRIPTION("Test that an error is produced for a pipeline containing multiple "
13339 "shaders for the same stage");
Chris Forbesc68b43c2016-04-06 11:18:47 +120013340 m_errorMonitor->SetDesiredFailureMsg(
13341 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13342 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
13343
13344 ASSERT_NO_FATAL_FAILURE(InitState());
13345 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13346
13347 char const *vsSource =
13348 "#version 450\n"
13349 "\n"
13350 "out gl_PerVertex {\n"
13351 " vec4 gl_Position;\n"
13352 "};\n"
13353 "void main(){\n"
13354 " gl_Position = vec4(1);\n"
13355 "}\n";
13356 char const *fsSource =
13357 "#version 450\n"
13358 "\n"
13359 "layout(location=0) out vec4 color;\n"
13360 "void main(){\n"
13361 " color = vec4(1);\n"
13362 "}\n";
13363
13364 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13365 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13366
13367 VkPipelineObj pipe(m_device);
13368 pipe.AddColorAttachment();
13369 pipe.AddShader(&vs);
13370 pipe.AddShader(&vs);
13371 pipe.AddShader(&fs);
13372
13373 VkDescriptorSetObj descriptorSet(m_device);
13374 descriptorSet.AppendDummy();
13375 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13376
13377 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13378
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013379 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120013380}
13381
Karl Schultz6addd812016-02-02 17:17:23 -070013382TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013383 TEST_DESCRIPTION("Test that pipeline validation accepts matrices passed "
13384 "as vertex attributes");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013385 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130013386
13387 ASSERT_NO_FATAL_FAILURE(InitState());
13388 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13389
13390 VkVertexInputBindingDescription input_binding;
13391 memset(&input_binding, 0, sizeof(input_binding));
13392
13393 VkVertexInputAttributeDescription input_attribs[2];
13394 memset(input_attribs, 0, sizeof(input_attribs));
13395
13396 for (int i = 0; i < 2; i++) {
13397 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13398 input_attribs[i].location = i;
13399 }
13400
13401 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013402 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013403 "\n"
13404 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070013405 "out gl_PerVertex {\n"
13406 " vec4 gl_Position;\n"
13407 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013408 "void main(){\n"
13409 " gl_Position = x[0] + x[1];\n"
13410 "}\n";
13411 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013412 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013413 "\n"
13414 "layout(location=0) out vec4 color;\n"
13415 "void main(){\n"
13416 " color = vec4(1);\n"
13417 "}\n";
13418
13419 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13420 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13421
13422 VkPipelineObj pipe(m_device);
13423 pipe.AddColorAttachment();
13424 pipe.AddShader(&vs);
13425 pipe.AddShader(&fs);
13426
13427 pipe.AddVertexInputBindings(&input_binding, 1);
13428 pipe.AddVertexInputAttribs(input_attribs, 2);
13429
13430 VkDescriptorSetObj descriptorSet(m_device);
13431 descriptorSet.AppendDummy();
13432 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13433
13434 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13435
13436 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013437 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130013438}
13439
Chris Forbes2682b242015-11-24 11:13:14 +130013440TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
13441{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013442 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130013443
13444 ASSERT_NO_FATAL_FAILURE(InitState());
13445 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13446
13447 VkVertexInputBindingDescription input_binding;
13448 memset(&input_binding, 0, sizeof(input_binding));
13449
13450 VkVertexInputAttributeDescription input_attribs[2];
13451 memset(input_attribs, 0, sizeof(input_attribs));
13452
13453 for (int i = 0; i < 2; i++) {
13454 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13455 input_attribs[i].location = i;
13456 }
13457
13458 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013459 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013460 "\n"
13461 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -070013462 "out gl_PerVertex {\n"
13463 " vec4 gl_Position;\n"
13464 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013465 "void main(){\n"
13466 " gl_Position = x[0] + x[1];\n"
13467 "}\n";
13468 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013469 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013470 "\n"
13471 "layout(location=0) out vec4 color;\n"
13472 "void main(){\n"
13473 " color = vec4(1);\n"
13474 "}\n";
13475
13476 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13477 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13478
13479 VkPipelineObj pipe(m_device);
13480 pipe.AddColorAttachment();
13481 pipe.AddShader(&vs);
13482 pipe.AddShader(&fs);
13483
13484 pipe.AddVertexInputBindings(&input_binding, 1);
13485 pipe.AddVertexInputAttribs(input_attribs, 2);
13486
13487 VkDescriptorSetObj descriptorSet(m_device);
13488 descriptorSet.AppendDummy();
13489 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13490
13491 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13492
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013493 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130013494}
Chris Forbes2682b242015-11-24 11:13:14 +130013495
Chris Forbesbc290ce2016-07-06 12:01:49 +120013496TEST_F(VkLayerTest, CreatePipelineAttribComponents)
13497{
Chris Forbes1cc79542016-07-20 11:13:44 +120013498 TEST_DESCRIPTION("Test that pipeline validation accepts consuming a vertex attribute "
13499 "through multiple VS inputs, each consuming a different subset of the "
13500 "components.");
Chris Forbesbc290ce2016-07-06 12:01:49 +120013501 m_errorMonitor->ExpectSuccess();
13502
13503 ASSERT_NO_FATAL_FAILURE(InitState());
13504 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13505
13506 VkVertexInputBindingDescription input_binding;
13507 memset(&input_binding, 0, sizeof(input_binding));
13508
13509 VkVertexInputAttributeDescription input_attribs[3];
13510 memset(input_attribs, 0, sizeof(input_attribs));
13511
13512 for (int i = 0; i < 3; i++) {
13513 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13514 input_attribs[i].location = i;
13515 }
13516
13517 char const *vsSource =
13518 "#version 450\n"
13519 "\n"
13520 "layout(location=0) in vec4 x;\n"
13521 "layout(location=1) in vec3 y1;\n"
13522 "layout(location=1, component=3) in float y2;\n"
13523 "layout(location=2) in vec4 z;\n"
13524 "out gl_PerVertex {\n"
13525 " vec4 gl_Position;\n"
13526 "};\n"
13527 "void main(){\n"
13528 " gl_Position = x + vec4(y1, y2) + z;\n"
13529 "}\n";
13530 char const *fsSource =
13531 "#version 450\n"
13532 "\n"
13533 "layout(location=0) out vec4 color;\n"
13534 "void main(){\n"
13535 " color = vec4(1);\n"
13536 "}\n";
13537
13538 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13539 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13540
13541 VkPipelineObj pipe(m_device);
13542 pipe.AddColorAttachment();
13543 pipe.AddShader(&vs);
13544 pipe.AddShader(&fs);
13545
13546 pipe.AddVertexInputBindings(&input_binding, 1);
13547 pipe.AddVertexInputAttribs(input_attribs, 3);
13548
13549 VkDescriptorSetObj descriptorSet(m_device);
13550 descriptorSet.AppendDummy();
13551 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13552
13553 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13554
13555 m_errorMonitor->VerifyNotFound();
13556}
13557
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013558TEST_F(VkLayerTest, CreatePipelineSimplePositive)
13559{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013560 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013561
13562 ASSERT_NO_FATAL_FAILURE(InitState());
13563 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13564
13565 char const *vsSource =
13566 "#version 450\n"
13567 "out gl_PerVertex {\n"
13568 " vec4 gl_Position;\n"
13569 "};\n"
13570 "void main(){\n"
13571 " gl_Position = vec4(0);\n"
13572 "}\n";
13573 char const *fsSource =
13574 "#version 450\n"
13575 "\n"
13576 "layout(location=0) out vec4 color;\n"
13577 "void main(){\n"
13578 " color = vec4(1);\n"
13579 "}\n";
13580
13581 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13582 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13583
13584 VkPipelineObj pipe(m_device);
13585 pipe.AddColorAttachment();
13586 pipe.AddShader(&vs);
13587 pipe.AddShader(&fs);
13588
13589 VkDescriptorSetObj descriptorSet(m_device);
13590 descriptorSet.AppendDummy();
13591 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13592
13593 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13594
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013595 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013596}
13597
Chris Forbes912c9192016-04-05 17:50:35 +120013598TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
13599{
Chris Forbes1cc79542016-07-20 11:13:44 +120013600 TEST_DESCRIPTION("Test that pipeline validation accepts the relaxed type matching rules "
13601 "set out in 14.1.3: fundamental type must match, and producer side must "
13602 "have at least as many components");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013603 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +120013604
13605 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
13606
13607 ASSERT_NO_FATAL_FAILURE(InitState());
13608 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13609
13610 char const *vsSource =
13611 "#version 450\n"
13612 "out gl_PerVertex {\n"
13613 " vec4 gl_Position;\n"
13614 "};\n"
13615 "layout(location=0) out vec3 x;\n"
13616 "layout(location=1) out ivec3 y;\n"
13617 "layout(location=2) out vec3 z;\n"
13618 "void main(){\n"
13619 " gl_Position = vec4(0);\n"
13620 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
13621 "}\n";
13622 char const *fsSource =
13623 "#version 450\n"
13624 "\n"
13625 "layout(location=0) out vec4 color;\n"
13626 "layout(location=0) in float x;\n"
13627 "layout(location=1) flat in int y;\n"
13628 "layout(location=2) in vec2 z;\n"
13629 "void main(){\n"
13630 " color = vec4(1 + x + y + z.x);\n"
13631 "}\n";
13632
13633 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13634 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13635
13636 VkPipelineObj pipe(m_device);
13637 pipe.AddColorAttachment();
13638 pipe.AddShader(&vs);
13639 pipe.AddShader(&fs);
13640
13641 VkDescriptorSetObj descriptorSet(m_device);
13642 descriptorSet.AppendDummy();
13643 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13644
Mike Stroyan255e9582016-06-24 09:49:32 -060013645 VkResult err = VK_SUCCESS;
13646 err =
13647 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13648 ASSERT_VK_SUCCESS(err);
13649
Chris Forbes912c9192016-04-05 17:50:35 +120013650
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013651 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +120013652}
13653
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013654TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
13655{
Chris Forbes1cc79542016-07-20 11:13:44 +120013656 TEST_DESCRIPTION("Test that pipeline validation accepts per-vertex variables "
13657 "passed between the TCS and TES stages");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013658 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013659
13660 ASSERT_NO_FATAL_FAILURE(InitState());
13661 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13662
Chris Forbesc1e852d2016-04-04 19:26:42 +120013663 if (!m_device->phy().features().tessellationShader) {
13664 printf("Device does not support tessellation shaders; skipped.\n");
13665 return;
13666 }
13667
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013668 char const *vsSource =
13669 "#version 450\n"
13670 "void main(){}\n";
13671 char const *tcsSource =
13672 "#version 450\n"
13673 "layout(location=0) out int x[];\n"
13674 "layout(vertices=3) out;\n"
13675 "void main(){\n"
13676 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
13677 " gl_TessLevelInner[0] = 1;\n"
13678 " x[gl_InvocationID] = gl_InvocationID;\n"
13679 "}\n";
13680 char const *tesSource =
13681 "#version 450\n"
13682 "layout(triangles, equal_spacing, cw) in;\n"
13683 "layout(location=0) in int x[];\n"
13684 "out gl_PerVertex { vec4 gl_Position; };\n"
13685 "void main(){\n"
13686 " gl_Position.xyz = gl_TessCoord;\n"
13687 " gl_Position.w = x[0] + x[1] + x[2];\n"
13688 "}\n";
13689 char const *fsSource =
13690 "#version 450\n"
13691 "layout(location=0) out vec4 color;\n"
13692 "void main(){\n"
13693 " color = vec4(1);\n"
13694 "}\n";
13695
13696 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13697 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
13698 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
13699 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13700
13701 VkPipelineInputAssemblyStateCreateInfo iasci{
13702 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
13703 nullptr,
13704 0,
13705 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
13706 VK_FALSE};
13707
Chris Forbesb4cacb62016-04-04 19:15:00 +120013708 VkPipelineTessellationStateCreateInfo tsci{
13709 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
13710 nullptr,
13711 0,
13712 3};
13713
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013714 VkPipelineObj pipe(m_device);
13715 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +120013716 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013717 pipe.AddColorAttachment();
13718 pipe.AddShader(&vs);
13719 pipe.AddShader(&tcs);
13720 pipe.AddShader(&tes);
13721 pipe.AddShader(&fs);
13722
13723 VkDescriptorSetObj descriptorSet(m_device);
13724 descriptorSet.AppendDummy();
13725 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13726
13727 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13728
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013729 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013730}
13731
Chris Forbesa0ab8152016-04-20 13:34:27 +120013732TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
13733{
Chris Forbes1cc79542016-07-20 11:13:44 +120013734 TEST_DESCRIPTION("Test that pipeline validation accepts a user-defined "
13735 "interface block passed into the geometry shader. This "
13736 "is interesting because the 'extra' array level is not "
13737 "present on the member type, but on the block instance.");
Chris Forbesa0ab8152016-04-20 13:34:27 +120013738 m_errorMonitor->ExpectSuccess();
13739
13740 ASSERT_NO_FATAL_FAILURE(InitState());
13741 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13742
13743 if (!m_device->phy().features().geometryShader) {
13744 printf("Device does not support geometry shaders; skipped.\n");
13745 return;
13746 }
13747
13748 char const *vsSource =
13749 "#version 450\n"
13750 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
13751 "void main(){\n"
13752 " vs_out.x = vec4(1);\n"
13753 "}\n";
13754 char const *gsSource =
13755 "#version 450\n"
13756 "layout(triangles) in;\n"
13757 "layout(triangle_strip, max_vertices=3) out;\n"
13758 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
13759 "out gl_PerVertex { vec4 gl_Position; };\n"
13760 "void main() {\n"
13761 " gl_Position = gs_in[0].x;\n"
13762 " EmitVertex();\n"
13763 "}\n";
13764 char const *fsSource =
13765 "#version 450\n"
13766 "layout(location=0) out vec4 color;\n"
13767 "void main(){\n"
13768 " color = vec4(1);\n"
13769 "}\n";
13770
13771 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13772 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
13773 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13774
13775 VkPipelineObj pipe(m_device);
13776 pipe.AddColorAttachment();
13777 pipe.AddShader(&vs);
13778 pipe.AddShader(&gs);
13779 pipe.AddShader(&fs);
13780
13781 VkDescriptorSetObj descriptorSet(m_device);
13782 descriptorSet.AppendDummy();
13783 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13784
13785 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13786
13787 m_errorMonitor->VerifyNotFound();
13788}
13789
Chris Forbesa0193bc2016-04-04 19:19:47 +120013790TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
13791{
Chris Forbes1cc79542016-07-20 11:13:44 +120013792 TEST_DESCRIPTION("Test that an error is produced for a variable output from "
13793 "the TCS without the patch decoration, but consumed in the TES "
13794 "with the decoration.");
Chris Forbesa0193bc2016-04-04 19:19:47 +120013795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13796 "is per-vertex in tessellation control shader stage "
13797 "but per-patch in tessellation evaluation shader stage");
13798
13799 ASSERT_NO_FATAL_FAILURE(InitState());
13800 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13801
Chris Forbesc1e852d2016-04-04 19:26:42 +120013802 if (!m_device->phy().features().tessellationShader) {
13803 printf("Device does not support tessellation shaders; skipped.\n");
13804 return;
13805 }
13806
Chris Forbesa0193bc2016-04-04 19:19:47 +120013807 char const *vsSource =
13808 "#version 450\n"
13809 "void main(){}\n";
13810 char const *tcsSource =
13811 "#version 450\n"
13812 "layout(location=0) out int x[];\n"
13813 "layout(vertices=3) out;\n"
13814 "void main(){\n"
13815 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
13816 " gl_TessLevelInner[0] = 1;\n"
13817 " x[gl_InvocationID] = gl_InvocationID;\n"
13818 "}\n";
13819 char const *tesSource =
13820 "#version 450\n"
13821 "layout(triangles, equal_spacing, cw) in;\n"
13822 "layout(location=0) patch in int x;\n"
13823 "out gl_PerVertex { vec4 gl_Position; };\n"
13824 "void main(){\n"
13825 " gl_Position.xyz = gl_TessCoord;\n"
13826 " gl_Position.w = x;\n"
13827 "}\n";
13828 char const *fsSource =
13829 "#version 450\n"
13830 "layout(location=0) out vec4 color;\n"
13831 "void main(){\n"
13832 " color = vec4(1);\n"
13833 "}\n";
13834
13835 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13836 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
13837 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
13838 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13839
13840 VkPipelineInputAssemblyStateCreateInfo iasci{
13841 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
13842 nullptr,
13843 0,
13844 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
13845 VK_FALSE};
13846
13847 VkPipelineTessellationStateCreateInfo tsci{
13848 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
13849 nullptr,
13850 0,
13851 3};
13852
13853 VkPipelineObj pipe(m_device);
13854 pipe.SetInputAssembly(&iasci);
13855 pipe.SetTessellation(&tsci);
13856 pipe.AddColorAttachment();
13857 pipe.AddShader(&vs);
13858 pipe.AddShader(&tcs);
13859 pipe.AddShader(&tes);
13860 pipe.AddShader(&fs);
13861
13862 VkDescriptorSetObj descriptorSet(m_device);
13863 descriptorSet.AppendDummy();
13864 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13865
13866 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13867
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013868 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120013869}
13870
Karl Schultz6addd812016-02-02 17:17:23 -070013871TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013872 TEST_DESCRIPTION("Test that an error is produced for a vertex attribute setup where multiple "
13873 "bindings provide the same location");
Karl Schultz6addd812016-02-02 17:17:23 -070013874 m_errorMonitor->SetDesiredFailureMsg(
13875 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013876 "Duplicate vertex input binding descriptions for binding 0");
13877
Chris Forbes280ba2c2015-06-12 11:16:41 +120013878 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013879 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013880
13881 /* Two binding descriptions for binding 0 */
13882 VkVertexInputBindingDescription input_bindings[2];
13883 memset(input_bindings, 0, sizeof(input_bindings));
13884
13885 VkVertexInputAttributeDescription input_attrib;
13886 memset(&input_attrib, 0, sizeof(input_attrib));
13887 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13888
13889 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013890 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120013891 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013892 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070013893 "out gl_PerVertex {\n"
13894 " vec4 gl_Position;\n"
13895 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120013896 "void main(){\n"
13897 " gl_Position = vec4(x);\n"
13898 "}\n";
13899 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013900 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120013901 "\n"
13902 "layout(location=0) out vec4 color;\n"
13903 "void main(){\n"
13904 " color = vec4(1);\n"
13905 "}\n";
13906
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013907 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13908 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013909
13910 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013911 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013912 pipe.AddShader(&vs);
13913 pipe.AddShader(&fs);
13914
13915 pipe.AddVertexInputBindings(input_bindings, 2);
13916 pipe.AddVertexInputAttribs(&input_attrib, 1);
13917
Chris Forbes280ba2c2015-06-12 11:16:41 +120013918 VkDescriptorSetObj descriptorSet(m_device);
13919 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013920 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013921
Tony Barbour5781e8f2015-08-04 16:23:11 -060013922 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013923
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013924 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013925}
Chris Forbes8f68b562015-05-25 11:13:32 +120013926
Chris Forbes35efec72016-04-21 14:32:08 +120013927TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013928 TEST_DESCRIPTION("Test that pipeline validation accepts basic use of 64bit vertex "
13929 "attributes. This is interesting because they consume multiple "
13930 "locations.");
Chris Forbes35efec72016-04-21 14:32:08 +120013931 m_errorMonitor->ExpectSuccess();
13932
13933 ASSERT_NO_FATAL_FAILURE(InitState());
13934 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13935
Chris Forbes91cf3a82016-06-28 17:51:35 +120013936 if (!m_device->phy().features().shaderFloat64) {
Chris Forbes35efec72016-04-21 14:32:08 +120013937 printf("Device does not support 64bit vertex attributes; skipped.\n");
13938 return;
13939 }
13940
13941 VkVertexInputBindingDescription input_bindings[1];
13942 memset(input_bindings, 0, sizeof(input_bindings));
13943
13944 VkVertexInputAttributeDescription input_attribs[4];
13945 memset(input_attribs, 0, sizeof(input_attribs));
13946 input_attribs[0].location = 0;
13947 input_attribs[0].offset = 0;
13948 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13949 input_attribs[1].location = 2;
13950 input_attribs[1].offset = 32;
13951 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13952 input_attribs[2].location = 4;
13953 input_attribs[2].offset = 64;
13954 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13955 input_attribs[3].location = 6;
13956 input_attribs[3].offset = 96;
13957 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13958
13959 char const *vsSource =
13960 "#version 450\n"
13961 "\n"
13962 "layout(location=0) in dmat4 x;\n"
13963 "out gl_PerVertex {\n"
13964 " vec4 gl_Position;\n"
13965 "};\n"
13966 "void main(){\n"
13967 " gl_Position = vec4(x[0][0]);\n"
13968 "}\n";
13969 char const *fsSource =
13970 "#version 450\n"
13971 "\n"
13972 "layout(location=0) out vec4 color;\n"
13973 "void main(){\n"
13974 " color = vec4(1);\n"
13975 "}\n";
13976
13977 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13978 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13979
13980 VkPipelineObj pipe(m_device);
13981 pipe.AddColorAttachment();
13982 pipe.AddShader(&vs);
13983 pipe.AddShader(&fs);
13984
13985 pipe.AddVertexInputBindings(input_bindings, 1);
13986 pipe.AddVertexInputAttribs(input_attribs, 4);
13987
13988 VkDescriptorSetObj descriptorSet(m_device);
13989 descriptorSet.AppendDummy();
13990 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13991
13992 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13993
13994 m_errorMonitor->VerifyNotFound();
13995}
13996
Karl Schultz6addd812016-02-02 17:17:23 -070013997TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013998 TEST_DESCRIPTION("Test that an error is produced for a FS which does not "
13999 "provide an output for one of the pipeline's color attachments");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014001 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014002
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014003 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014004
14005 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014006 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014007 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014008 "out gl_PerVertex {\n"
14009 " vec4 gl_Position;\n"
14010 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014011 "void main(){\n"
14012 " gl_Position = vec4(1);\n"
14013 "}\n";
14014 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014015 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014016 "\n"
14017 "void main(){\n"
14018 "}\n";
14019
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014020 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14021 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014022
14023 VkPipelineObj pipe(m_device);
14024 pipe.AddShader(&vs);
14025 pipe.AddShader(&fs);
14026
Chia-I Wu08accc62015-07-07 11:50:03 +080014027 /* set up CB 0, not written */
14028 pipe.AddColorAttachment();
14029 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014030
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014031 VkDescriptorSetObj descriptorSet(m_device);
14032 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014033 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014034
Tony Barbour5781e8f2015-08-04 16:23:11 -060014035 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014036
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014037 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014038}
14039
Karl Schultz6addd812016-02-02 17:17:23 -070014040TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014041 TEST_DESCRIPTION("Test that a warning is produced for a FS which provides a spurious "
14042 "output with no matching attachment");
Karl Schultz6addd812016-02-02 17:17:23 -070014043 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070014044 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014045 "FS writes to output location 1 with no matching attachment");
14046
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014047 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014048
14049 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014050 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014051 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014052 "out gl_PerVertex {\n"
14053 " vec4 gl_Position;\n"
14054 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014055 "void main(){\n"
14056 " gl_Position = vec4(1);\n"
14057 "}\n";
14058 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014059 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014060 "\n"
14061 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -070014062 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014063 "void main(){\n"
14064 " x = vec4(1);\n"
14065 " y = vec4(1);\n"
14066 "}\n";
14067
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014068 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14069 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014070
14071 VkPipelineObj pipe(m_device);
14072 pipe.AddShader(&vs);
14073 pipe.AddShader(&fs);
14074
Chia-I Wu08accc62015-07-07 11:50:03 +080014075 /* set up CB 0, not written */
14076 pipe.AddColorAttachment();
14077 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014078 /* FS writes CB 1, but we don't configure it */
14079
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014080 VkDescriptorSetObj descriptorSet(m_device);
14081 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014082 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014083
Tony Barbour5781e8f2015-08-04 16:23:11 -060014084 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014085
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014086 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014087}
14088
Karl Schultz6addd812016-02-02 17:17:23 -070014089TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014090 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the fundamental "
14091 "type of an FS output variable, and the format of the corresponding attachment");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014093 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014094
Chris Forbesa36d69e2015-05-25 11:13:44 +120014095 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014096
14097 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014098 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120014099 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014100 "out gl_PerVertex {\n"
14101 " vec4 gl_Position;\n"
14102 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120014103 "void main(){\n"
14104 " gl_Position = vec4(1);\n"
14105 "}\n";
14106 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014107 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120014108 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070014109 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +120014110 "void main(){\n"
14111 " x = ivec4(1);\n"
14112 "}\n";
14113
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014114 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14115 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014116
14117 VkPipelineObj pipe(m_device);
14118 pipe.AddShader(&vs);
14119 pipe.AddShader(&fs);
14120
Chia-I Wu08accc62015-07-07 11:50:03 +080014121 /* set up CB 0; type is UNORM by default */
14122 pipe.AddColorAttachment();
14123 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014124
Chris Forbesa36d69e2015-05-25 11:13:44 +120014125 VkDescriptorSetObj descriptorSet(m_device);
14126 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014127 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014128
Tony Barbour5781e8f2015-08-04 16:23:11 -060014129 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014130
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014131 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014132}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014133
Karl Schultz6addd812016-02-02 17:17:23 -070014134TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014135 TEST_DESCRIPTION("Test that an error is produced for a shader consuming a uniform "
14136 "block which has no corresponding binding in the pipeline layout");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014137 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014138 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014139
Chris Forbes556c76c2015-08-14 12:04:59 +120014140 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120014141
14142 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014143 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120014144 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014145 "out gl_PerVertex {\n"
14146 " vec4 gl_Position;\n"
14147 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120014148 "void main(){\n"
14149 " gl_Position = vec4(1);\n"
14150 "}\n";
14151 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014152 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120014153 "\n"
14154 "layout(location=0) out vec4 x;\n"
14155 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
14156 "void main(){\n"
14157 " x = vec4(bar.y);\n"
14158 "}\n";
14159
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014160 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14161 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120014162
Chris Forbes556c76c2015-08-14 12:04:59 +120014163 VkPipelineObj pipe(m_device);
14164 pipe.AddShader(&vs);
14165 pipe.AddShader(&fs);
14166
14167 /* set up CB 0; type is UNORM by default */
14168 pipe.AddColorAttachment();
14169 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14170
14171 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014172 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120014173
14174 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14175
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014176 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120014177}
14178
Chris Forbes5c59e902016-02-26 16:56:09 +130014179TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014180 TEST_DESCRIPTION("Test that an error is produced for a shader consuming push constants "
14181 "which are not provided in the pipeline layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130014182 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14183 "not declared in layout");
14184
14185 ASSERT_NO_FATAL_FAILURE(InitState());
14186
14187 char const *vsSource =
14188 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130014189 "\n"
14190 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14191 "out gl_PerVertex {\n"
14192 " vec4 gl_Position;\n"
14193 "};\n"
14194 "void main(){\n"
14195 " gl_Position = vec4(consts.x);\n"
14196 "}\n";
14197 char const *fsSource =
14198 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130014199 "\n"
14200 "layout(location=0) out vec4 x;\n"
14201 "void main(){\n"
14202 " x = vec4(1);\n"
14203 "}\n";
14204
14205 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14206 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14207
14208 VkPipelineObj pipe(m_device);
14209 pipe.AddShader(&vs);
14210 pipe.AddShader(&fs);
14211
14212 /* set up CB 0; type is UNORM by default */
14213 pipe.AddColorAttachment();
14214 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14215
14216 VkDescriptorSetObj descriptorSet(m_device);
14217 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14218
14219 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14220
14221 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014222 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130014223}
14224
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014225TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014226 TEST_DESCRIPTION("Test that an error is produced for a compute pipeline consuming a "
14227 "descriptor which is not provided in the pipeline layout");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014228 m_errorMonitor->SetDesiredFailureMsg(
14229 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14230 "Shader uses descriptor slot 0.0");
14231
14232 ASSERT_NO_FATAL_FAILURE(InitState());
14233
14234 char const *csSource =
14235 "#version 450\n"
14236 "\n"
14237 "layout(local_size_x=1) in;\n"
14238 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14239 "void main(){\n"
14240 " x = vec4(1);\n"
14241 "}\n";
14242
14243 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14244
14245 VkDescriptorSetObj descriptorSet(m_device);
14246 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14247
14248 VkComputePipelineCreateInfo cpci = {
14249 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14250 nullptr, 0, {
14251 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14252 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14253 cs.handle(), "main", nullptr
14254 },
14255 descriptorSet.GetPipelineLayout(),
14256 VK_NULL_HANDLE, -1
14257 };
14258
14259 VkPipeline pipe;
14260 VkResult err = vkCreateComputePipelines(
14261 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14262
14263 m_errorMonitor->VerifyFound();
14264
14265 if (err == VK_SUCCESS) {
14266 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14267 }
14268}
14269
14270TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014271 TEST_DESCRIPTION("Test that pipeline validation accepts a compute pipeline which declares a "
14272 "descriptor-backed resource which is not provided, but the shader does not "
14273 "statically use it. This is interesting because it requires compute pipelines "
14274 "to have a proper descriptor use walk, which they didn't for some time.");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014275 m_errorMonitor->ExpectSuccess();
14276
14277 ASSERT_NO_FATAL_FAILURE(InitState());
14278
14279 char const *csSource =
14280 "#version 450\n"
14281 "\n"
14282 "layout(local_size_x=1) in;\n"
14283 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14284 "void main(){\n"
14285 " // x is not used.\n"
14286 "}\n";
14287
14288 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14289
14290 VkDescriptorSetObj descriptorSet(m_device);
14291 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14292
14293 VkComputePipelineCreateInfo cpci = {
14294 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14295 nullptr, 0, {
14296 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14297 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14298 cs.handle(), "main", nullptr
14299 },
14300 descriptorSet.GetPipelineLayout(),
14301 VK_NULL_HANDLE, -1
14302 };
14303
14304 VkPipeline pipe;
14305 VkResult err = vkCreateComputePipelines(
14306 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14307
14308 m_errorMonitor->VerifyNotFound();
14309
14310 if (err == VK_SUCCESS) {
14311 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14312 }
14313}
14314
Chris Forbes22a9b092016-07-19 14:34:05 +120014315TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014316 TEST_DESCRIPTION("Test that an error is produced for a pipeline consuming a "
14317 "descriptor-backed resource of a mismatched type");
Chris Forbes22a9b092016-07-19 14:34:05 +120014318 m_errorMonitor->SetDesiredFailureMsg(
14319 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14320 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
14321
14322 ASSERT_NO_FATAL_FAILURE(InitState());
14323
14324 VkDescriptorSetLayoutBinding binding = {
14325 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14326 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14327 };
14328 VkDescriptorSetLayoutCreateInfo dslci = {
14329 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14330 0, 1, &binding
14331 };
14332 VkDescriptorSetLayout dsl;
14333 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14334 nullptr, &dsl);
14335 ASSERT_VK_SUCCESS(err);
14336
14337 VkPipelineLayoutCreateInfo plci = {
14338 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14339 0, 1, &dsl, 0, nullptr
14340 };
14341 VkPipelineLayout pl;
14342 err = vkCreatePipelineLayout(m_device->device(), &plci,
14343 nullptr, &pl);
14344 ASSERT_VK_SUCCESS(err);
14345
14346 char const *csSource =
14347 "#version 450\n"
14348 "\n"
14349 "layout(local_size_x=1) in;\n"
14350 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14351 "void main() {\n"
14352 " x.x = 1.0f;\n"
14353 "}\n";
14354 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14355
14356 VkComputePipelineCreateInfo cpci = {
14357 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14358 0, {
14359 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14360 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14361 cs.handle(), "main", nullptr
14362 },
14363 pl, VK_NULL_HANDLE, -1
14364 };
14365
14366 VkPipeline pipe;
14367 err = vkCreateComputePipelines(
14368 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14369
14370 m_errorMonitor->VerifyFound();
14371
14372 if (err == VK_SUCCESS) {
14373 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14374 }
14375
14376 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14377 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14378}
14379
Chris Forbese10a51f2016-07-19 14:42:51 +120014380TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014381 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
14382 "sampler portion of a combined image + sampler");
Chris Forbese10a51f2016-07-19 14:42:51 +120014383 m_errorMonitor->ExpectSuccess();
14384
14385 ASSERT_NO_FATAL_FAILURE(InitState());
14386
14387 VkDescriptorSetLayoutBinding bindings[] = {
14388 {
14389 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14390 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14391 },
14392 {
14393 1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
14394 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14395 },
14396 {
14397 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
14398 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14399 },
14400 };
14401 VkDescriptorSetLayoutCreateInfo dslci = {
14402 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14403 0, 3, bindings
14404 };
14405 VkDescriptorSetLayout dsl;
14406 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14407 nullptr, &dsl);
14408 ASSERT_VK_SUCCESS(err);
14409
14410 VkPipelineLayoutCreateInfo plci = {
14411 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14412 0, 1, &dsl, 0, nullptr
14413 };
14414 VkPipelineLayout pl;
14415 err = vkCreatePipelineLayout(m_device->device(), &plci,
14416 nullptr, &pl);
14417 ASSERT_VK_SUCCESS(err);
14418
14419 char const *csSource =
14420 "#version 450\n"
14421 "\n"
14422 "layout(local_size_x=1) in;\n"
14423 "layout(set=0, binding=0) uniform sampler s;\n"
14424 "layout(set=0, binding=1) uniform texture2D t;\n"
14425 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
14426 "void main() {\n"
14427 " x = texture(sampler2D(t, s), vec2(0));\n"
14428 "}\n";
14429 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14430
14431 VkComputePipelineCreateInfo cpci = {
14432 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14433 0, {
14434 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14435 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14436 cs.handle(), "main", nullptr
14437 },
14438 pl, VK_NULL_HANDLE, -1
14439 };
14440
14441 VkPipeline pipe;
14442 err = vkCreateComputePipelines(
14443 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14444
14445 m_errorMonitor->VerifyNotFound();
14446
14447 if (err == VK_SUCCESS) {
14448 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14449 }
14450
14451 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14452 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14453}
14454
Chris Forbes91c3b2a2016-07-19 14:46:38 +120014455TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014456 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
14457 "image portion of a combined image + sampler");
Chris Forbes91c3b2a2016-07-19 14:46:38 +120014458 m_errorMonitor->ExpectSuccess();
14459
14460 ASSERT_NO_FATAL_FAILURE(InitState());
14461
14462 VkDescriptorSetLayoutBinding bindings[] = {
14463 {
14464 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14465 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14466 },
14467 {
14468 1, VK_DESCRIPTOR_TYPE_SAMPLER,
14469 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14470 },
14471 {
14472 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
14473 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14474 },
14475 };
14476 VkDescriptorSetLayoutCreateInfo dslci = {
14477 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14478 0, 3, bindings
14479 };
14480 VkDescriptorSetLayout dsl;
14481 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14482 nullptr, &dsl);
14483 ASSERT_VK_SUCCESS(err);
14484
14485 VkPipelineLayoutCreateInfo plci = {
14486 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14487 0, 1, &dsl, 0, nullptr
14488 };
14489 VkPipelineLayout pl;
14490 err = vkCreatePipelineLayout(m_device->device(), &plci,
14491 nullptr, &pl);
14492 ASSERT_VK_SUCCESS(err);
14493
14494 char const *csSource =
14495 "#version 450\n"
14496 "\n"
14497 "layout(local_size_x=1) in;\n"
14498 "layout(set=0, binding=0) uniform texture2D t;\n"
14499 "layout(set=0, binding=1) uniform sampler s;\n"
14500 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
14501 "void main() {\n"
14502 " x = texture(sampler2D(t, s), vec2(0));\n"
14503 "}\n";
14504 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14505
14506 VkComputePipelineCreateInfo cpci = {
14507 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14508 0, {
14509 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14510 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14511 cs.handle(), "main", nullptr
14512 },
14513 pl, VK_NULL_HANDLE, -1
14514 };
14515
14516 VkPipeline pipe;
14517 err = vkCreateComputePipelines(
14518 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14519
14520 m_errorMonitor->VerifyNotFound();
14521
14522 if (err == VK_SUCCESS) {
14523 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14524 }
14525
14526 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14527 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14528}
14529
Chris Forbes6a4991a2016-07-19 15:07:32 +120014530TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014531 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming "
14532 "both the sampler and the image of a combined image+sampler "
14533 "but via separate variables");
Chris Forbes6a4991a2016-07-19 15:07:32 +120014534 m_errorMonitor->ExpectSuccess();
14535
14536 ASSERT_NO_FATAL_FAILURE(InitState());
14537
14538 VkDescriptorSetLayoutBinding bindings[] = {
14539 {
14540 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14541 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14542 },
14543 {
14544 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
14545 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14546 },
14547 };
14548 VkDescriptorSetLayoutCreateInfo dslci = {
14549 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14550 0, 2, bindings
14551 };
14552 VkDescriptorSetLayout dsl;
14553 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14554 nullptr, &dsl);
14555 ASSERT_VK_SUCCESS(err);
14556
14557 VkPipelineLayoutCreateInfo plci = {
14558 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14559 0, 1, &dsl, 0, nullptr
14560 };
14561 VkPipelineLayout pl;
14562 err = vkCreatePipelineLayout(m_device->device(), &plci,
14563 nullptr, &pl);
14564 ASSERT_VK_SUCCESS(err);
14565
14566 char const *csSource =
14567 "#version 450\n"
14568 "\n"
14569 "layout(local_size_x=1) in;\n"
14570 "layout(set=0, binding=0) uniform texture2D t;\n"
14571 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
14572 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
14573 "void main() {\n"
14574 " x = texture(sampler2D(t, s), vec2(0));\n"
14575 "}\n";
14576 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14577
14578 VkComputePipelineCreateInfo cpci = {
14579 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14580 0, {
14581 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14582 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14583 cs.handle(), "main", nullptr
14584 },
14585 pl, VK_NULL_HANDLE, -1
14586 };
14587
14588 VkPipeline pipe;
14589 err = vkCreateComputePipelines(
14590 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14591
14592 m_errorMonitor->VerifyNotFound();
14593
14594 if (err == VK_SUCCESS) {
14595 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14596 }
14597
14598 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14599 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14600}
14601
Chris Forbes50020592016-07-27 13:52:41 +120014602TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
14603 TEST_DESCRIPTION("Test that an error is produced when an image view type "
14604 "does not match the dimensionality declared in the shader");
14605
14606 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14607 "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
14608
14609 ASSERT_NO_FATAL_FAILURE(InitState());
14610 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14611
14612 char const *vsSource =
14613 "#version 450\n"
14614 "\n"
14615 "out gl_PerVertex { vec4 gl_Position; };\n"
14616 "void main() { gl_Position = vec4(0); }\n";
14617 char const *fsSource =
14618 "#version 450\n"
14619 "\n"
14620 "layout(set=0, binding=0) uniform sampler3D s;\n"
14621 "layout(location=0) out vec4 color;\n"
14622 "void main() {\n"
14623 " color = texture(s, vec3(0));\n"
14624 "}\n";
14625 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14626 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14627
14628 VkPipelineObj pipe(m_device);
14629 pipe.AddShader(&vs);
14630 pipe.AddShader(&fs);
14631 pipe.AddColorAttachment();
14632
14633 VkTextureObj texture(m_device, nullptr);
14634 VkSamplerObj sampler(m_device);
14635
14636 VkDescriptorSetObj descriptorSet(m_device);
14637 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14638 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14639
14640 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14641 ASSERT_VK_SUCCESS(err);
14642
14643 BeginCommandBuffer();
14644
14645 m_commandBuffer->BindPipeline(pipe);
14646 m_commandBuffer->BindDescriptorSet(descriptorSet);
14647
14648 VkViewport viewport = { 0, 0, 16, 16, 0, 1 };
14649 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
14650 VkRect2D scissor = { { 0, 0 }, { 16, 16 } };
14651 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14652
14653 // error produced here.
14654 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
14655
14656 m_errorMonitor->VerifyFound();
14657
14658 EndCommandBuffer();
14659}
14660
Chris Forbes5533bfc2016-07-27 14:12:34 +120014661TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
14662 TEST_DESCRIPTION("Test that an error is produced when a multisampled images "
14663 "are consumed via singlesample images types in the shader, or vice versa.");
14664
14665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14666 "requires bound image to have multiple samples");
14667
14668 ASSERT_NO_FATAL_FAILURE(InitState());
14669 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14670
14671 char const *vsSource =
14672 "#version 450\n"
14673 "\n"
14674 "out gl_PerVertex { vec4 gl_Position; };\n"
14675 "void main() { gl_Position = vec4(0); }\n";
14676 char const *fsSource =
14677 "#version 450\n"
14678 "\n"
14679 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
14680 "layout(location=0) out vec4 color;\n"
14681 "void main() {\n"
14682 " color = texelFetch(s, ivec2(0), 0);\n"
14683 "}\n";
14684 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14685 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14686
14687 VkPipelineObj pipe(m_device);
14688 pipe.AddShader(&vs);
14689 pipe.AddShader(&fs);
14690 pipe.AddColorAttachment();
14691
14692 VkTextureObj texture(m_device, nullptr);
14693 VkSamplerObj sampler(m_device);
14694
14695 VkDescriptorSetObj descriptorSet(m_device);
14696 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14697 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14698
14699 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14700 ASSERT_VK_SUCCESS(err);
14701
14702 BeginCommandBuffer();
14703
14704 m_commandBuffer->BindPipeline(pipe);
14705 m_commandBuffer->BindDescriptorSet(descriptorSet);
14706
14707 VkViewport viewport = { 0, 0, 16, 16, 0, 1 };
14708 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
14709 VkRect2D scissor = { { 0, 0 }, { 16, 16 } };
14710 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14711
14712 // error produced here.
14713 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
14714
14715 m_errorMonitor->VerifyFound();
14716
14717 EndCommandBuffer();
14718}
14719
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014720#endif // SHADER_CHECKER_TESTS
14721
14722#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060014723TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -070014724 m_errorMonitor->SetDesiredFailureMsg(
14725 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014726 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014727
14728 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014729
14730 // Create an image
14731 VkImage image;
14732
Karl Schultz6addd812016-02-02 17:17:23 -070014733 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14734 const int32_t tex_width = 32;
14735 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014736
14737 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014738 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14739 image_create_info.pNext = NULL;
14740 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14741 image_create_info.format = tex_format;
14742 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014743 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070014744 image_create_info.extent.depth = 1;
14745 image_create_info.mipLevels = 1;
14746 image_create_info.arrayLayers = 1;
14747 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14748 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14749 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14750 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014751
14752 // Introduce error by sending down a bogus width extent
14753 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014754 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014755
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014756 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014757}
14758
Mark Youngc48c4c12016-04-11 14:26:49 -060014759TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
14760 m_errorMonitor->SetDesiredFailureMsg(
14761 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14762 "CreateImage extents is 0 for at least one required dimension");
14763
14764 ASSERT_NO_FATAL_FAILURE(InitState());
14765
14766 // Create an image
14767 VkImage image;
14768
14769 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14770 const int32_t tex_width = 32;
14771 const int32_t tex_height = 32;
14772
14773 VkImageCreateInfo image_create_info = {};
14774 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14775 image_create_info.pNext = NULL;
14776 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14777 image_create_info.format = tex_format;
14778 image_create_info.extent.width = tex_width;
14779 image_create_info.extent.height = tex_height;
14780 image_create_info.extent.depth = 1;
14781 image_create_info.mipLevels = 1;
14782 image_create_info.arrayLayers = 1;
14783 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14784 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14785 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14786 image_create_info.flags = 0;
14787
14788 // Introduce error by sending down a bogus width extent
14789 image_create_info.extent.width = 0;
14790 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14791
14792 m_errorMonitor->VerifyFound();
14793}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014794#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120014795
Tobin Ehliscde08892015-09-22 10:11:37 -060014796#if IMAGE_TESTS
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060014797TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
14798 TEST_DESCRIPTION("Create a render pass with an attachment description "
14799 "format set to VK_FORMAT_UNDEFINED");
14800
14801 ASSERT_NO_FATAL_FAILURE(InitState());
14802 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14803
14804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14805 "format is VK_FORMAT_UNDEFINED");
14806
14807 VkAttachmentReference color_attach = {};
14808 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
14809 color_attach.attachment = 0;
14810 VkSubpassDescription subpass = {};
14811 subpass.colorAttachmentCount = 1;
14812 subpass.pColorAttachments = &color_attach;
14813
14814 VkRenderPassCreateInfo rpci = {};
14815 rpci.subpassCount = 1;
14816 rpci.pSubpasses = &subpass;
14817 rpci.attachmentCount = 1;
14818 VkAttachmentDescription attach_desc = {};
14819 attach_desc.format = VK_FORMAT_UNDEFINED;
14820 rpci.pAttachments = &attach_desc;
14821 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
14822 VkRenderPass rp;
14823 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
14824
14825 m_errorMonitor->VerifyFound();
14826
14827 if (result == VK_SUCCESS) {
14828 vkDestroyRenderPass(m_device->device(), rp, NULL);
14829 }
14830}
14831
Karl Schultz6addd812016-02-02 17:17:23 -070014832TEST_F(VkLayerTest, InvalidImageView) {
14833 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060014834
Karl Schultz6addd812016-02-02 17:17:23 -070014835 m_errorMonitor->SetDesiredFailureMsg(
14836 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014837 "vkCreateImageView called with baseMipLevel 10 ");
14838
Tobin Ehliscde08892015-09-22 10:11:37 -060014839 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060014840
Mike Stroyana3082432015-09-25 13:39:21 -060014841 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070014842 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060014843
Karl Schultz6addd812016-02-02 17:17:23 -070014844 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14845 const int32_t tex_width = 32;
14846 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060014847
14848 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014849 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14850 image_create_info.pNext = NULL;
14851 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14852 image_create_info.format = tex_format;
14853 image_create_info.extent.width = tex_width;
14854 image_create_info.extent.height = tex_height;
14855 image_create_info.extent.depth = 1;
14856 image_create_info.mipLevels = 1;
14857 image_create_info.arrayLayers = 1;
14858 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14859 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14860 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14861 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060014862
Chia-I Wuf7458c52015-10-26 21:10:41 +080014863 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060014864 ASSERT_VK_SUCCESS(err);
14865
14866 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014867 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14868 image_view_create_info.image = image;
14869 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14870 image_view_create_info.format = tex_format;
14871 image_view_create_info.subresourceRange.layerCount = 1;
14872 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
14873 image_view_create_info.subresourceRange.levelCount = 1;
14874 image_view_create_info.subresourceRange.aspectMask =
14875 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060014876
14877 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070014878 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
14879 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060014880
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014881 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060014882 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060014883}
Mike Stroyana3082432015-09-25 13:39:21 -060014884
Mark Youngd339ba32016-05-30 13:28:35 -060014885TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
14886 VkResult err;
14887
14888 m_errorMonitor->SetDesiredFailureMsg(
14889 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -060014890 "used without first calling vkBindImageMemory");
Mark Youngd339ba32016-05-30 13:28:35 -060014891
14892 ASSERT_NO_FATAL_FAILURE(InitState());
14893
14894 // Create an image and try to create a view with no memory backing the image
14895 VkImage image;
14896
14897 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14898 const int32_t tex_width = 32;
14899 const int32_t tex_height = 32;
14900
14901 VkImageCreateInfo image_create_info = {};
14902 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14903 image_create_info.pNext = NULL;
14904 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14905 image_create_info.format = tex_format;
14906 image_create_info.extent.width = tex_width;
14907 image_create_info.extent.height = tex_height;
14908 image_create_info.extent.depth = 1;
14909 image_create_info.mipLevels = 1;
14910 image_create_info.arrayLayers = 1;
14911 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14912 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14913 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14914 image_create_info.flags = 0;
14915
14916 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14917 ASSERT_VK_SUCCESS(err);
14918
14919 VkImageViewCreateInfo image_view_create_info = {};
14920 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14921 image_view_create_info.image = image;
14922 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14923 image_view_create_info.format = tex_format;
14924 image_view_create_info.subresourceRange.layerCount = 1;
14925 image_view_create_info.subresourceRange.baseMipLevel = 0;
14926 image_view_create_info.subresourceRange.levelCount = 1;
14927 image_view_create_info.subresourceRange.aspectMask =
14928 VK_IMAGE_ASPECT_COLOR_BIT;
14929
14930 VkImageView view;
14931 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
14932 &view);
14933
14934 m_errorMonitor->VerifyFound();
14935 vkDestroyImage(m_device->device(), image, NULL);
14936 // If last error is success, it still created the view, so delete it.
14937 if (err == VK_SUCCESS) {
14938 vkDestroyImageView(m_device->device(), view, NULL);
14939 }
14940
14941}
14942
Karl Schultz6addd812016-02-02 17:17:23 -070014943TEST_F(VkLayerTest, InvalidImageViewAspect) {
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014944 TEST_DESCRIPTION(
14945 "Create an image and try to create a view with an invalid aspectMask");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014947 "vkCreateImageView: Color image "
14948 "formats must have ONLY the "
14949 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014950
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014951 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014952
Karl Schultz6addd812016-02-02 17:17:23 -070014953 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014954 VkImageObj image(m_device);
14955 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT,
14956 VK_IMAGE_TILING_LINEAR, 0);
14957 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014958
14959 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014960 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014961 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070014962 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14963 image_view_create_info.format = tex_format;
14964 image_view_create_info.subresourceRange.baseMipLevel = 0;
14965 image_view_create_info.subresourceRange.levelCount = 1;
14966 // Cause an error by setting an invalid image aspect
14967 image_view_create_info.subresourceRange.aspectMask =
14968 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014969
14970 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014971 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014972
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014973 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014974}
14975
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014976TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070014977 VkResult err;
14978 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014979
Karl Schultz6addd812016-02-02 17:17:23 -070014980 m_errorMonitor->SetDesiredFailureMsg(
14981 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014982 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014983
Mike Stroyana3082432015-09-25 13:39:21 -060014984 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014985
14986 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014987 VkImage srcImage;
14988 VkImage dstImage;
14989 VkDeviceMemory srcMem;
14990 VkDeviceMemory destMem;
14991 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014992
14993 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014994 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14995 image_create_info.pNext = NULL;
14996 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14997 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14998 image_create_info.extent.width = 32;
14999 image_create_info.extent.height = 32;
15000 image_create_info.extent.depth = 1;
15001 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015002 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015003 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15004 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15005 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15006 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015007
Karl Schultz6addd812016-02-02 17:17:23 -070015008 err =
15009 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015010 ASSERT_VK_SUCCESS(err);
15011
Karl Schultz6addd812016-02-02 17:17:23 -070015012 err =
15013 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015014 ASSERT_VK_SUCCESS(err);
15015
15016 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015017 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015018 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15019 memAlloc.pNext = NULL;
15020 memAlloc.allocationSize = 0;
15021 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015022
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015023 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015024 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015025 pass =
15026 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015027 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015028 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015029 ASSERT_VK_SUCCESS(err);
15030
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015031 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015032 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015033 pass =
15034 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015035 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015036 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015037 ASSERT_VK_SUCCESS(err);
15038
15039 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15040 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015041 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015042 ASSERT_VK_SUCCESS(err);
15043
15044 BeginCommandBuffer();
15045 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015046 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015047 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015048 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015049 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015050 copyRegion.srcOffset.x = 0;
15051 copyRegion.srcOffset.y = 0;
15052 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015053 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015054 copyRegion.dstSubresource.mipLevel = 0;
15055 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015056 // Introduce failure by forcing the dst layerCount to differ from src
15057 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015058 copyRegion.dstOffset.x = 0;
15059 copyRegion.dstOffset.y = 0;
15060 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015061 copyRegion.extent.width = 1;
15062 copyRegion.extent.height = 1;
15063 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015064 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15065 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015066 EndCommandBuffer();
15067
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015068 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015069
Chia-I Wuf7458c52015-10-26 21:10:41 +080015070 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015071 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015072 vkFreeMemory(m_device->device(), srcMem, NULL);
15073 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015074}
15075
Tony Barbourd6673642016-05-05 14:46:39 -060015076TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
15077
15078 TEST_DESCRIPTION("Creating images with unsuported formats ");
15079
15080 ASSERT_NO_FATAL_FAILURE(InitState());
15081 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15082 VkImageObj image(m_device);
15083 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
15084 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
15085 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15086 VK_IMAGE_TILING_OPTIMAL, 0);
15087 ASSERT_TRUE(image.initialized());
15088
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015089 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
15090 VkImageCreateInfo image_create_info;
15091 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15092 image_create_info.pNext = NULL;
15093 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15094 image_create_info.format = VK_FORMAT_UNDEFINED;
15095 image_create_info.extent.width = 32;
15096 image_create_info.extent.height = 32;
15097 image_create_info.extent.depth = 1;
15098 image_create_info.mipLevels = 1;
15099 image_create_info.arrayLayers = 1;
15100 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15101 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15102 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15103 image_create_info.flags = 0;
15104
15105 m_errorMonitor->SetDesiredFailureMsg(
15106 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15107 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
15108
15109 VkImage localImage;
15110 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
15111 m_errorMonitor->VerifyFound();
15112
Tony Barbourd6673642016-05-05 14:46:39 -060015113 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015114 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060015115 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15116 VkFormat format = static_cast<VkFormat>(f);
15117 VkFormatProperties fProps = m_device->format_properties(format);
15118 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
15119 fProps.optimalTilingFeatures == 0) {
15120 unsupported = format;
15121 break;
15122 }
15123 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015124
Tony Barbourd6673642016-05-05 14:46:39 -060015125 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015126 image_create_info.format = unsupported;
Tony Barbourd6673642016-05-05 14:46:39 -060015127 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015128 "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015129
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015130 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060015131 m_errorMonitor->VerifyFound();
15132 }
15133}
15134
15135TEST_F(VkLayerTest, ImageLayerViewTests) {
15136 VkResult ret;
15137 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15138
15139 ASSERT_NO_FATAL_FAILURE(InitState());
15140
15141 VkImageObj image(m_device);
15142 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
15143 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
15144 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15145 VK_IMAGE_TILING_OPTIMAL, 0);
15146 ASSERT_TRUE(image.initialized());
15147
15148 VkImageView imgView;
15149 VkImageViewCreateInfo imgViewInfo = {};
15150 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15151 imgViewInfo.image = image.handle();
15152 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15153 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15154 imgViewInfo.subresourceRange.layerCount = 1;
15155 imgViewInfo.subresourceRange.baseMipLevel = 0;
15156 imgViewInfo.subresourceRange.levelCount = 1;
15157 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15158
15159 m_errorMonitor->SetDesiredFailureMsg(
15160 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15161 "vkCreateImageView called with baseMipLevel");
15162 // View can't have baseMipLevel >= image's mipLevels - Expect
15163 // VIEW_CREATE_ERROR
15164 imgViewInfo.subresourceRange.baseMipLevel = 1;
15165 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15166 m_errorMonitor->VerifyFound();
15167 imgViewInfo.subresourceRange.baseMipLevel = 0;
15168
15169 m_errorMonitor->SetDesiredFailureMsg(
15170 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15171 "vkCreateImageView called with baseArrayLayer");
15172 // View can't have baseArrayLayer >= image's arraySize - Expect
15173 // VIEW_CREATE_ERROR
15174 imgViewInfo.subresourceRange.baseArrayLayer = 1;
15175 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15176 m_errorMonitor->VerifyFound();
15177 imgViewInfo.subresourceRange.baseArrayLayer = 0;
15178
15179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15180 "vkCreateImageView called with 0 in "
15181 "pCreateInfo->subresourceRange."
15182 "levelCount");
15183 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
15184 imgViewInfo.subresourceRange.levelCount = 0;
15185 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15186 m_errorMonitor->VerifyFound();
15187 imgViewInfo.subresourceRange.levelCount = 1;
15188
15189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15190 "vkCreateImageView called with 0 in "
15191 "pCreateInfo->subresourceRange."
15192 "layerCount");
15193 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
15194 imgViewInfo.subresourceRange.layerCount = 0;
15195 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15196 m_errorMonitor->VerifyFound();
15197 imgViewInfo.subresourceRange.layerCount = 1;
15198
15199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15200 "but both must be color formats");
15201 // Can't use depth format for view into color image - Expect INVALID_FORMAT
15202 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
15203 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15204 m_errorMonitor->VerifyFound();
15205 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15206
15207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15208 "Formats MUST be IDENTICAL unless "
15209 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
15210 "was set on image creation.");
15211 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
15212 // VIEW_CREATE_ERROR
15213 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
15214 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15215 m_errorMonitor->VerifyFound();
15216 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15217
15218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15219 "can support ImageViews with "
15220 "differing formats but they must be "
15221 "in the same compatibility class.");
15222 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
15223 // VIEW_CREATE_ERROR
15224 VkImageCreateInfo mutImgInfo = image.create_info();
15225 VkImage mutImage;
15226 mutImgInfo.format = VK_FORMAT_R8_UINT;
15227 assert(
15228 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
15229 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
15230 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
15231 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15232 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
15233 ASSERT_VK_SUCCESS(ret);
15234 imgViewInfo.image = mutImage;
15235 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15236 m_errorMonitor->VerifyFound();
15237 imgViewInfo.image = image.handle();
15238 vkDestroyImage(m_device->handle(), mutImage, NULL);
15239}
15240
15241TEST_F(VkLayerTest, MiscImageLayerTests) {
15242
15243 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
15244
15245 ASSERT_NO_FATAL_FAILURE(InitState());
15246
15247 VkImageObj image(m_device);
15248 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
15249 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
15250 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15251 VK_IMAGE_TILING_OPTIMAL, 0);
15252 ASSERT_TRUE(image.initialized());
15253
15254 m_errorMonitor->SetDesiredFailureMsg(
15255 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15256 "number of layers in image subresource is zero");
15257 vk_testing::Buffer buffer;
15258 VkMemoryPropertyFlags reqs = 0;
15259 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
15260 VkBufferImageCopy region = {};
15261 region.bufferRowLength = 128;
15262 region.bufferImageHeight = 128;
15263 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15264 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
15265 region.imageSubresource.layerCount = 0;
15266 region.imageExtent.height = 4;
15267 region.imageExtent.width = 4;
15268 region.imageExtent.depth = 1;
15269 m_commandBuffer->BeginCommandBuffer();
15270 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
15271 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
15272 1, &region);
15273 m_errorMonitor->VerifyFound();
15274 region.imageSubresource.layerCount = 1;
15275
15276 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15277 "aspectMasks for each region must "
15278 "specify only COLOR or DEPTH or "
15279 "STENCIL");
15280 // Expect MISMATCHED_IMAGE_ASPECT
15281 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
15282 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
15283 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
15284 1, &region);
15285 m_errorMonitor->VerifyFound();
15286 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15287
15288 m_errorMonitor->SetDesiredFailureMsg(
15289 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15290 "If the format of srcImage is a depth, stencil, depth stencil or "
15291 "integer-based format then filter must be VK_FILTER_NEAREST");
15292 // Expect INVALID_FILTER
15293 VkImageObj intImage1(m_device);
15294 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
15295 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
15296 0);
15297 VkImageObj intImage2(m_device);
15298 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
15299 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
15300 0);
15301 VkImageBlit blitRegion = {};
15302 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15303 blitRegion.srcSubresource.baseArrayLayer = 0;
15304 blitRegion.srcSubresource.layerCount = 1;
15305 blitRegion.srcSubresource.mipLevel = 0;
15306 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15307 blitRegion.dstSubresource.baseArrayLayer = 0;
15308 blitRegion.dstSubresource.layerCount = 1;
15309 blitRegion.dstSubresource.mipLevel = 0;
15310
15311 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
15312 intImage1.layout(), intImage2.handle(), intImage2.layout(),
15313 16, &blitRegion, VK_FILTER_LINEAR);
15314 m_errorMonitor->VerifyFound();
15315
15316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15317 "called with 0 in ppMemoryBarriers");
15318 VkImageMemoryBarrier img_barrier;
15319 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
15320 img_barrier.pNext = NULL;
15321 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
15322 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
15323 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15324 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15325 img_barrier.image = image.handle();
15326 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15327 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15328 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15329 img_barrier.subresourceRange.baseArrayLayer = 0;
15330 img_barrier.subresourceRange.baseMipLevel = 0;
15331 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
15332 img_barrier.subresourceRange.layerCount = 0;
15333 img_barrier.subresourceRange.levelCount = 1;
15334 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
15335 VK_PIPELINE_STAGE_HOST_BIT,
15336 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
15337 nullptr, 1, &img_barrier);
15338 m_errorMonitor->VerifyFound();
15339 img_barrier.subresourceRange.layerCount = 1;
15340}
15341
15342TEST_F(VkLayerTest, ImageFormatLimits) {
15343
15344 TEST_DESCRIPTION("Exceed the limits of image format ");
15345
15346 m_errorMonitor->SetDesiredFailureMsg(
15347 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15348 "CreateImage extents exceed allowable limits for format");
15349 VkImageCreateInfo image_create_info = {};
15350 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15351 image_create_info.pNext = NULL;
15352 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15353 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15354 image_create_info.extent.width = 32;
15355 image_create_info.extent.height = 32;
15356 image_create_info.extent.depth = 1;
15357 image_create_info.mipLevels = 1;
15358 image_create_info.arrayLayers = 1;
15359 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15360 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15361 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15362 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15363 image_create_info.flags = 0;
15364
15365 VkImage nullImg;
15366 VkImageFormatProperties imgFmtProps;
15367 vkGetPhysicalDeviceImageFormatProperties(
15368 gpu(), image_create_info.format, image_create_info.imageType,
15369 image_create_info.tiling, image_create_info.usage,
15370 image_create_info.flags, &imgFmtProps);
15371 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
15372 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15373 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15374 m_errorMonitor->VerifyFound();
15375 image_create_info.extent.depth = 1;
15376
15377 m_errorMonitor->SetDesiredFailureMsg(
15378 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15379 "exceeds allowable maximum supported by format of");
15380 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
15381 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15382 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15383 m_errorMonitor->VerifyFound();
15384 image_create_info.mipLevels = 1;
15385
15386 m_errorMonitor->SetDesiredFailureMsg(
15387 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15388 "exceeds allowable maximum supported by format of");
15389 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
15390 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15391 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15392 m_errorMonitor->VerifyFound();
15393 image_create_info.arrayLayers = 1;
15394
15395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15396 "is not supported by format");
15397 int samples = imgFmtProps.sampleCounts >> 1;
15398 image_create_info.samples = (VkSampleCountFlagBits)samples;
15399 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15400 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15401 m_errorMonitor->VerifyFound();
15402 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15403
15404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15405 "pCreateInfo->initialLayout, must be "
15406 "VK_IMAGE_LAYOUT_UNDEFINED or "
15407 "VK_IMAGE_LAYOUT_PREINITIALIZED");
15408 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15409 // Expect INVALID_LAYOUT
15410 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15411 m_errorMonitor->VerifyFound();
15412 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15413}
15414
Karl Schultz6addd812016-02-02 17:17:23 -070015415TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060015416 VkResult err;
15417 bool pass;
15418
15419 // Create color images with different format sizes and try to copy between them
15420 m_errorMonitor->SetDesiredFailureMsg(
15421 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15422 "vkCmdCopyImage called with unmatched source and dest image format sizes");
15423
15424 ASSERT_NO_FATAL_FAILURE(InitState());
15425
15426 // Create two images of different types and try to copy between them
15427 VkImage srcImage;
15428 VkImage dstImage;
15429 VkDeviceMemory srcMem;
15430 VkDeviceMemory destMem;
15431 VkMemoryRequirements memReqs;
15432
15433 VkImageCreateInfo image_create_info = {};
15434 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15435 image_create_info.pNext = NULL;
15436 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15437 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15438 image_create_info.extent.width = 32;
15439 image_create_info.extent.height = 32;
15440 image_create_info.extent.depth = 1;
15441 image_create_info.mipLevels = 1;
15442 image_create_info.arrayLayers = 1;
15443 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15444 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15445 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15446 image_create_info.flags = 0;
15447
15448 err =
15449 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
15450 ASSERT_VK_SUCCESS(err);
15451
15452 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15453 // Introduce failure by creating second image with a different-sized format.
15454 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
15455
15456 err =
15457 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
15458 ASSERT_VK_SUCCESS(err);
15459
15460 // Allocate memory
15461 VkMemoryAllocateInfo memAlloc = {};
15462 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15463 memAlloc.pNext = NULL;
15464 memAlloc.allocationSize = 0;
15465 memAlloc.memoryTypeIndex = 0;
15466
15467 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
15468 memAlloc.allocationSize = memReqs.size;
15469 pass =
15470 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
15471 ASSERT_TRUE(pass);
15472 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
15473 ASSERT_VK_SUCCESS(err);
15474
15475 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
15476 memAlloc.allocationSize = memReqs.size;
15477 pass =
15478 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
15479 ASSERT_TRUE(pass);
15480 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
15481 ASSERT_VK_SUCCESS(err);
15482
15483 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15484 ASSERT_VK_SUCCESS(err);
15485 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
15486 ASSERT_VK_SUCCESS(err);
15487
15488 BeginCommandBuffer();
15489 VkImageCopy copyRegion;
15490 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15491 copyRegion.srcSubresource.mipLevel = 0;
15492 copyRegion.srcSubresource.baseArrayLayer = 0;
15493 copyRegion.srcSubresource.layerCount = 0;
15494 copyRegion.srcOffset.x = 0;
15495 copyRegion.srcOffset.y = 0;
15496 copyRegion.srcOffset.z = 0;
15497 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15498 copyRegion.dstSubresource.mipLevel = 0;
15499 copyRegion.dstSubresource.baseArrayLayer = 0;
15500 copyRegion.dstSubresource.layerCount = 0;
15501 copyRegion.dstOffset.x = 0;
15502 copyRegion.dstOffset.y = 0;
15503 copyRegion.dstOffset.z = 0;
15504 copyRegion.extent.width = 1;
15505 copyRegion.extent.height = 1;
15506 copyRegion.extent.depth = 1;
15507 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15508 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
15509 EndCommandBuffer();
15510
15511 m_errorMonitor->VerifyFound();
15512
15513 vkDestroyImage(m_device->device(), srcImage, NULL);
15514 vkDestroyImage(m_device->device(), dstImage, NULL);
15515 vkFreeMemory(m_device->device(), srcMem, NULL);
15516 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015517}
15518
Karl Schultz6addd812016-02-02 17:17:23 -070015519TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
15520 VkResult err;
15521 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015522
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015523 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015524 m_errorMonitor->SetDesiredFailureMsg(
15525 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015526 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015527
Mike Stroyana3082432015-09-25 13:39:21 -060015528 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015529
15530 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015531 VkImage srcImage;
15532 VkImage dstImage;
15533 VkDeviceMemory srcMem;
15534 VkDeviceMemory destMem;
15535 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015536
15537 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015538 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15539 image_create_info.pNext = NULL;
15540 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15541 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15542 image_create_info.extent.width = 32;
15543 image_create_info.extent.height = 32;
15544 image_create_info.extent.depth = 1;
15545 image_create_info.mipLevels = 1;
15546 image_create_info.arrayLayers = 1;
15547 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15548 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15549 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15550 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015551
Karl Schultz6addd812016-02-02 17:17:23 -070015552 err =
15553 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015554 ASSERT_VK_SUCCESS(err);
15555
Karl Schultzbdb75952016-04-19 11:36:49 -060015556 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15557
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015558 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070015559 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015560 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
15561 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015562
Karl Schultz6addd812016-02-02 17:17:23 -070015563 err =
15564 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015565 ASSERT_VK_SUCCESS(err);
15566
15567 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015568 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015569 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15570 memAlloc.pNext = NULL;
15571 memAlloc.allocationSize = 0;
15572 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015573
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015574 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015575 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015576 pass =
15577 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015578 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015579 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015580 ASSERT_VK_SUCCESS(err);
15581
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015582 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015583 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015584 pass =
15585 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015586 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015587 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015588 ASSERT_VK_SUCCESS(err);
15589
15590 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15591 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015592 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015593 ASSERT_VK_SUCCESS(err);
15594
15595 BeginCommandBuffer();
15596 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015597 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015598 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015599 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015600 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015601 copyRegion.srcOffset.x = 0;
15602 copyRegion.srcOffset.y = 0;
15603 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015604 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015605 copyRegion.dstSubresource.mipLevel = 0;
15606 copyRegion.dstSubresource.baseArrayLayer = 0;
15607 copyRegion.dstSubresource.layerCount = 0;
15608 copyRegion.dstOffset.x = 0;
15609 copyRegion.dstOffset.y = 0;
15610 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015611 copyRegion.extent.width = 1;
15612 copyRegion.extent.height = 1;
15613 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015614 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15615 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015616 EndCommandBuffer();
15617
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015618 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015619
Chia-I Wuf7458c52015-10-26 21:10:41 +080015620 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015621 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015622 vkFreeMemory(m_device->device(), srcMem, NULL);
15623 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015624}
15625
Karl Schultz6addd812016-02-02 17:17:23 -070015626TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
15627 VkResult err;
15628 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015629
Karl Schultz6addd812016-02-02 17:17:23 -070015630 m_errorMonitor->SetDesiredFailureMsg(
15631 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015632 "vkCmdResolveImage called with source sample count less than 2.");
15633
Mike Stroyana3082432015-09-25 13:39:21 -060015634 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015635
15636 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015637 VkImage srcImage;
15638 VkImage dstImage;
15639 VkDeviceMemory srcMem;
15640 VkDeviceMemory destMem;
15641 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015642
15643 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015644 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15645 image_create_info.pNext = NULL;
15646 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15647 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15648 image_create_info.extent.width = 32;
15649 image_create_info.extent.height = 1;
15650 image_create_info.extent.depth = 1;
15651 image_create_info.mipLevels = 1;
15652 image_create_info.arrayLayers = 1;
15653 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15654 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15655 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15656 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015657
Karl Schultz6addd812016-02-02 17:17:23 -070015658 err =
15659 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015660 ASSERT_VK_SUCCESS(err);
15661
Karl Schultz6addd812016-02-02 17:17:23 -070015662 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015663
Karl Schultz6addd812016-02-02 17:17:23 -070015664 err =
15665 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015666 ASSERT_VK_SUCCESS(err);
15667
15668 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015669 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015670 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15671 memAlloc.pNext = NULL;
15672 memAlloc.allocationSize = 0;
15673 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015674
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015675 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015676 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015677 pass =
15678 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015679 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015680 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015681 ASSERT_VK_SUCCESS(err);
15682
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015683 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015684 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015685 pass =
15686 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015687 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015688 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015689 ASSERT_VK_SUCCESS(err);
15690
15691 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15692 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015693 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015694 ASSERT_VK_SUCCESS(err);
15695
15696 BeginCommandBuffer();
15697 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015698 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15699 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015700 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015701 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015702 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015703 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015704 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015705 resolveRegion.srcOffset.x = 0;
15706 resolveRegion.srcOffset.y = 0;
15707 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015708 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015709 resolveRegion.dstSubresource.mipLevel = 0;
15710 resolveRegion.dstSubresource.baseArrayLayer = 0;
15711 resolveRegion.dstSubresource.layerCount = 0;
15712 resolveRegion.dstOffset.x = 0;
15713 resolveRegion.dstOffset.y = 0;
15714 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015715 resolveRegion.extent.width = 1;
15716 resolveRegion.extent.height = 1;
15717 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015718 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15719 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015720 EndCommandBuffer();
15721
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015722 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015723
Chia-I Wuf7458c52015-10-26 21:10:41 +080015724 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015725 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015726 vkFreeMemory(m_device->device(), srcMem, NULL);
15727 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015728}
15729
Karl Schultz6addd812016-02-02 17:17:23 -070015730TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
15731 VkResult err;
15732 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015733
Karl Schultz6addd812016-02-02 17:17:23 -070015734 m_errorMonitor->SetDesiredFailureMsg(
15735 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015736 "vkCmdResolveImage called with dest sample count greater than 1.");
15737
Mike Stroyana3082432015-09-25 13:39:21 -060015738 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015739
Chris Forbesa7530692016-05-08 12:35:39 +120015740 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015741 VkImage srcImage;
15742 VkImage dstImage;
15743 VkDeviceMemory srcMem;
15744 VkDeviceMemory destMem;
15745 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015746
15747 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015748 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 = 1;
15754 image_create_info.extent.depth = 1;
15755 image_create_info.mipLevels = 1;
15756 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120015757 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015758 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15759 // Note: Some implementations expect color attachment usage for any
15760 // multisample surface
15761 image_create_info.usage =
15762 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15763 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015764
Karl Schultz6addd812016-02-02 17:17:23 -070015765 err =
15766 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015767 ASSERT_VK_SUCCESS(err);
15768
Karl Schultz6addd812016-02-02 17:17:23 -070015769 // Note: Some implementations expect color attachment usage for any
15770 // multisample surface
15771 image_create_info.usage =
15772 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015773
Karl Schultz6addd812016-02-02 17:17:23 -070015774 err =
15775 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015776 ASSERT_VK_SUCCESS(err);
15777
15778 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015779 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015780 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15781 memAlloc.pNext = NULL;
15782 memAlloc.allocationSize = 0;
15783 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015784
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015785 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015786 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015787 pass =
15788 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015789 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015790 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015791 ASSERT_VK_SUCCESS(err);
15792
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015793 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015794 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015795 pass =
15796 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015797 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015798 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015799 ASSERT_VK_SUCCESS(err);
15800
15801 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15802 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015803 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015804 ASSERT_VK_SUCCESS(err);
15805
15806 BeginCommandBuffer();
15807 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015808 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15809 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015810 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015811 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015812 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015813 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015814 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015815 resolveRegion.srcOffset.x = 0;
15816 resolveRegion.srcOffset.y = 0;
15817 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015818 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015819 resolveRegion.dstSubresource.mipLevel = 0;
15820 resolveRegion.dstSubresource.baseArrayLayer = 0;
15821 resolveRegion.dstSubresource.layerCount = 0;
15822 resolveRegion.dstOffset.x = 0;
15823 resolveRegion.dstOffset.y = 0;
15824 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015825 resolveRegion.extent.width = 1;
15826 resolveRegion.extent.height = 1;
15827 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015828 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15829 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015830 EndCommandBuffer();
15831
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015832 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015833
Chia-I Wuf7458c52015-10-26 21:10:41 +080015834 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015835 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015836 vkFreeMemory(m_device->device(), srcMem, NULL);
15837 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015838}
15839
Karl Schultz6addd812016-02-02 17:17:23 -070015840TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
15841 VkResult err;
15842 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015843
Karl Schultz6addd812016-02-02 17:17:23 -070015844 m_errorMonitor->SetDesiredFailureMsg(
15845 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015846 "vkCmdResolveImage called with unmatched source and dest formats.");
15847
Mike Stroyana3082432015-09-25 13:39:21 -060015848 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015849
15850 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015851 VkImage srcImage;
15852 VkImage dstImage;
15853 VkDeviceMemory srcMem;
15854 VkDeviceMemory destMem;
15855 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015856
15857 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015858 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15859 image_create_info.pNext = NULL;
15860 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15861 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15862 image_create_info.extent.width = 32;
15863 image_create_info.extent.height = 1;
15864 image_create_info.extent.depth = 1;
15865 image_create_info.mipLevels = 1;
15866 image_create_info.arrayLayers = 1;
15867 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
15868 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15869 // Note: Some implementations expect color attachment usage for any
15870 // multisample surface
15871 image_create_info.usage =
15872 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15873 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015874
Karl Schultz6addd812016-02-02 17:17:23 -070015875 err =
15876 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015877 ASSERT_VK_SUCCESS(err);
15878
Karl Schultz6addd812016-02-02 17:17:23 -070015879 // Set format to something other than source image
15880 image_create_info.format = VK_FORMAT_R32_SFLOAT;
15881 // Note: Some implementations expect color attachment usage for any
15882 // multisample surface
15883 image_create_info.usage =
15884 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15885 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015886
Karl Schultz6addd812016-02-02 17:17:23 -070015887 err =
15888 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015889 ASSERT_VK_SUCCESS(err);
15890
15891 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015892 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015893 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15894 memAlloc.pNext = NULL;
15895 memAlloc.allocationSize = 0;
15896 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015897
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015898 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015899 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015900 pass =
15901 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015902 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015903 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015904 ASSERT_VK_SUCCESS(err);
15905
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015906 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015907 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015908 pass =
15909 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015910 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015911 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015912 ASSERT_VK_SUCCESS(err);
15913
15914 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15915 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015916 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015917 ASSERT_VK_SUCCESS(err);
15918
15919 BeginCommandBuffer();
15920 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015921 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15922 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015923 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015924 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015925 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015926 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015927 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015928 resolveRegion.srcOffset.x = 0;
15929 resolveRegion.srcOffset.y = 0;
15930 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015931 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015932 resolveRegion.dstSubresource.mipLevel = 0;
15933 resolveRegion.dstSubresource.baseArrayLayer = 0;
15934 resolveRegion.dstSubresource.layerCount = 0;
15935 resolveRegion.dstOffset.x = 0;
15936 resolveRegion.dstOffset.y = 0;
15937 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015938 resolveRegion.extent.width = 1;
15939 resolveRegion.extent.height = 1;
15940 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015941 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15942 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015943 EndCommandBuffer();
15944
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015945 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015946
Chia-I Wuf7458c52015-10-26 21:10:41 +080015947 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015948 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015949 vkFreeMemory(m_device->device(), srcMem, NULL);
15950 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015951}
15952
Karl Schultz6addd812016-02-02 17:17:23 -070015953TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
15954 VkResult err;
15955 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015956
Karl Schultz6addd812016-02-02 17:17:23 -070015957 m_errorMonitor->SetDesiredFailureMsg(
15958 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015959 "vkCmdResolveImage called with unmatched source and dest image types.");
15960
Mike Stroyana3082432015-09-25 13:39:21 -060015961 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015962
15963 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015964 VkImage srcImage;
15965 VkImage dstImage;
15966 VkDeviceMemory srcMem;
15967 VkDeviceMemory destMem;
15968 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015969
15970 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015971 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15972 image_create_info.pNext = NULL;
15973 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15974 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15975 image_create_info.extent.width = 32;
15976 image_create_info.extent.height = 1;
15977 image_create_info.extent.depth = 1;
15978 image_create_info.mipLevels = 1;
15979 image_create_info.arrayLayers = 1;
15980 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
15981 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15982 // Note: Some implementations expect color attachment usage for any
15983 // multisample surface
15984 image_create_info.usage =
15985 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15986 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015987
Karl Schultz6addd812016-02-02 17:17:23 -070015988 err =
15989 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015990 ASSERT_VK_SUCCESS(err);
15991
Karl Schultz6addd812016-02-02 17:17:23 -070015992 image_create_info.imageType = VK_IMAGE_TYPE_1D;
15993 // Note: Some implementations expect color attachment usage for any
15994 // multisample surface
15995 image_create_info.usage =
15996 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15997 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015998
Karl Schultz6addd812016-02-02 17:17:23 -070015999 err =
16000 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016001 ASSERT_VK_SUCCESS(err);
16002
16003 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016004 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016005 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16006 memAlloc.pNext = NULL;
16007 memAlloc.allocationSize = 0;
16008 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016009
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016010 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016011 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016012 pass =
16013 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016014 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016015 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016016 ASSERT_VK_SUCCESS(err);
16017
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016018 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016019 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016020 pass =
16021 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016022 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016023 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016024 ASSERT_VK_SUCCESS(err);
16025
16026 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16027 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016028 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016029 ASSERT_VK_SUCCESS(err);
16030
16031 BeginCommandBuffer();
16032 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016033 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16034 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016035 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016036 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016037 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016038 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016039 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016040 resolveRegion.srcOffset.x = 0;
16041 resolveRegion.srcOffset.y = 0;
16042 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016043 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016044 resolveRegion.dstSubresource.mipLevel = 0;
16045 resolveRegion.dstSubresource.baseArrayLayer = 0;
16046 resolveRegion.dstSubresource.layerCount = 0;
16047 resolveRegion.dstOffset.x = 0;
16048 resolveRegion.dstOffset.y = 0;
16049 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016050 resolveRegion.extent.width = 1;
16051 resolveRegion.extent.height = 1;
16052 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016053 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16054 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016055 EndCommandBuffer();
16056
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016057 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016058
Chia-I Wuf7458c52015-10-26 21:10:41 +080016059 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016060 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016061 vkFreeMemory(m_device->device(), srcMem, NULL);
16062 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016063}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016064
Karl Schultz6addd812016-02-02 17:17:23 -070016065TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016066 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070016067 // to using a DS format, then cause it to hit error due to COLOR_BIT not
16068 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016069 // The image format check comes 2nd in validation so we trigger it first,
16070 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070016071 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016072
Karl Schultz6addd812016-02-02 17:17:23 -070016073 m_errorMonitor->SetDesiredFailureMsg(
16074 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016075 "Combination depth/stencil image formats can have only the ");
16076
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016077 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016078
Chia-I Wu1b99bb22015-10-27 19:25:11 +080016079 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016080 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16081 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016082
16083 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016084 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16085 ds_pool_ci.pNext = NULL;
16086 ds_pool_ci.maxSets = 1;
16087 ds_pool_ci.poolSizeCount = 1;
16088 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016089
16090 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070016091 err =
16092 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016093 ASSERT_VK_SUCCESS(err);
16094
16095 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016096 dsl_binding.binding = 0;
16097 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16098 dsl_binding.descriptorCount = 1;
16099 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16100 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016101
16102 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016103 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16104 ds_layout_ci.pNext = NULL;
16105 ds_layout_ci.bindingCount = 1;
16106 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016107 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070016108 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
16109 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016110 ASSERT_VK_SUCCESS(err);
16111
16112 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016113 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080016114 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070016115 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016116 alloc_info.descriptorPool = ds_pool;
16117 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070016118 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
16119 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016120 ASSERT_VK_SUCCESS(err);
16121
Karl Schultz6addd812016-02-02 17:17:23 -070016122 VkImage image_bad;
16123 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016124 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060016125 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016126 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070016127 const int32_t tex_width = 32;
16128 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016129
16130 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016131 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16132 image_create_info.pNext = NULL;
16133 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16134 image_create_info.format = tex_format_bad;
16135 image_create_info.extent.width = tex_width;
16136 image_create_info.extent.height = tex_height;
16137 image_create_info.extent.depth = 1;
16138 image_create_info.mipLevels = 1;
16139 image_create_info.arrayLayers = 1;
16140 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16141 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16142 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
16143 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
16144 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016145
Karl Schultz6addd812016-02-02 17:17:23 -070016146 err =
16147 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016148 ASSERT_VK_SUCCESS(err);
16149 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070016150 image_create_info.usage =
16151 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16152 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
16153 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016154 ASSERT_VK_SUCCESS(err);
16155
16156 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016157 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16158 image_view_create_info.image = image_bad;
16159 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16160 image_view_create_info.format = tex_format_bad;
16161 image_view_create_info.subresourceRange.baseArrayLayer = 0;
16162 image_view_create_info.subresourceRange.baseMipLevel = 0;
16163 image_view_create_info.subresourceRange.layerCount = 1;
16164 image_view_create_info.subresourceRange.levelCount = 1;
16165 image_view_create_info.subresourceRange.aspectMask =
16166 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016167
16168 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070016169 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
16170 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016171
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016172 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016173
Chia-I Wuf7458c52015-10-26 21:10:41 +080016174 vkDestroyImage(m_device->device(), image_bad, NULL);
16175 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016176 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16177 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016178}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016179
16180TEST_F(VkLayerTest, ClearImageErrors) {
16181 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
16182 "ClearDepthStencilImage with a color image.");
16183
16184 ASSERT_NO_FATAL_FAILURE(InitState());
16185 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16186
16187 // Renderpass is started here so end it as Clear cmds can't be in renderpass
16188 BeginCommandBuffer();
16189 m_commandBuffer->EndRenderPass();
16190
16191 // Color image
16192 VkClearColorValue clear_color;
16193 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
16194 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
16195 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
16196 const int32_t img_width = 32;
16197 const int32_t img_height = 32;
16198 VkImageCreateInfo image_create_info = {};
16199 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16200 image_create_info.pNext = NULL;
16201 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16202 image_create_info.format = color_format;
16203 image_create_info.extent.width = img_width;
16204 image_create_info.extent.height = img_height;
16205 image_create_info.extent.depth = 1;
16206 image_create_info.mipLevels = 1;
16207 image_create_info.arrayLayers = 1;
16208 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16209 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16210 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16211
16212 vk_testing::Image color_image;
16213 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info,
16214 reqs);
16215
16216 const VkImageSubresourceRange color_range =
16217 vk_testing::Image::subresource_range(image_create_info,
16218 VK_IMAGE_ASPECT_COLOR_BIT);
16219
16220 // Depth/Stencil image
16221 VkClearDepthStencilValue clear_value = {0};
16222 reqs = 0; // don't need HOST_VISIBLE DS image
16223 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
16224 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
16225 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
16226 ds_image_create_info.extent.width = 64;
16227 ds_image_create_info.extent.height = 64;
16228 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16229 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
16230
16231 vk_testing::Image ds_image;
16232 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info,
16233 reqs);
16234
16235 const VkImageSubresourceRange ds_range =
16236 vk_testing::Image::subresource_range(ds_image_create_info,
16237 VK_IMAGE_ASPECT_DEPTH_BIT);
16238
16239 m_errorMonitor->SetDesiredFailureMsg(
16240 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16241 "vkCmdClearColorImage called with depth/stencil image.");
16242
16243 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
16244 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
16245 &color_range);
16246
16247 m_errorMonitor->VerifyFound();
16248
Tony Barbour26434b92016-06-02 09:43:50 -060016249 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16250 "vkCmdClearColorImage called with "
16251 "image created without "
16252 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
16253
16254 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
16255 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
16256 &color_range);
16257
16258 m_errorMonitor->VerifyFound();
16259
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016260 // Call CmdClearDepthStencilImage with color image
16261 m_errorMonitor->SetDesiredFailureMsg(
16262 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16263 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
16264
16265 vkCmdClearDepthStencilImage(
16266 m_commandBuffer->GetBufferHandle(), color_image.handle(),
16267 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
16268 &ds_range);
16269
16270 m_errorMonitor->VerifyFound();
16271}
Tobin Ehliscde08892015-09-22 10:11:37 -060016272#endif // IMAGE_TESTS
16273
Cody Northrop1242dfd2016-07-13 17:24:59 -060016274#if defined(ANDROID) && defined(VALIDATION_APK)
16275static bool initialized = false;
16276static bool active = false;
16277
16278// Convert Intents to argv
16279// Ported from Hologram sample, only difference is flexible key
16280std::vector<std::string> get_args(android_app &app, const char* intent_extra_data_key)
16281{
16282 std::vector<std::string> args;
16283 JavaVM &vm = *app.activity->vm;
16284 JNIEnv *p_env;
16285 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK)
16286 return args;
16287
16288 JNIEnv &env = *p_env;
16289 jobject activity = app.activity->clazz;
16290 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity),
16291 "getIntent", "()Landroid/content/Intent;");
16292 jobject intent = env.CallObjectMethod(activity, get_intent_method);
16293 jmethodID get_string_extra_method = env.GetMethodID(env.GetObjectClass(intent),
16294 "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
16295 jvalue get_string_extra_args;
16296 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
16297 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent,
16298 get_string_extra_method, &get_string_extra_args));
16299
16300 std::string args_str;
16301 if (extra_str) {
16302 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
16303 args_str = extra_utf;
16304 env.ReleaseStringUTFChars(extra_str, extra_utf);
16305 env.DeleteLocalRef(extra_str);
16306 }
16307
16308 env.DeleteLocalRef(get_string_extra_args.l);
16309 env.DeleteLocalRef(intent);
16310 vm.DetachCurrentThread();
16311
16312 // split args_str
16313 std::stringstream ss(args_str);
16314 std::string arg;
16315 while (std::getline(ss, arg, ' ')) {
16316 if (!arg.empty())
16317 args.push_back(arg);
16318 }
16319
16320 return args;
16321}
16322
16323
16324static int32_t processInput(struct android_app* app, AInputEvent* event) {
16325 return 0;
16326}
16327
16328static void processCommand(struct android_app* app, int32_t cmd) {
16329 switch(cmd) {
16330 case APP_CMD_INIT_WINDOW: {
16331 if (app->window) {
16332 initialized = true;
16333 }
16334 break;
16335 }
16336 case APP_CMD_GAINED_FOCUS: {
16337 active = true;
16338 break;
16339 }
16340 case APP_CMD_LOST_FOCUS: {
16341 active = false;
16342 break;
16343 }
16344 }
16345}
16346
16347void android_main(struct android_app *app)
16348{
16349 app_dummy();
16350
16351 const char* appTag = "VulkanLayerValidationTests";
16352
16353 int vulkanSupport = InitVulkan();
16354 if (vulkanSupport == 0) {
16355 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
16356 return;
16357 }
16358
16359 app->onAppCmd = processCommand;
16360 app->onInputEvent = processInput;
16361
16362 while(1) {
16363 int events;
16364 struct android_poll_source* source;
16365 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void**)&source) >= 0) {
16366 if (source) {
16367 source->process(app, source);
16368 }
16369
16370 if (app->destroyRequested != 0) {
16371 VkTestFramework::Finish();
16372 return;
16373 }
16374 }
16375
16376 if (initialized && active) {
16377 // Use the following key to send arguments to gtest, i.e.
16378 // --es args "--gtest_filter=-VkLayerTest.foo"
16379 const char key[] = "args";
16380 std::vector<std::string> args = get_args(*app, key);
16381
16382 std::string filter = "";
16383 if (args.size() > 0) {
16384 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
16385 filter += args[0];
16386 } else {
16387 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
16388 }
16389
16390 int argc = 2;
16391 char *argv[] = { (char*)"foo", (char*)filter.c_str() };
16392 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
16393
16394 // Route output to files until we can override the gtest output
16395 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
16396 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
16397
16398 ::testing::InitGoogleTest(&argc, argv);
16399 VkTestFramework::InitArgs(&argc, argv);
16400 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
16401
16402 int result = RUN_ALL_TESTS();
16403
16404 if (result != 0) {
16405 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
16406 } else {
16407 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
16408 }
16409
16410 VkTestFramework::Finish();
16411
16412 fclose(stdout);
16413 fclose(stderr);
16414
16415 ANativeActivity_finish(app->activity);
16416
16417 return;
16418 }
16419 }
16420}
16421#endif
16422
Tony Barbour300a6082015-04-07 13:44:53 -060016423int main(int argc, char **argv) {
16424 int result;
16425
Cody Northrop8e54a402016-03-08 22:25:52 -070016426#ifdef ANDROID
16427 int vulkanSupport = InitVulkan();
16428 if (vulkanSupport == 0)
16429 return 1;
16430#endif
16431
Tony Barbour300a6082015-04-07 13:44:53 -060016432 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060016433 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060016434
16435 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
16436
16437 result = RUN_ALL_TESTS();
16438
Tony Barbour6918cd52015-04-09 12:58:51 -060016439 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060016440 return result;
16441}