blob: 395912cd595a6a3b44c8f9c8574e16c44918f086 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
20 */
Tony Barbour65c48b32015-11-17 10:02:56 -070021
Cody Northrop8e54a402016-03-08 22:25:52 -070022#ifdef ANDROID
23#include "vulkan_wrapper.h"
24#else
David Pinedo9316d3b2015-11-06 12:54:48 -070025#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070026#endif
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060027#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060028#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060029#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070030#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060031
Mark Lobodzinski3780e142015-05-14 15:08:13 -050032#define GLM_FORCE_RADIANS
33#include "glm/glm.hpp"
34#include <glm/gtc/matrix_transform.hpp>
35
Tobin Ehlis0788f522015-05-26 16:11:58 -060036#define MEM_TRACKER_TESTS 1
37#define OBJ_TRACKER_TESTS 1
38#define DRAW_STATE_TESTS 1
39#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120040#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060041#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060042#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060043
Mark Lobodzinski3780e142015-05-14 15:08:13 -050044//--------------------------------------------------------------------------------------
45// Mesh and VertexFormat Data
46//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070047struct Vertex {
48 float posX, posY, posZ, posW; // Position data
49 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050050};
51
Karl Schultz6addd812016-02-02 17:17:23 -070052#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050053
54typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070055 BsoFailNone = 0x00000000,
56 BsoFailLineWidth = 0x00000001,
57 BsoFailDepthBias = 0x00000002,
58 BsoFailViewport = 0x00000004,
59 BsoFailScissor = 0x00000008,
60 BsoFailBlend = 0x00000010,
61 BsoFailDepthBounds = 0x00000020,
62 BsoFailStencilReadMask = 0x00000040,
63 BsoFailStencilWriteMask = 0x00000080,
64 BsoFailStencilReference = 0x00000100,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050065} BsoFailSelect;
66
67struct vktriangle_vs_uniform {
68 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070069 float mvp[4][4];
70 float position[3][4];
71 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050072};
73
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050074static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120075 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070076 "vec2 vertices[3];\n"
77 "out gl_PerVertex {\n"
78 " vec4 gl_Position;\n"
79 "};\n"
80 "void main() {\n"
81 " vertices[0] = vec2(-1.0, -1.0);\n"
82 " vertices[1] = vec2( 1.0, -1.0);\n"
83 " vertices[2] = vec2( 0.0, 1.0);\n"
84 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
85 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050086
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050087static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120088 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070089 "\n"
90 "layout(location = 0) out vec4 uFragColor;\n"
91 "void main(){\n"
92 " uFragColor = vec4(0,1,0,1);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Karl Schultz6addd812016-02-02 17:17:23 -070095static VKAPI_ATTR VkBool32 VKAPI_CALL
96myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
97 uint64_t srcObject, size_t location, int32_t msgCode,
98 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -060099
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600100// ********************************************************
101// ErrorMonitor Usage:
102//
103// Call SetDesiredFailureMsg with a string to be compared against all
104// encountered log messages. Passing NULL will match all log messages.
105// logMsg will return true for skipCall only if msg is matched or NULL.
106//
107// Call DesiredMsgFound to determine if the desired failure message
108// was encountered.
109
Tony Barbour300a6082015-04-07 13:44:53 -0600110class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700111 public:
112 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600113 test_platform_thread_create_mutex(&m_mutex);
114 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700115 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700116 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600117 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600118 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600119
Karl Schultz6addd812016-02-02 17:17:23 -0700120 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200121 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600122 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600123 m_failureMsg.clear();
124 m_otherMsgs.clear();
125 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700126 m_msgFound = VK_FALSE;
127 m_msgFlags = msgFlags;
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
Karl Schultz6addd812016-02-02 17:17:23 -0700131 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600132 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600133 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600134 if (m_bailout != NULL) {
135 *m_bailout = true;
136 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600137 string errorString(msgString);
138 if (msgFlags & m_msgFlags) {
139 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200140 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
141 m_otherMsgs.push_back(m_failureMsg);
142 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600143 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700144 m_msgFound = VK_TRUE;
145 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600146 } else {
147 m_otherMsgs.push_back(errorString);
148 }
149 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600150 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600151 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600152 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600153
Karl Schultz6addd812016-02-02 17:17:23 -0700154 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600155
Karl Schultz6addd812016-02-02 17:17:23 -0700156 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600157
Karl Schultz6addd812016-02-02 17:17:23 -0700158 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600159
Karl Schultz6addd812016-02-02 17:17:23 -0700160 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600161
Karl Schultz6addd812016-02-02 17:17:23 -0700162 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600163 vector<string> otherMsgs = GetOtherFailureMsgs();
164 cout << "Other error messages logged for this test were:" << endl;
165 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
166 cout << " " << *iter << endl;
167 }
168 }
169
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200170 /* helpers */
171
172 void ExpectSuccess() {
173 // match anything
174 SetDesiredFailureMsg(~0u, "");
175 }
176
177 void VerifyFound() {
178 // Not seeing the desired message is a failure. /Before/ throwing, dump
179 // any other messages.
180 if (!DesiredMsgFound()) {
181 DumpFailureMsgs();
182 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
183 }
184 }
185
186 void VerifyNotFound() {
187 // ExpectSuccess() configured us to match anything. Any error is a
188 // failure.
189 if (DesiredMsgFound()) {
190 DumpFailureMsgs();
191 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
192 }
193 }
194
Karl Schultz6addd812016-02-02 17:17:23 -0700195 private:
196 VkFlags m_msgFlags;
197 string m_desiredMsg;
198 string m_failureMsg;
199 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600200 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700201 bool *m_bailout;
202 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600203};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500204
Karl Schultz6addd812016-02-02 17:17:23 -0700205static VKAPI_ATTR VkBool32 VKAPI_CALL
206myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
207 uint64_t srcObject, size_t location, int32_t msgCode,
208 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
209 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700210 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700211 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600212 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600213 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600214 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600215 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600216}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500217
Karl Schultz6addd812016-02-02 17:17:23 -0700218class VkLayerTest : public VkRenderFramework {
219 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800220 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
221 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700222 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
223 BsoFailSelect failMask);
224 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
225 VkPipelineObj &pipelineobj,
226 VkDescriptorSetObj &descriptorSet,
227 BsoFailSelect failMask);
228 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
229 VkDescriptorSetObj &descriptorSet,
230 BsoFailSelect failMask) {
231 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
232 failMask);
233 }
Tony Barbour300a6082015-04-07 13:44:53 -0600234
Tony Barbourfe3351b2015-07-28 10:17:20 -0600235 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700236 VkResult BeginCommandBuffer() {
237 return BeginCommandBuffer(*m_commandBuffer);
238 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800239 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700240 void Draw(uint32_t vertexCount, uint32_t instanceCount,
241 uint32_t firstVertex, uint32_t firstInstance) {
242 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
243 firstInstance);
244 }
245 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
246 uint32_t firstIndex, int32_t vertexOffset,
247 uint32_t firstInstance) {
248 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
249 vertexOffset, firstInstance);
250 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800251 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700252 void QueueCommandBuffer(const VkFence &fence) {
253 m_commandBuffer->QueueCommandBuffer(fence);
254 }
255 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
256 VkDeviceSize offset, uint32_t binding) {
257 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
258 }
259 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
260 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
261 }
262
263 protected:
264 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600265
266 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600267 std::vector<const char *> instance_layer_names;
268 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600269 std::vector<const char *> instance_extension_names;
270 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600271
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700272 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600273 /*
274 * Since CreateDbgMsgCallback is an instance level extension call
275 * any extension / layer that utilizes that feature also needs
276 * to be enabled at create instance time.
277 */
Karl Schultz6addd812016-02-02 17:17:23 -0700278 // Use Threading layer first to protect others from
279 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700280 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600281 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800282 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700283 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800284 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
285 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700286 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600287
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700288 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600289 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800290 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700291 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800292 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
293 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700294 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600295
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600296 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600297 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800298 this->app_info.pApplicationName = "layer_tests";
299 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600300 this->app_info.pEngineName = "unittest";
301 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600302 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600303
Tony Barbour15524c32015-04-29 17:34:29 -0600304 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600305 InitFramework(instance_layer_names, device_layer_names,
306 instance_extension_names, device_extension_names,
307 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600308 }
309
310 virtual void TearDown() {
311 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600312 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600313 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600314 }
315};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500316
Karl Schultz6addd812016-02-02 17:17:23 -0700317VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600318 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600319
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800320 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600321
322 /*
323 * For render test all drawing happens in a single render pass
324 * on a single command buffer.
325 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200326 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800327 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600328 }
329
330 return result;
331}
332
Karl Schultz6addd812016-02-02 17:17:23 -0700333VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600334 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600335
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200336 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800337 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200338 }
Tony Barbour300a6082015-04-07 13:44:53 -0600339
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800340 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600341
342 return result;
343}
344
Karl Schultz6addd812016-02-02 17:17:23 -0700345void VkLayerTest::VKTriangleTest(const char *vertShaderText,
346 const char *fragShaderText,
347 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500348 // Create identity matrix
349 int i;
350 struct vktriangle_vs_uniform data;
351
352 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700353 glm::mat4 View = glm::mat4(1.0f);
354 glm::mat4 Model = glm::mat4(1.0f);
355 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500356 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700357 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500358
359 memcpy(&data.mvp, &MVP[0][0], matrixSize);
360
Karl Schultz6addd812016-02-02 17:17:23 -0700361 static const Vertex tri_data[] = {
362 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
363 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
364 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500365 };
366
Karl Schultz6addd812016-02-02 17:17:23 -0700367 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500368 data.position[i][0] = tri_data[i].posX;
369 data.position[i][1] = tri_data[i].posY;
370 data.position[i][2] = tri_data[i].posZ;
371 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700372 data.color[i][0] = tri_data[i].r;
373 data.color[i][1] = tri_data[i].g;
374 data.color[i][2] = tri_data[i].b;
375 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500376 }
377
378 ASSERT_NO_FATAL_FAILURE(InitState());
379 ASSERT_NO_FATAL_FAILURE(InitViewport());
380
Karl Schultz6addd812016-02-02 17:17:23 -0700381 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
382 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500383
Karl Schultz6addd812016-02-02 17:17:23 -0700384 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
385 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
386 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500387
388 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800389 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500390 pipelineobj.AddShader(&vs);
391 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600392 if (failMask & BsoFailLineWidth) {
393 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600394 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
395 ia_state.sType =
396 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
397 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
398 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600399 }
400 if (failMask & BsoFailDepthBias) {
401 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600402 VkPipelineRasterizationStateCreateInfo rs_state = {};
403 rs_state.sType =
404 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
405 rs_state.depthBiasEnable = VK_TRUE;
406 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600407 }
Karl Schultz6addd812016-02-02 17:17:23 -0700408 // Viewport and scissors must stay in synch or other errors will occur than
409 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600410 if (failMask & BsoFailViewport) {
411 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600412 m_viewports.clear();
413 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600414 }
415 if (failMask & BsoFailScissor) {
416 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600417 m_scissors.clear();
418 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600419 }
420 if (failMask & BsoFailBlend) {
421 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600422 VkPipelineColorBlendAttachmentState att_state = {};
423 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
424 att_state.blendEnable = VK_TRUE;
425 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600426 }
427 if (failMask & BsoFailDepthBounds) {
428 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
429 }
430 if (failMask & BsoFailStencilReadMask) {
431 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
432 }
433 if (failMask & BsoFailStencilWriteMask) {
434 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
435 }
436 if (failMask & BsoFailStencilReference) {
437 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
438 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500439
440 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700441 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
442 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500443
444 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600445 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500446
Tony Barbourfe3351b2015-07-28 10:17:20 -0600447 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500448
449 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600450 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500451
452 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600453 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500454
Tony Barbourfe3351b2015-07-28 10:17:20 -0600455 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456}
457
Karl Schultz6addd812016-02-02 17:17:23 -0700458void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
459 VkPipelineObj &pipelineobj,
460 VkDescriptorSetObj &descriptorSet,
461 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500462 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700463 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
464 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500465 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700466 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
467 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500468 }
469
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800470 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700471 // Make sure depthWriteEnable is set so that Depth fail test will work
472 // correctly
473 // Make sure stencilTestEnable is set so that Stencil fail test will work
474 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600475 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800476 stencil.failOp = VK_STENCIL_OP_KEEP;
477 stencil.passOp = VK_STENCIL_OP_KEEP;
478 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
479 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600480
481 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
482 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600483 ds_ci.pNext = NULL;
484 ds_ci.depthTestEnable = VK_FALSE;
485 ds_ci.depthWriteEnable = VK_TRUE;
486 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
487 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600488 if (failMask & BsoFailDepthBounds) {
489 ds_ci.depthBoundsTestEnable = VK_TRUE;
490 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600491 ds_ci.stencilTestEnable = VK_TRUE;
492 ds_ci.front = stencil;
493 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600494
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600495 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600496 pipelineobj.SetViewport(m_viewports);
497 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800498 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700499 VkResult err = pipelineobj.CreateVKPipeline(
500 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600501 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800502 commandBuffer->BindPipeline(pipelineobj);
503 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500504}
505
506// ********************************************************************************************************************
507// ********************************************************************************************************************
508// ********************************************************************************************************************
509// ********************************************************************************************************************
Tobin Ehlis0788f522015-05-26 16:11:58 -0600510#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700511#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800512TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500513{
514 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500515 VkFenceCreateInfo fenceInfo = {};
516 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
517 fenceInfo.pNext = NULL;
518 fenceInfo.flags = 0;
519
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700520 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600521
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500522 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600523
524 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
525 vk_testing::Buffer buffer;
526 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500527
Tony Barbourfe3351b2015-07-28 10:17:20 -0600528 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800529 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600530 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500531
532 testFence.init(*m_device, fenceInfo);
533
534 // Bypass framework since it does the waits automatically
535 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600536 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800537 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
538 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800539 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600540 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700541 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800542 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800543 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800544 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600545 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600546
547 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500548 ASSERT_VK_SUCCESS( err );
549
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500550 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800551 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500552
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200553 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500554}
555
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800556TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500557{
558 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500559 VkFenceCreateInfo fenceInfo = {};
560 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
561 fenceInfo.pNext = NULL;
562 fenceInfo.flags = 0;
563
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700564 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600565
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500566 ASSERT_NO_FATAL_FAILURE(InitState());
567 ASSERT_NO_FATAL_FAILURE(InitViewport());
568 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
569
Tony Barbourfe3351b2015-07-28 10:17:20 -0600570 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800571 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600572 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500573
574 testFence.init(*m_device, fenceInfo);
575
576 // Bypass framework since it does the waits automatically
577 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600578 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800579 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
580 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800581 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600582 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700583 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800584 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800585 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800586 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600587 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600588
589 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500590 ASSERT_VK_SUCCESS( err );
591
Jon Ashburnf19916e2016-01-11 13:12:43 -0700592 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800593 VkCommandBufferBeginInfo info = {};
594 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
595 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600596 info.renderPass = VK_NULL_HANDLE;
597 info.subpass = 0;
598 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800599 info.occlusionQueryEnable = VK_FALSE;
600 info.queryFlags = 0;
601 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600602
603 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800604 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500605
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200606 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500607}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700608#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200609
Karl Schultz6addd812016-02-02 17:17:23 -0700610TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
611 VkResult err;
612 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500613
Karl Schultz6addd812016-02-02 17:17:23 -0700614 m_errorMonitor->SetDesiredFailureMsg(
615 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600616 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
617
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500618 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500619
620 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700621 VkImage image;
622 VkDeviceMemory mem;
623 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500624
Karl Schultz6addd812016-02-02 17:17:23 -0700625 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
626 const int32_t tex_width = 32;
627 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500628
Tony Barboureb254902015-07-15 12:50:33 -0600629 VkImageCreateInfo image_create_info = {};
630 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700631 image_create_info.pNext = NULL;
632 image_create_info.imageType = VK_IMAGE_TYPE_2D;
633 image_create_info.format = tex_format;
634 image_create_info.extent.width = tex_width;
635 image_create_info.extent.height = tex_height;
636 image_create_info.extent.depth = 1;
637 image_create_info.mipLevels = 1;
638 image_create_info.arrayLayers = 1;
639 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
640 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
641 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
642 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600643
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800644 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800645 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700646 mem_alloc.pNext = NULL;
647 mem_alloc.allocationSize = 0;
648 // Introduce failure, do NOT set memProps to
649 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
650 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500651
Chia-I Wuf7458c52015-10-26 21:10:41 +0800652 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500653 ASSERT_VK_SUCCESS(err);
654
Karl Schultz6addd812016-02-02 17:17:23 -0700655 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500656
Mark Lobodzinski23065352015-05-29 09:32:35 -0500657 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500658
Karl Schultz6addd812016-02-02 17:17:23 -0700659 pass =
660 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
661 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
662 if (!pass) { // If we can't find any unmappable memory this test doesn't
663 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +0800664 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -0600665 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -0600666 }
Mike Stroyan713b2d72015-08-04 10:49:29 -0600667
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500668 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800669 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500670 ASSERT_VK_SUCCESS(err);
671
672 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -0600673 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500674 ASSERT_VK_SUCCESS(err);
675
676 // Map memory as if to initialize the image
677 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -0700678 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
679 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500680
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200681 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600682
Chia-I Wuf7458c52015-10-26 21:10:41 +0800683 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500684}
685
Karl Schultz6addd812016-02-02 17:17:23 -0700686TEST_F(VkLayerTest, RebindMemory) {
687 VkResult err;
688 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500689
Karl Schultz6addd812016-02-02 17:17:23 -0700690 m_errorMonitor->SetDesiredFailureMsg(
691 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600692 "which has already been bound to mem object");
693
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500694 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500695
696 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700697 VkImage image;
698 VkDeviceMemory mem1;
699 VkDeviceMemory mem2;
700 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500701
Karl Schultz6addd812016-02-02 17:17:23 -0700702 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
703 const int32_t tex_width = 32;
704 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500705
Tony Barboureb254902015-07-15 12:50:33 -0600706 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700707 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
708 image_create_info.pNext = NULL;
709 image_create_info.imageType = VK_IMAGE_TYPE_2D;
710 image_create_info.format = tex_format;
711 image_create_info.extent.width = tex_width;
712 image_create_info.extent.height = tex_height;
713 image_create_info.extent.depth = 1;
714 image_create_info.mipLevels = 1;
715 image_create_info.arrayLayers = 1;
716 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
717 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
718 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
719 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500720
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800721 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700722 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
723 mem_alloc.pNext = NULL;
724 mem_alloc.allocationSize = 0;
725 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -0600726
Karl Schultz6addd812016-02-02 17:17:23 -0700727 // Introduce failure, do NOT set memProps to
728 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -0600729 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800730 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500731 ASSERT_VK_SUCCESS(err);
732
Karl Schultz6addd812016-02-02 17:17:23 -0700733 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500734
735 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -0700736 pass =
737 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -0600738 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500739
740 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800741 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500742 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800743 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500744 ASSERT_VK_SUCCESS(err);
745
746 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -0600747 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500748 ASSERT_VK_SUCCESS(err);
749
Karl Schultz6addd812016-02-02 17:17:23 -0700750 // Introduce validation failure, try to bind a different memory object to
751 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -0600752 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500753
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200754 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600755
Chia-I Wuf7458c52015-10-26 21:10:41 +0800756 vkDestroyImage(m_device->device(), image, NULL);
757 vkFreeMemory(m_device->device(), mem1, NULL);
758 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500759}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500760
Karl Schultz6addd812016-02-02 17:17:23 -0700761TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600762 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600763
Karl Schultz6addd812016-02-02 17:17:23 -0700764 m_errorMonitor->SetDesiredFailureMsg(
765 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
766 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600767
768 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600769 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
770 fenceInfo.pNext = NULL;
771 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -0600772
Tony Barbour300a6082015-04-07 13:44:53 -0600773 ASSERT_NO_FATAL_FAILURE(InitState());
774 ASSERT_NO_FATAL_FAILURE(InitViewport());
775 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
776
Tony Barbourfe3351b2015-07-28 10:17:20 -0600777 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -0700778 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
779 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600780 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600781
782 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600783
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600784 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800785 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
786 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800787 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600788 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700789 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800790 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800791 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800792 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600793 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600794
795 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -0700796 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600797
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200798 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600799}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600800// This is a positive test. We used to expect error in this case but spec now
801// allows it
Karl Schultz6addd812016-02-02 17:17:23 -0700802TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600803 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600804 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600805 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600806 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
807 fenceInfo.pNext = NULL;
808
Tony Barbour0b4d9562015-04-09 10:48:04 -0600809 ASSERT_NO_FATAL_FAILURE(InitState());
810 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +0800811 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600812 VkResult result = vkResetFences(m_device->device(), 1, fences);
813 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -0600814
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600815 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -0600816}
Tobin Ehlis41376e12015-07-03 08:45:14 -0600817
Chia-I Wu08accc62015-07-07 11:50:03 +0800818/* TODO: Update for changes due to bug-14075 tiling across render passes */
819#if 0
Tobin Ehlis41376e12015-07-03 08:45:14 -0600820TEST_F(VkLayerTest, InvalidUsageBits)
821{
822 // Initiate Draw w/o a PSO bound
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600823
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600825 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -0600826
827 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800828 VkCommandBufferObj commandBuffer(m_device);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600829 BeginCommandBuffer();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600830
831 const VkExtent3D e3d = {
832 .width = 128,
833 .height = 128,
834 .depth = 1,
835 };
836 const VkImageCreateInfo ici = {
837 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
838 .pNext = NULL,
839 .imageType = VK_IMAGE_TYPE_2D,
840 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
841 .extent = e3d,
842 .mipLevels = 1,
843 .arraySize = 1,
Chia-I Wu5c17c962015-10-31 00:31:16 +0800844 .samples = VK_SAMPLE_COUNT_1_BIT,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600845 .tiling = VK_IMAGE_TILING_LINEAR,
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600846 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
Tobin Ehlis41376e12015-07-03 08:45:14 -0600847 .flags = 0,
848 };
849
850 VkImage dsi;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800851 vkCreateImage(m_device->device(), &ici, NULL, &dsi);
Tobin Ehlis41376e12015-07-03 08:45:14 -0600852 VkDepthStencilView dsv;
853 const VkDepthStencilViewCreateInfo dsvci = {
854 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
855 .pNext = NULL,
856 .image = dsi,
857 .mipLevel = 0,
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -0600858 .baseArrayLayer = 0,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600859 .arraySize = 1,
860 .flags = 0,
861 };
Chia-I Wuf7458c52015-10-26 21:10:41 +0800862 vkCreateDepthStencilView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600863
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200864 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600865}
Mark Lobodzinski209b5292015-09-17 09:44:05 -0600866#endif // 0
867#endif // MEM_TRACKER_TESTS
868
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600869#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -0700870TEST_F(VkLayerTest, PipelineNotBound) {
871 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600872
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -0700874 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600875
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600876 ASSERT_NO_FATAL_FAILURE(InitState());
877 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600878
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800879 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700880 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
881 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600882
883 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700884 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
885 ds_pool_ci.pNext = NULL;
886 ds_pool_ci.maxSets = 1;
887 ds_pool_ci.poolSizeCount = 1;
888 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600889
890 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -0700891 err =
892 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600893 ASSERT_VK_SUCCESS(err);
894
895 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700896 dsl_binding.binding = 0;
897 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
898 dsl_binding.descriptorCount = 1;
899 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
900 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600901
902 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700903 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
904 ds_layout_ci.pNext = NULL;
905 ds_layout_ci.bindingCount = 1;
906 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600907
908 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700909 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
910 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600911 ASSERT_VK_SUCCESS(err);
912
913 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800914 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800915 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -0700916 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -0600917 alloc_info.descriptorPool = ds_pool;
918 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700919 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
920 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600921 ASSERT_VK_SUCCESS(err);
922
923 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700924 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
925 pipeline_layout_ci.pNext = NULL;
926 pipeline_layout_ci.setLayoutCount = 1;
927 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600928
929 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700930 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
931 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600932 ASSERT_VK_SUCCESS(err);
933
Mark Youngad779052016-01-06 14:26:04 -0700934 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600935
936 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -0700937 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
938 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600939
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200940 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600941
Chia-I Wuf7458c52015-10-26 21:10:41 +0800942 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
943 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
944 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -0600945}
946
Karl Schultz6addd812016-02-02 17:17:23 -0700947TEST_F(VkLayerTest, BindInvalidMemory) {
948 VkResult err;
949 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -0600950
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700951 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -0700952 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600953
Tobin Ehlisec598302015-09-15 15:02:17 -0600954 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -0600955
956 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700957 VkImage image;
958 VkDeviceMemory mem;
959 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -0600960
Karl Schultz6addd812016-02-02 17:17:23 -0700961 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
962 const int32_t tex_width = 32;
963 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -0600964
965 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700966 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
967 image_create_info.pNext = NULL;
968 image_create_info.imageType = VK_IMAGE_TYPE_2D;
969 image_create_info.format = tex_format;
970 image_create_info.extent.width = tex_width;
971 image_create_info.extent.height = tex_height;
972 image_create_info.extent.depth = 1;
973 image_create_info.mipLevels = 1;
974 image_create_info.arrayLayers = 1;
975 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
976 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
977 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
978 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -0600979
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800980 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700981 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
982 mem_alloc.pNext = NULL;
983 mem_alloc.allocationSize = 0;
984 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -0600985
Chia-I Wuf7458c52015-10-26 21:10:41 +0800986 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -0600987 ASSERT_VK_SUCCESS(err);
988
Karl Schultz6addd812016-02-02 17:17:23 -0700989 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -0600990
991 mem_alloc.allocationSize = mem_reqs.size;
992
Karl Schultz6addd812016-02-02 17:17:23 -0700993 pass =
994 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -0600995 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -0600996
997 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800998 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -0600999 ASSERT_VK_SUCCESS(err);
1000
1001 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001002 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001003
1004 // Try to bind free memory that has been freed
1005 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1006 // This may very well return an error.
1007 (void)err;
1008
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001009 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001010
Chia-I Wuf7458c52015-10-26 21:10:41 +08001011 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001012}
1013
Karl Schultz6addd812016-02-02 17:17:23 -07001014TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1015 VkResult err;
1016 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001017
Karl Schultz6addd812016-02-02 17:17:23 -07001018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1019 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001020
Tobin Ehlisec598302015-09-15 15:02:17 -06001021 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001022
Karl Schultz6addd812016-02-02 17:17:23 -07001023 // Create an image object, allocate memory, destroy the object and then try
1024 // to bind it
1025 VkImage image;
1026 VkDeviceMemory mem;
1027 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001028
Karl Schultz6addd812016-02-02 17:17:23 -07001029 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1030 const int32_t tex_width = 32;
1031 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001032
1033 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001034 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1035 image_create_info.pNext = NULL;
1036 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1037 image_create_info.format = tex_format;
1038 image_create_info.extent.width = tex_width;
1039 image_create_info.extent.height = tex_height;
1040 image_create_info.extent.depth = 1;
1041 image_create_info.mipLevels = 1;
1042 image_create_info.arrayLayers = 1;
1043 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1044 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1045 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1046 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001047
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001048 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001049 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1050 mem_alloc.pNext = NULL;
1051 mem_alloc.allocationSize = 0;
1052 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001053
Chia-I Wuf7458c52015-10-26 21:10:41 +08001054 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001055 ASSERT_VK_SUCCESS(err);
1056
Karl Schultz6addd812016-02-02 17:17:23 -07001057 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001058
1059 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001060 pass =
1061 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001062 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001063
1064 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001065 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001066 ASSERT_VK_SUCCESS(err);
1067
1068 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001069 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001070 ASSERT_VK_SUCCESS(err);
1071
1072 // Now Try to bind memory to this destroyed object
1073 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1074 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001075 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001076
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001077 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001078
Chia-I Wuf7458c52015-10-26 21:10:41 +08001079 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001080}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001081
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001082#endif // OBJ_TRACKER_TESTS
1083
Tobin Ehlis0788f522015-05-26 16:11:58 -06001084#if DRAW_STATE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07001085TEST_F(VkLayerTest, LineWidthStateNotBound) {
1086 m_errorMonitor->SetDesiredFailureMsg(
1087 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001088 "Dynamic line width state not set for this command buffer");
1089
Karl Schultz6addd812016-02-02 17:17:23 -07001090 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line "
1091 "width state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001092
Karl Schultz6addd812016-02-02 17:17:23 -07001093 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1094 BsoFailLineWidth);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001095
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001096 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001097}
1098
Karl Schultz6addd812016-02-02 17:17:23 -07001099TEST_F(VkLayerTest, DepthBiasStateNotBound) {
1100 m_errorMonitor->SetDesiredFailureMsg(
1101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001102 "Dynamic depth bias state not set for this command buffer");
1103
Karl Schultz6addd812016-02-02 17:17:23 -07001104 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
1105 "bias state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001106
Karl Schultz6addd812016-02-02 17:17:23 -07001107 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1108 BsoFailDepthBias);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001109
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001110 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001111}
1112
Karl Schultz6addd812016-02-02 17:17:23 -07001113// Disable these two tests until we can sort out how to track multiple layer
1114// errors
1115TEST_F(VkLayerTest, ViewportStateNotBound) {
1116 m_errorMonitor->SetDesiredFailureMsg(
1117 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001118 "Dynamic viewport state not set for this command buffer");
1119
Karl Schultz6addd812016-02-02 17:17:23 -07001120 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1121 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001122
Karl Schultz6addd812016-02-02 17:17:23 -07001123 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1124 BsoFailViewport);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001125
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001126 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001127}
1128
Karl Schultz6addd812016-02-02 17:17:23 -07001129TEST_F(VkLayerTest, ScissorStateNotBound) {
1130 m_errorMonitor->SetDesiredFailureMsg(
1131 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001132 "Dynamic scissor state not set for this command buffer");
1133
Karl Schultz6addd812016-02-02 17:17:23 -07001134 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1135 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001136
Karl Schultz6addd812016-02-02 17:17:23 -07001137 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1138 BsoFailScissor);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001139
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001140 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001141}
1142
Karl Schultz6addd812016-02-02 17:17:23 -07001143TEST_F(VkLayerTest, BlendStateNotBound) {
1144 m_errorMonitor->SetDesiredFailureMsg(
1145 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7a1d2352016-03-28 11:18:19 -06001146 "Dynamic blend constants state not set for this command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001147
Karl Schultz6addd812016-02-02 17:17:23 -07001148 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend "
1149 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001150
Karl Schultz6addd812016-02-02 17:17:23 -07001151 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1152 BsoFailBlend);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001153
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001154 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001155}
1156
Karl Schultz6addd812016-02-02 17:17:23 -07001157TEST_F(VkLayerTest, DepthBoundsStateNotBound) {
1158 m_errorMonitor->SetDesiredFailureMsg(
1159 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001160 "Dynamic depth bounds state not set for this command buffer");
1161
Karl Schultz6addd812016-02-02 17:17:23 -07001162 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
1163 "bounds state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001164
Karl Schultz6addd812016-02-02 17:17:23 -07001165 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1166 BsoFailDepthBounds);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001167
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001168 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001169}
1170
Karl Schultz6addd812016-02-02 17:17:23 -07001171TEST_F(VkLayerTest, StencilReadMaskNotSet) {
1172 m_errorMonitor->SetDesiredFailureMsg(
1173 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001174 "Dynamic stencil read mask state not set for this command buffer");
1175
Tobin Ehlis963a4042015-09-29 08:18:34 -06001176 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001177
Karl Schultz6addd812016-02-02 17:17:23 -07001178 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1179 "read mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001180
Karl Schultz6addd812016-02-02 17:17:23 -07001181 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1182 BsoFailStencilReadMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001183
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001184 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001185}
1186
Karl Schultz6addd812016-02-02 17:17:23 -07001187TEST_F(VkLayerTest, StencilWriteMaskNotSet) {
1188 m_errorMonitor->SetDesiredFailureMsg(
1189 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001190 "Dynamic stencil write mask state not set for this command buffer");
1191
Tobin Ehlis963a4042015-09-29 08:18:34 -06001192 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001193
Karl Schultz6addd812016-02-02 17:17:23 -07001194 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1195 "write mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001196
Karl Schultz6addd812016-02-02 17:17:23 -07001197 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1198 BsoFailStencilWriteMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001199
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001200 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001201}
1202
Karl Schultz6addd812016-02-02 17:17:23 -07001203TEST_F(VkLayerTest, StencilReferenceNotSet) {
1204 m_errorMonitor->SetDesiredFailureMsg(
1205 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001206 "Dynamic stencil reference state not set for this command buffer");
1207
Karl Schultz6addd812016-02-02 17:17:23 -07001208 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1209 "reference is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001210
Karl Schultz6addd812016-02-02 17:17:23 -07001211 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1212 BsoFailStencilReference);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001213
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001214 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001215}
1216
Karl Schultz6addd812016-02-02 17:17:23 -07001217TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001218 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001219
Karl Schultz6addd812016-02-02 17:17:23 -07001220 m_errorMonitor->SetDesiredFailureMsg(
1221 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1222 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
1223 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001224
1225 VkFenceCreateInfo fenceInfo = {};
1226 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1227 fenceInfo.pNext = NULL;
1228 fenceInfo.flags = 0;
1229
1230 ASSERT_NO_FATAL_FAILURE(InitState());
1231 ASSERT_NO_FATAL_FAILURE(InitViewport());
1232 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1233
Karl Schultz6addd812016-02-02 17:17:23 -07001234 // We luck out b/c by default the framework creates CB w/ the
1235 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001236 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001237 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1238 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001239 EndCommandBuffer();
1240
1241 testFence.init(*m_device, fenceInfo);
1242
1243 // Bypass framework since it does the waits automatically
1244 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001245 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001246 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1247 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001248 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001249 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001250 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001251 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001252 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001253 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001254 submit_info.pSignalSemaphores = NULL;
1255
Karl Schultz6addd812016-02-02 17:17:23 -07001256 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
1257 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001258
Karl Schultz6addd812016-02-02 17:17:23 -07001259 // Cause validation error by re-submitting cmd buffer that should only be
1260 // submitted once
1261 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001262
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001263 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001264}
1265
Karl Schultz6addd812016-02-02 17:17:23 -07001266TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001267 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07001268 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001269
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001271 "Unable to allocate 1 descriptors of "
1272 "type "
1273 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001274
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001275 ASSERT_NO_FATAL_FAILURE(InitState());
1276 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001277
Karl Schultz6addd812016-02-02 17:17:23 -07001278 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
1279 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001280 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001281 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
1282 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001283
1284 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001285 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1286 ds_pool_ci.pNext = NULL;
1287 ds_pool_ci.flags = 0;
1288 ds_pool_ci.maxSets = 1;
1289 ds_pool_ci.poolSizeCount = 1;
1290 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001291
1292 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001293 err =
1294 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001295 ASSERT_VK_SUCCESS(err);
1296
1297 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001298 dsl_binding.binding = 0;
1299 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1300 dsl_binding.descriptorCount = 1;
1301 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1302 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001303
1304 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001305 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1306 ds_layout_ci.pNext = NULL;
1307 ds_layout_ci.bindingCount = 1;
1308 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001309
1310 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001311 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1312 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001313 ASSERT_VK_SUCCESS(err);
1314
1315 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001316 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001317 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001318 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001319 alloc_info.descriptorPool = ds_pool;
1320 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001321 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1322 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001323
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001324 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001325
Chia-I Wuf7458c52015-10-26 21:10:41 +08001326 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1327 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001328}
1329
Karl Schultz6addd812016-02-02 17:17:23 -07001330TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
1331 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06001332
Karl Schultz6addd812016-02-02 17:17:23 -07001333 m_errorMonitor->SetDesiredFailureMsg(
1334 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1335 "It is invalid to call vkFreeDescriptorSets() with a pool created "
1336 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001337
Tobin Ehlise735c692015-10-08 13:13:50 -06001338 ASSERT_NO_FATAL_FAILURE(InitState());
1339 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06001340
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001341 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001342 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1343 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06001344
1345 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001346 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1347 ds_pool_ci.pNext = NULL;
1348 ds_pool_ci.maxSets = 1;
1349 ds_pool_ci.poolSizeCount = 1;
1350 ds_pool_ci.flags = 0;
1351 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
1352 // app can only call vkResetDescriptorPool on this pool.;
1353 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06001354
1355 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001356 err =
1357 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06001358 ASSERT_VK_SUCCESS(err);
1359
1360 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001361 dsl_binding.binding = 0;
1362 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1363 dsl_binding.descriptorCount = 1;
1364 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1365 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06001366
1367 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001368 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1369 ds_layout_ci.pNext = NULL;
1370 ds_layout_ci.bindingCount = 1;
1371 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06001372
1373 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001374 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1375 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06001376 ASSERT_VK_SUCCESS(err);
1377
1378 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001379 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001380 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001381 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001382 alloc_info.descriptorPool = ds_pool;
1383 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001384 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1385 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06001386 ASSERT_VK_SUCCESS(err);
1387
1388 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001389 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06001390
Chia-I Wuf7458c52015-10-26 21:10:41 +08001391 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1392 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06001393}
1394
Karl Schultz6addd812016-02-02 17:17:23 -07001395TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06001396 // Attempt to clear Descriptor Pool with bad object.
1397 // ObjectTracker should catch this.
1398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1399 "Invalid VkDescriptorPool Object 0xbaad6001");
1400 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
1401 vkResetDescriptorPool(device(), badPool, 0);
1402 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001403}
1404
Karl Schultz6addd812016-02-02 17:17:23 -07001405TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06001406 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
1407 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001408 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06001409 // call vkCmdBindDescriptorSets w/ false Descriptor Set
1410 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
1411 VkResult err;
1412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1413 "Invalid VkDescriptorSet Object 0xbaad6001");
1414
1415 ASSERT_NO_FATAL_FAILURE(InitState());
1416
1417 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
1418 layout_bindings[0].binding = 0;
1419 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1420 layout_bindings[0].descriptorCount = 1;
1421 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
1422 layout_bindings[0].pImmutableSamplers = NULL;
1423
1424 VkDescriptorSetLayout descriptor_set_layout;
1425 VkDescriptorSetLayoutCreateInfo dslci = {};
1426 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1427 dslci.pNext = NULL;
1428 dslci.bindingCount = 1;
1429 dslci.pBindings = layout_bindings;
1430 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
1431 assert(!err);
1432
1433 VkPipelineLayout pipeline_layout;
1434 VkPipelineLayoutCreateInfo plci = {};
1435 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1436 plci.pNext = NULL;
1437 plci.setLayoutCount = 1;
1438 plci.pSetLayouts = &descriptor_set_layout;
1439 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
1440 assert(!err);
1441
1442 BeginCommandBuffer();
1443 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
1444 pipeline_layout, 0, 1, &badSet, 0, NULL);
1445 m_errorMonitor->VerifyFound();
1446 EndCommandBuffer();
1447 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
1448 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001449}
1450
Karl Schultz6addd812016-02-02 17:17:23 -07001451TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06001452 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
1453 // ObjectTracker should catch this.
1454 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
1455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1456 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
1457
1458 VkPipelineLayout pipeline_layout;
1459 VkPipelineLayoutCreateInfo plci = {};
1460 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1461 plci.pNext = NULL;
1462 plci.setLayoutCount = 1;
1463 plci.pSetLayouts = &bad_layout;
1464 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
1465
1466 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001467}
1468
Karl Schultz6addd812016-02-02 17:17:23 -07001469TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06001470 // Attempt to bind an invalid Pipeline to a valid Command Buffer
1471 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001472 // Create a valid cmd buffer
1473 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultzbdb75952016-04-19 11:36:49 -06001474 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
1475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1476 "Invalid VkPipeline Object 0xbaad6001");
1477 ASSERT_NO_FATAL_FAILURE(InitState());
1478 BeginCommandBuffer();
1479 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1480 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
1481 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001482}
1483
Karl Schultz6addd812016-02-02 17:17:23 -07001484TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
1485 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
1486 // CommandBuffer
1487 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001488
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07001489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001490 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001491
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001492 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06001493 ASSERT_NO_FATAL_FAILURE(InitViewport());
1494 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001495 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001496 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1497 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06001498
1499 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001500 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1501 ds_pool_ci.pNext = NULL;
1502 ds_pool_ci.maxSets = 1;
1503 ds_pool_ci.poolSizeCount = 1;
1504 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06001505
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001506 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001507 err =
1508 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001509 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001510
Tony Barboureb254902015-07-15 12:50:33 -06001511 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001512 dsl_binding.binding = 0;
1513 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1514 dsl_binding.descriptorCount = 1;
1515 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1516 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001517
Tony Barboureb254902015-07-15 12:50:33 -06001518 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001519 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1520 ds_layout_ci.pNext = NULL;
1521 ds_layout_ci.bindingCount = 1;
1522 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001523 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001524 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1525 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001526 ASSERT_VK_SUCCESS(err);
1527
1528 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001529 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001530 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001531 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001532 alloc_info.descriptorPool = ds_pool;
1533 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001534 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1535 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001536 ASSERT_VK_SUCCESS(err);
1537
Tony Barboureb254902015-07-15 12:50:33 -06001538 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001539 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1540 pipeline_layout_ci.pNext = NULL;
1541 pipeline_layout_ci.setLayoutCount = 1;
1542 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001543
1544 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001545 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1546 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001547 ASSERT_VK_SUCCESS(err);
1548
Karl Schultz6addd812016-02-02 17:17:23 -07001549 VkShaderObj vs(m_device, bindStateVertShaderText,
1550 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06001551 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07001552 // on more devices
1553 VkShaderObj fs(m_device, bindStateFragShaderText,
1554 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001555
Tony Barbourc95e4ac2015-08-04 17:05:26 -06001556 VkPipelineObj pipe(m_device);
1557 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06001558 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06001559 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06001560 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06001561
1562 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001563 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1564 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
1565 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1566 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1567 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001568
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001569 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001570
Chia-I Wuf7458c52015-10-26 21:10:41 +08001571 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1572 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1573 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06001574}
1575
Karl Schultz6addd812016-02-02 17:17:23 -07001576TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001577 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07001578 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001579
Karl Schultz6addd812016-02-02 17:17:23 -07001580 m_errorMonitor->SetDesiredFailureMsg(
1581 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001582 "Attempt to update descriptor with invalid bufferView ");
1583
1584 ASSERT_NO_FATAL_FAILURE(InitState());
1585 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001586 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1587 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001588
1589 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001590 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1591 ds_pool_ci.pNext = NULL;
1592 ds_pool_ci.maxSets = 1;
1593 ds_pool_ci.poolSizeCount = 1;
1594 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001595
1596 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001597 err =
1598 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001599 ASSERT_VK_SUCCESS(err);
1600
1601 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001602 dsl_binding.binding = 0;
1603 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1604 dsl_binding.descriptorCount = 1;
1605 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1606 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001607
1608 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001609 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1610 ds_layout_ci.pNext = NULL;
1611 ds_layout_ci.bindingCount = 1;
1612 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001613 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001614 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1615 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001616 ASSERT_VK_SUCCESS(err);
1617
1618 VkDescriptorSet descriptorSet;
1619 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001620 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001621 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001622 alloc_info.descriptorPool = ds_pool;
1623 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001624 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1625 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001626 ASSERT_VK_SUCCESS(err);
1627
Karl Schultz6addd812016-02-02 17:17:23 -07001628 VkBufferView view =
1629 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001630 VkWriteDescriptorSet descriptor_write;
1631 memset(&descriptor_write, 0, sizeof(descriptor_write));
1632 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1633 descriptor_write.dstSet = descriptorSet;
1634 descriptor_write.dstBinding = 0;
1635 descriptor_write.descriptorCount = 1;
1636 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1637 descriptor_write.pTexelBufferView = &view;
1638
1639 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1640
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001641 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001642
1643 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1644 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1645}
1646
Karl Schultz6addd812016-02-02 17:17:23 -07001647TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
1648 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
1649 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07001650 // 1. No dynamicOffset supplied
1651 // 2. Too many dynamicOffsets supplied
1652 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07001653 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001655 " requires 1 dynamicOffsets, but only "
1656 "0 dynamicOffsets are left in "
1657 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001658
1659 ASSERT_NO_FATAL_FAILURE(InitState());
1660 ASSERT_NO_FATAL_FAILURE(InitViewport());
1661 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1662
1663 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001664 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1665 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001666
1667 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001668 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1669 ds_pool_ci.pNext = NULL;
1670 ds_pool_ci.maxSets = 1;
1671 ds_pool_ci.poolSizeCount = 1;
1672 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001673
1674 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001675 err =
1676 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001677 ASSERT_VK_SUCCESS(err);
1678
1679 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001680 dsl_binding.binding = 0;
1681 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1682 dsl_binding.descriptorCount = 1;
1683 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1684 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001685
1686 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001687 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1688 ds_layout_ci.pNext = NULL;
1689 ds_layout_ci.bindingCount = 1;
1690 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001691 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001692 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1693 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001694 ASSERT_VK_SUCCESS(err);
1695
1696 VkDescriptorSet descriptorSet;
1697 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001698 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001699 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001700 alloc_info.descriptorPool = ds_pool;
1701 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001702 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1703 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001704 ASSERT_VK_SUCCESS(err);
1705
1706 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001707 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1708 pipeline_layout_ci.pNext = NULL;
1709 pipeline_layout_ci.setLayoutCount = 1;
1710 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001711
1712 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001713 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1714 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001715 ASSERT_VK_SUCCESS(err);
1716
1717 // Create a buffer to update the descriptor with
1718 uint32_t qfi = 0;
1719 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001720 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1721 buffCI.size = 1024;
1722 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1723 buffCI.queueFamilyIndexCount = 1;
1724 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001725
1726 VkBuffer dyub;
1727 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
1728 ASSERT_VK_SUCCESS(err);
1729 // Correctly update descriptor to avoid "NOT_UPDATED" error
1730 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001731 buffInfo.buffer = dyub;
1732 buffInfo.offset = 0;
1733 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001734
1735 VkWriteDescriptorSet descriptor_write;
1736 memset(&descriptor_write, 0, sizeof(descriptor_write));
1737 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1738 descriptor_write.dstSet = descriptorSet;
1739 descriptor_write.dstBinding = 0;
1740 descriptor_write.descriptorCount = 1;
1741 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1742 descriptor_write.pBufferInfo = &buffInfo;
1743
1744 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1745
1746 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001747 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1748 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1749 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001750 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07001751 uint32_t pDynOff[2] = {512, 756};
1752 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07001753 m_errorMonitor->SetDesiredFailureMsg(
1754 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07001755 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07001756 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1757 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1758 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12001759 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07001760 // Finally cause error due to dynamicOffset being too big
Karl Schultz6addd812016-02-02 17:17:23 -07001761 m_errorMonitor->SetDesiredFailureMsg(
1762 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07001763 " from its update, this oversteps its buffer (");
1764 // Create PSO to be used for draw-time errors below
1765 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12001766 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07001767 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07001768 "out gl_PerVertex { \n"
1769 " vec4 gl_Position;\n"
1770 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07001771 "void main(){\n"
1772 " gl_Position = vec4(1);\n"
1773 "}\n";
1774 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12001775 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07001776 "\n"
1777 "layout(location=0) out vec4 x;\n"
1778 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
1779 "void main(){\n"
1780 " x = vec4(bar.y);\n"
1781 "}\n";
1782 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
1783 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1784 VkPipelineObj pipe(m_device);
1785 pipe.AddShader(&vs);
1786 pipe.AddShader(&fs);
1787 pipe.AddColorAttachment();
1788 pipe.CreateVKPipeline(pipeline_layout, renderPass());
1789
Karl Schultz6addd812016-02-02 17:17:23 -07001790 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1791 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
1792 // This update should succeed, but offset size of 512 will overstep buffer
1793 // /w range 1024 & size 1024
1794 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1795 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1796 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07001797 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001798 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001799
1800 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1801 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1802}
1803
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07001804TEST_F(VkLayerTest, InvalidPushConstants) {
1805 // Hit push constant error cases:
1806 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
1807 // 2. Incorrectly set push constant size to 0
1808 // 3. Incorrectly set push constant size to non-multiple of 4
1809 // 4. Attempt push constant update that exceeds maxPushConstantSize
1810 VkResult err;
1811 m_errorMonitor->SetDesiredFailureMsg(
1812 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1813 "vkCreatePipelineLayout() call has push constants with offset ");
1814
1815 ASSERT_NO_FATAL_FAILURE(InitState());
1816 ASSERT_NO_FATAL_FAILURE(InitViewport());
1817 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1818
1819 VkPushConstantRange pc_range = {};
1820 pc_range.size = 0xFFFFFFFFu;
1821 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
1822 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1823 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1824 pipeline_layout_ci.pushConstantRangeCount = 1;
1825 pipeline_layout_ci.pPushConstantRanges = &pc_range;
1826
1827 VkPipelineLayout pipeline_layout;
1828 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1829 &pipeline_layout);
1830
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001831 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07001832 // Now cause errors due to size 0 and non-4 byte aligned size
1833 pc_range.size = 0;
1834 m_errorMonitor->SetDesiredFailureMsg(
1835 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1836 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
1837 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1838 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001839 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07001840 pc_range.size = 1;
1841 m_errorMonitor->SetDesiredFailureMsg(
1842 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1843 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
1844 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1845 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001846 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07001847 // Cause error due to bad size in vkCmdPushConstants() call
1848 m_errorMonitor->SetDesiredFailureMsg(
1849 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1850 "vkCmdPushConstants() call has push constants with offset ");
1851 pipeline_layout_ci.pushConstantRangeCount = 0;
1852 pipeline_layout_ci.pPushConstantRanges = NULL;
1853 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1854 &pipeline_layout);
1855 ASSERT_VK_SUCCESS(err);
1856 BeginCommandBuffer();
1857 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
1858 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001859 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07001860 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1861}
1862
Karl Schultz6addd812016-02-02 17:17:23 -07001863TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07001864 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07001865 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001866
1867 ASSERT_NO_FATAL_FAILURE(InitState());
1868 ASSERT_NO_FATAL_FAILURE(InitViewport());
1869 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1870
1871 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
1872 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001873 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1874 ds_type_count[0].descriptorCount = 10;
1875 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1876 ds_type_count[1].descriptorCount = 2;
1877 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
1878 ds_type_count[2].descriptorCount = 2;
1879 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
1880 ds_type_count[3].descriptorCount = 5;
1881 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
1882 // type
1883 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
1884 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1885 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001886
1887 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001888 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1889 ds_pool_ci.pNext = NULL;
1890 ds_pool_ci.maxSets = 5;
1891 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
1892 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001893
1894 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001895 err =
1896 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07001897 ASSERT_VK_SUCCESS(err);
1898
1899 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
1900 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001901 dsl_binding[0].binding = 0;
1902 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1903 dsl_binding[0].descriptorCount = 5;
1904 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
1905 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001906
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001907 // Create layout identical to set0 layout but w/ different stageFlags
1908 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001909 dsl_fs_stage_only.binding = 0;
1910 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1911 dsl_fs_stage_only.descriptorCount = 5;
1912 dsl_fs_stage_only.stageFlags =
1913 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
1914 // bind time
1915 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001916 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001917 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1918 ds_layout_ci.pNext = NULL;
1919 ds_layout_ci.bindingCount = 1;
1920 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001921 static const uint32_t NUM_LAYOUTS = 4;
1922 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001923 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001924 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
1925 // layout for error case
1926 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1927 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07001928 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07001929 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07001930 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1931 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001932 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07001933 dsl_binding[0].binding = 0;
1934 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001935 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07001936 dsl_binding[1].binding = 1;
1937 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
1938 dsl_binding[1].descriptorCount = 2;
1939 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
1940 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07001941 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001942 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07001943 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1944 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07001945 ASSERT_VK_SUCCESS(err);
1946 dsl_binding[0].binding = 0;
1947 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001948 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001949 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07001950 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1951 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07001952 ASSERT_VK_SUCCESS(err);
1953 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001954 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07001955 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1956 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07001957 ASSERT_VK_SUCCESS(err);
1958
1959 static const uint32_t NUM_SETS = 4;
1960 VkDescriptorSet descriptorSet[NUM_SETS] = {};
1961 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001962 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001963 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001964 alloc_info.descriptorPool = ds_pool;
1965 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001966 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1967 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07001968 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001969 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07001970 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001971 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07001972 err =
1973 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001974 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07001975
1976 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001977 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1978 pipeline_layout_ci.pNext = NULL;
1979 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
1980 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001981
1982 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001983 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1984 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07001985 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001986 // Create pipelineLayout with only one setLayout
1987 pipeline_layout_ci.setLayoutCount = 1;
1988 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001989 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1990 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001991 ASSERT_VK_SUCCESS(err);
1992 // Create pipelineLayout with 2 descriptor setLayout at index 0
1993 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
1994 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07001995 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1996 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001997 ASSERT_VK_SUCCESS(err);
1998 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
1999 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
2000 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07002001 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2002 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002003 ASSERT_VK_SUCCESS(err);
2004 // Create pipelineLayout with UB type, but stageFlags for FS only
2005 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
2006 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002007 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2008 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002009 ASSERT_VK_SUCCESS(err);
2010 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
2011 VkDescriptorSetLayout pl_bad_s0[2] = {};
2012 pl_bad_s0[0] = ds_layout_fs_only;
2013 pl_bad_s0[1] = ds_layout[1];
2014 pipeline_layout_ci.setLayoutCount = 2;
2015 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
2016 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07002017 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2018 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002019 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002020
2021 // Create a buffer to update the descriptor with
2022 uint32_t qfi = 0;
2023 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002024 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2025 buffCI.size = 1024;
2026 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2027 buffCI.queueFamilyIndexCount = 1;
2028 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002029
2030 VkBuffer dyub;
2031 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2032 ASSERT_VK_SUCCESS(err);
2033 // Correctly update descriptor to avoid "NOT_UPDATED" error
2034 static const uint32_t NUM_BUFFS = 5;
2035 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002036 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002037 buffInfo[i].buffer = dyub;
2038 buffInfo[i].offset = 0;
2039 buffInfo[i].range = 1024;
2040 }
Karl Schultz6addd812016-02-02 17:17:23 -07002041 VkImage image;
2042 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2043 const int32_t tex_width = 32;
2044 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002045 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002046 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2047 image_create_info.pNext = NULL;
2048 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2049 image_create_info.format = tex_format;
2050 image_create_info.extent.width = tex_width;
2051 image_create_info.extent.height = tex_height;
2052 image_create_info.extent.depth = 1;
2053 image_create_info.mipLevels = 1;
2054 image_create_info.arrayLayers = 1;
2055 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2056 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2057 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2058 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002059 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2060 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002061
Karl Schultz6addd812016-02-02 17:17:23 -07002062 VkMemoryRequirements memReqs;
2063 VkDeviceMemory imageMem;
2064 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002065 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002066 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2067 memAlloc.pNext = NULL;
2068 memAlloc.allocationSize = 0;
2069 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002070 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
2071 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002072 pass =
2073 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002074 ASSERT_TRUE(pass);
2075 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
2076 ASSERT_VK_SUCCESS(err);
2077 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
2078 ASSERT_VK_SUCCESS(err);
2079
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002080 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002081 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2082 image_view_create_info.image = image;
2083 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
2084 image_view_create_info.format = tex_format;
2085 image_view_create_info.subresourceRange.layerCount = 1;
2086 image_view_create_info.subresourceRange.baseMipLevel = 0;
2087 image_view_create_info.subresourceRange.levelCount = 1;
2088 image_view_create_info.subresourceRange.aspectMask =
2089 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002090
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002091 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07002092 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
2093 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002094 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002095 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002096 imageInfo[0].imageView = view;
2097 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2098 imageInfo[1].imageView = view;
2099 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002100 imageInfo[2].imageView = view;
2101 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2102 imageInfo[3].imageView = view;
2103 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002104
2105 static const uint32_t NUM_SET_UPDATES = 3;
2106 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
2107 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2108 descriptor_write[0].dstSet = descriptorSet[0];
2109 descriptor_write[0].dstBinding = 0;
2110 descriptor_write[0].descriptorCount = 5;
2111 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2112 descriptor_write[0].pBufferInfo = buffInfo;
2113 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2114 descriptor_write[1].dstSet = descriptorSet[1];
2115 descriptor_write[1].dstBinding = 0;
2116 descriptor_write[1].descriptorCount = 2;
2117 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2118 descriptor_write[1].pImageInfo = imageInfo;
2119 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2120 descriptor_write[2].dstSet = descriptorSet[1];
2121 descriptor_write[2].dstBinding = 1;
2122 descriptor_write[2].descriptorCount = 2;
2123 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002124 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002125
2126 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002127
Tobin Ehlis88452832015-12-03 09:40:56 -07002128 // Create PSO to be used for draw-time errors below
2129 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002130 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002131 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002132 "out gl_PerVertex {\n"
2133 " vec4 gl_Position;\n"
2134 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002135 "void main(){\n"
2136 " gl_Position = vec4(1);\n"
2137 "}\n";
2138 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002139 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002140 "\n"
2141 "layout(location=0) out vec4 x;\n"
2142 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2143 "void main(){\n"
2144 " x = vec4(bar.y);\n"
2145 "}\n";
2146 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2147 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002148 VkPipelineObj pipe(m_device);
2149 pipe.AddShader(&vs);
2150 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07002151 pipe.AddColorAttachment();
2152 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07002153
2154 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07002155
Karl Schultz6addd812016-02-02 17:17:23 -07002156 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2157 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2158 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
2159 // of PSO
2160 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
2161 // cmd_pipeline.c
2162 // due to the fact that cmd_alloc_dset_data() has not been called in
2163 // cmd_bind_graphics_pipeline()
2164 // TODO : Want to cause various binding incompatibility issues here to test
2165 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07002166 // First cause various verify_layout_compatibility() fails
2167 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002168 // verify_set_layout_compatibility fail cases:
2169 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07002170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2171 " due to: invalid VkPipelineLayout ");
2172 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2173 VK_PIPELINE_BIND_POINT_GRAPHICS,
2174 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
2175 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002176 m_errorMonitor->VerifyFound();
2177
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002178 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07002179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2180 " attempting to bind set to index 1");
2181 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2182 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
2183 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002184 m_errorMonitor->VerifyFound();
2185
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002186 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07002187 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
2188 // descriptors
2189 m_errorMonitor->SetDesiredFailureMsg(
2190 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2191 ", but corresponding set being bound has 5 descriptors.");
2192 vkCmdBindDescriptorSets(
2193 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2194 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002195 m_errorMonitor->VerifyFound();
2196
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002197 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
2198 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07002199 m_errorMonitor->SetDesiredFailureMsg(
2200 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2201 " descriptor from pipelineLayout is type 'VK_DESCRIPTOR_TYPE_SAMPLER'");
2202 vkCmdBindDescriptorSets(
2203 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2204 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002205 m_errorMonitor->VerifyFound();
2206
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002207 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
2208 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07002209 m_errorMonitor->SetDesiredFailureMsg(
2210 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2211 " descriptor from pipelineLayout has stageFlags ");
2212 vkCmdBindDescriptorSets(
2213 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2214 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002215 m_errorMonitor->VerifyFound();
2216
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002217 // Cause INFO messages due to disturbing previously bound Sets
2218 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07002219 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2220 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2221 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002222 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07002223 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002224 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002225 " previously bound as set #0 was disturbed ");
2226 vkCmdBindDescriptorSets(
2227 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2228 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002229 m_errorMonitor->VerifyFound();
2230
Karl Schultz6addd812016-02-02 17:17:23 -07002231 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2232 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2233 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002234 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002236 " newly bound as set #0 so set #1 and "
2237 "any subsequent sets were disturbed ");
2238 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2239 VK_PIPELINE_BIND_POINT_GRAPHICS,
2240 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002241 m_errorMonitor->VerifyFound();
2242
Tobin Ehlis88452832015-12-03 09:40:56 -07002243 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07002244 // 1. Error due to not binding required set (we actually use same code as
2245 // above to disturb set0)
2246 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2247 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2248 2, &descriptorSet[0], 0, NULL);
2249 vkCmdBindDescriptorSets(
2250 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2251 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
2252 m_errorMonitor->SetDesiredFailureMsg(
2253 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2254 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07002255 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002256 m_errorMonitor->VerifyFound();
2257
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002258 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07002259 // 2. Error due to bound set not being compatible with PSO's
2260 // VkPipelineLayout (diff stageFlags in this case)
2261 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2262 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2263 2, &descriptorSet[0], 0, NULL);
2264 m_errorMonitor->SetDesiredFailureMsg(
2265 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2266 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07002267 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002268 m_errorMonitor->VerifyFound();
2269
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002270 // Remaining clean-up
2271 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07002272 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002273 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
2274 }
2275 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
2276 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
2277 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002278 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2279 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2280}
Tobin Ehlis559c6382015-11-05 09:52:49 -07002281
Karl Schultz6addd812016-02-02 17:17:23 -07002282TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002283
Karl Schultz6addd812016-02-02 17:17:23 -07002284 m_errorMonitor->SetDesiredFailureMsg(
2285 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002286 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002287
2288 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002289 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002290 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002291 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002292
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002293 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002294}
2295
Karl Schultz6addd812016-02-02 17:17:23 -07002296TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
2297 VkResult err;
2298 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002299
Karl Schultz6addd812016-02-02 17:17:23 -07002300 m_errorMonitor->SetDesiredFailureMsg(
2301 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07002302 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002303
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002304 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002305
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002306 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002307 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06002308 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002309 cmd.commandPool = m_commandPool;
2310 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002311 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06002312
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002313 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06002314 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002315
2316 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002317 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002318 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002319 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06002320 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002321 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
2322 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002323 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002324
2325 // The error should be caught by validation of the BeginCommandBuffer call
2326 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
2327
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002328 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002329 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002330}
2331
Karl Schultz6addd812016-02-02 17:17:23 -07002332TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002333 // Cause error due to Begin while recording CB
2334 // Then cause 2 errors for attempting to reset CB w/o having
2335 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
2336 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002337 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002338 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002339
2340 ASSERT_NO_FATAL_FAILURE(InitState());
2341
2342 // Calls AllocateCommandBuffers
2343 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
2344
Karl Schultz6addd812016-02-02 17:17:23 -07002345 // Force the failure by setting the Renderpass and Framebuffer fields with
2346 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002347 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002348 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002349 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2350 cmd_buf_info.pNext = NULL;
2351 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002352 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002353
2354 // Begin CB to transition to recording state
2355 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
2356 // Can't re-begin. This should trigger error
2357 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002358 m_errorMonitor->VerifyFound();
2359
Karl Schultz6addd812016-02-02 17:17:23 -07002360 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2361 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002362 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
2363 // Reset attempt will trigger error due to incorrect CommandPool state
2364 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002365 m_errorMonitor->VerifyFound();
2366
Karl Schultz6addd812016-02-02 17:17:23 -07002367 m_errorMonitor->SetDesiredFailureMsg(
2368 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2369 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002370 // Transition CB to RECORDED state
2371 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
2372 // Now attempting to Begin will implicitly reset, which triggers error
2373 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002374 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002375}
2376
Karl Schultz6addd812016-02-02 17:17:23 -07002377TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002378 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07002379 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002380
Karl Schultz6addd812016-02-02 17:17:23 -07002381 m_errorMonitor->SetDesiredFailureMsg(
2382 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002383 "Invalid Pipeline CreateInfo State: Vtx Shader required");
2384
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002385 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002386 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002387
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002388 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002389 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2390 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002391
2392 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002393 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2394 ds_pool_ci.pNext = NULL;
2395 ds_pool_ci.maxSets = 1;
2396 ds_pool_ci.poolSizeCount = 1;
2397 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002398
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002399 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002400 err =
2401 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002402 ASSERT_VK_SUCCESS(err);
2403
Tony Barboureb254902015-07-15 12:50:33 -06002404 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002405 dsl_binding.binding = 0;
2406 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2407 dsl_binding.descriptorCount = 1;
2408 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2409 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002410
Tony Barboureb254902015-07-15 12:50:33 -06002411 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002412 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2413 ds_layout_ci.pNext = NULL;
2414 ds_layout_ci.bindingCount = 1;
2415 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06002416
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002417 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002418 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2419 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002420 ASSERT_VK_SUCCESS(err);
2421
2422 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002423 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002424 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002425 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002426 alloc_info.descriptorPool = ds_pool;
2427 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002428 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2429 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002430 ASSERT_VK_SUCCESS(err);
2431
Tony Barboureb254902015-07-15 12:50:33 -06002432 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002433 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2434 pipeline_layout_ci.setLayoutCount = 1;
2435 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002436
2437 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002438 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2439 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002440 ASSERT_VK_SUCCESS(err);
2441
Tobin Ehlise68360f2015-10-01 11:15:13 -06002442 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07002443 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06002444
2445 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002446 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2447 vp_state_ci.scissorCount = 1;
2448 vp_state_ci.pScissors = &sc;
2449 vp_state_ci.viewportCount = 1;
2450 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002451
Karl Schultzdfdb8d42016-03-08 10:30:21 -07002452 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
2453 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
2454 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
2455 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
2456 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
2457 rs_state_ci.depthClampEnable = VK_FALSE;
2458 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
2459 rs_state_ci.depthBiasEnable = VK_FALSE;
2460
Tony Barboureb254902015-07-15 12:50:33 -06002461 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002462 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2463 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07002464 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07002465 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2466 gp_ci.layout = pipeline_layout;
2467 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06002468
2469 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002470 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2471 pc_ci.initialDataSize = 0;
2472 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002473
2474 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06002475 VkPipelineCache pipelineCache;
2476
Karl Schultz6addd812016-02-02 17:17:23 -07002477 err =
2478 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06002479 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002480 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2481 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002482
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002483 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002484
Chia-I Wuf7458c52015-10-26 21:10:41 +08002485 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2486 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2487 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2488 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002489}
Tobin Ehlis912df022015-09-17 08:46:18 -06002490/*// TODO : This test should be good, but needs Tess support in compiler to run
2491TEST_F(VkLayerTest, InvalidPatchControlPoints)
2492{
2493 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06002494 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002495
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002497 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
2498primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002499
Tobin Ehlis912df022015-09-17 08:46:18 -06002500 ASSERT_NO_FATAL_FAILURE(InitState());
2501 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06002502
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002503 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06002504 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002505 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06002506
2507 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2508 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2509 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002510 ds_pool_ci.poolSizeCount = 1;
2511 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06002512
2513 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002514 err = vkCreateDescriptorPool(m_device->device(),
2515VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06002516 ASSERT_VK_SUCCESS(err);
2517
2518 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08002519 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06002520 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08002521 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06002522 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2523 dsl_binding.pImmutableSamplers = NULL;
2524
2525 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002526 ds_layout_ci.sType =
2527VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06002528 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002529 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002530 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06002531
2532 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002533 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2534&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06002535 ASSERT_VK_SUCCESS(err);
2536
2537 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07002538 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
2539VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06002540 ASSERT_VK_SUCCESS(err);
2541
2542 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002543 pipeline_layout_ci.sType =
2544VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06002545 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002546 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06002547 pipeline_layout_ci.pSetLayouts = &ds_layout;
2548
2549 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002550 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2551&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06002552 ASSERT_VK_SUCCESS(err);
2553
2554 VkPipelineShaderStageCreateInfo shaderStages[3];
2555 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
2556
Karl Schultz6addd812016-02-02 17:17:23 -07002557 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
2558this);
Tobin Ehlis912df022015-09-17 08:46:18 -06002559 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07002560 VkShaderObj
2561tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
2562this);
2563 VkShaderObj
2564te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
2565this);
Tobin Ehlis912df022015-09-17 08:46:18 -06002566
Karl Schultz6addd812016-02-02 17:17:23 -07002567 shaderStages[0].sType =
2568VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06002569 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06002570 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07002571 shaderStages[1].sType =
2572VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06002573 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06002574 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07002575 shaderStages[2].sType =
2576VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06002577 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06002578 shaderStages[2].shader = te.handle();
2579
2580 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002581 iaCI.sType =
2582VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08002583 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06002584
2585 VkPipelineTessellationStateCreateInfo tsCI = {};
2586 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
2587 tsCI.patchControlPoints = 0; // This will cause an error
2588
2589 VkGraphicsPipelineCreateInfo gp_ci = {};
2590 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2591 gp_ci.pNext = NULL;
2592 gp_ci.stageCount = 3;
2593 gp_ci.pStages = shaderStages;
2594 gp_ci.pVertexInputState = NULL;
2595 gp_ci.pInputAssemblyState = &iaCI;
2596 gp_ci.pTessellationState = &tsCI;
2597 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002598 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06002599 gp_ci.pMultisampleState = NULL;
2600 gp_ci.pDepthStencilState = NULL;
2601 gp_ci.pColorBlendState = NULL;
2602 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2603 gp_ci.layout = pipeline_layout;
2604 gp_ci.renderPass = renderPass();
2605
2606 VkPipelineCacheCreateInfo pc_ci = {};
2607 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2608 pc_ci.pNext = NULL;
2609 pc_ci.initialSize = 0;
2610 pc_ci.initialData = 0;
2611 pc_ci.maxSize = 0;
2612
2613 VkPipeline pipeline;
2614 VkPipelineCache pipelineCache;
2615
Karl Schultz6addd812016-02-02 17:17:23 -07002616 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
2617&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06002618 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002619 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2620&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06002621
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002622 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002623
Chia-I Wuf7458c52015-10-26 21:10:41 +08002624 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2625 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2626 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2627 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06002628}
2629*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06002630// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07002631TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07002632 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002633
Karl Schultz6addd812016-02-02 17:17:23 -07002634 m_errorMonitor->SetDesiredFailureMsg(
2635 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002636 "Gfx Pipeline viewport count (1) must match scissor count (0).");
2637
Tobin Ehlise68360f2015-10-01 11:15:13 -06002638 ASSERT_NO_FATAL_FAILURE(InitState());
2639 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06002640
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002641 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002642 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2643 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002644
2645 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002646 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2647 ds_pool_ci.maxSets = 1;
2648 ds_pool_ci.poolSizeCount = 1;
2649 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002650
2651 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002652 err =
2653 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002654 ASSERT_VK_SUCCESS(err);
2655
2656 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002657 dsl_binding.binding = 0;
2658 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2659 dsl_binding.descriptorCount = 1;
2660 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002661
2662 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002663 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2664 ds_layout_ci.bindingCount = 1;
2665 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002666
2667 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002668 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2669 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002670 ASSERT_VK_SUCCESS(err);
2671
2672 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002673 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002674 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002675 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002676 alloc_info.descriptorPool = ds_pool;
2677 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002678 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2679 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002680 ASSERT_VK_SUCCESS(err);
2681
2682 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002683 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2684 pipeline_layout_ci.setLayoutCount = 1;
2685 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002686
2687 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002688 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2689 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002690 ASSERT_VK_SUCCESS(err);
2691
2692 VkViewport vp = {}; // Just need dummy vp to point to
2693
2694 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002695 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2696 vp_state_ci.scissorCount = 0;
2697 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
2698 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002699
Karl Schultzdfdb8d42016-03-08 10:30:21 -07002700 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
2701 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
2702 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
2703 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
2704 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
2705 rs_state_ci.depthClampEnable = VK_FALSE;
2706 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
2707 rs_state_ci.depthBiasEnable = VK_FALSE;
2708
Cody Northropeb3a6c12015-10-05 14:44:45 -06002709 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07002710 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06002711
Karl Schultz6addd812016-02-02 17:17:23 -07002712 VkShaderObj vs(m_device, bindStateVertShaderText,
2713 VK_SHADER_STAGE_VERTEX_BIT, this);
2714 VkShaderObj fs(m_device, bindStateFragShaderText,
2715 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06002716 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07002717 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08002718 shaderStages[0] = vs.GetStageCreateInfo();
2719 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002720
2721 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002722 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2723 gp_ci.stageCount = 2;
2724 gp_ci.pStages = shaderStages;
2725 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07002726 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07002727 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2728 gp_ci.layout = pipeline_layout;
2729 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002730
2731 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002732 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002733
2734 VkPipeline pipeline;
2735 VkPipelineCache pipelineCache;
2736
Karl Schultz6addd812016-02-02 17:17:23 -07002737 err =
2738 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002739 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002740 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2741 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002742
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002743 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002744
Chia-I Wuf7458c52015-10-26 21:10:41 +08002745 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2746 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2747 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2748 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002749}
Karl Schultz6addd812016-02-02 17:17:23 -07002750// Don't set viewport state in PSO. This is an error b/c we always need this
2751// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06002752// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07002753TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06002754 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07002755 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002756
Karl Schultz6addd812016-02-02 17:17:23 -07002757 m_errorMonitor->SetDesiredFailureMsg(
2758 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002759 "Gfx Pipeline pViewportState is null. Even if ");
2760
Tobin Ehlise68360f2015-10-01 11:15:13 -06002761 ASSERT_NO_FATAL_FAILURE(InitState());
2762 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06002763
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002764 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002765 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2766 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002767
2768 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002769 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2770 ds_pool_ci.maxSets = 1;
2771 ds_pool_ci.poolSizeCount = 1;
2772 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002773
2774 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002775 err =
2776 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002777 ASSERT_VK_SUCCESS(err);
2778
2779 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002780 dsl_binding.binding = 0;
2781 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2782 dsl_binding.descriptorCount = 1;
2783 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002784
2785 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002786 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2787 ds_layout_ci.bindingCount = 1;
2788 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002789
2790 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002791 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2792 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002793 ASSERT_VK_SUCCESS(err);
2794
2795 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002796 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002797 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002798 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002799 alloc_info.descriptorPool = ds_pool;
2800 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002801 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2802 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002803 ASSERT_VK_SUCCESS(err);
2804
2805 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002806 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2807 pipeline_layout_ci.setLayoutCount = 1;
2808 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002809
2810 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002811 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2812 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002813 ASSERT_VK_SUCCESS(err);
2814
2815 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
2816 // Set scissor as dynamic to avoid second error
2817 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002818 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
2819 dyn_state_ci.dynamicStateCount = 1;
2820 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002821
Cody Northropeb3a6c12015-10-05 14:44:45 -06002822 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07002823 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06002824
Karl Schultz6addd812016-02-02 17:17:23 -07002825 VkShaderObj vs(m_device, bindStateVertShaderText,
2826 VK_SHADER_STAGE_VERTEX_BIT, this);
2827 VkShaderObj fs(m_device, bindStateFragShaderText,
2828 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06002829 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07002830 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08002831 shaderStages[0] = vs.GetStageCreateInfo();
2832 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002833
Karl Schultzdfdb8d42016-03-08 10:30:21 -07002834
2835 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
2836 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
2837 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
2838 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
2839 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
2840 rs_state_ci.depthClampEnable = VK_FALSE;
2841 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
2842 rs_state_ci.depthBiasEnable = VK_FALSE;
2843
Tobin Ehlise68360f2015-10-01 11:15:13 -06002844 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002845 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2846 gp_ci.stageCount = 2;
2847 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07002848 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07002849 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
2850 // should cause validation error
2851 gp_ci.pDynamicState = &dyn_state_ci;
2852 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2853 gp_ci.layout = pipeline_layout;
2854 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002855
2856 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002857 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002858
2859 VkPipeline pipeline;
2860 VkPipelineCache pipelineCache;
2861
Karl Schultz6addd812016-02-02 17:17:23 -07002862 err =
2863 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002864 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002865 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2866 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002867
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002868 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002869
Chia-I Wuf7458c52015-10-26 21:10:41 +08002870 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2871 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2872 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2873 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002874}
2875// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07002876// Then run second test where dynamic scissor count doesn't match PSO scissor
2877// count
2878TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
2879 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002880
Karl Schultz6addd812016-02-02 17:17:23 -07002881 m_errorMonitor->SetDesiredFailureMsg(
2882 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002883 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
2884
Tobin Ehlise68360f2015-10-01 11:15:13 -06002885 ASSERT_NO_FATAL_FAILURE(InitState());
2886 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06002887
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002888 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002889 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2890 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002891
2892 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002893 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2894 ds_pool_ci.maxSets = 1;
2895 ds_pool_ci.poolSizeCount = 1;
2896 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002897
2898 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002899 err =
2900 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002901 ASSERT_VK_SUCCESS(err);
2902
2903 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002904 dsl_binding.binding = 0;
2905 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2906 dsl_binding.descriptorCount = 1;
2907 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002908
2909 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002910 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2911 ds_layout_ci.bindingCount = 1;
2912 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002913
2914 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002915 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2916 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002917 ASSERT_VK_SUCCESS(err);
2918
2919 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002920 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002921 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002922 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002923 alloc_info.descriptorPool = ds_pool;
2924 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002925 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2926 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002927 ASSERT_VK_SUCCESS(err);
2928
2929 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002930 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2931 pipeline_layout_ci.setLayoutCount = 1;
2932 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002933
2934 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002935 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2936 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002937 ASSERT_VK_SUCCESS(err);
2938
2939 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002940 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2941 vp_state_ci.viewportCount = 1;
2942 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
2943 vp_state_ci.scissorCount = 1;
2944 vp_state_ci.pScissors =
2945 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06002946
2947 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
2948 // Set scissor as dynamic to avoid that error
2949 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002950 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
2951 dyn_state_ci.dynamicStateCount = 1;
2952 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002953
Cody Northropeb3a6c12015-10-05 14:44:45 -06002954 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07002955 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06002956
Karl Schultz6addd812016-02-02 17:17:23 -07002957 VkShaderObj vs(m_device, bindStateVertShaderText,
2958 VK_SHADER_STAGE_VERTEX_BIT, this);
2959 VkShaderObj fs(m_device, bindStateFragShaderText,
2960 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06002961 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07002962 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08002963 shaderStages[0] = vs.GetStageCreateInfo();
2964 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002965
Cody Northropf6622dc2015-10-06 10:33:21 -06002966 VkPipelineVertexInputStateCreateInfo vi_ci = {};
2967 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
2968 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002969 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06002970 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002971 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06002972 vi_ci.pVertexAttributeDescriptions = nullptr;
2973
2974 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
2975 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
2976 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
2977
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002978 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002979 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06002980 rs_ci.pNext = nullptr;
2981
Mark Youngc89c6312016-03-31 16:03:20 -06002982 VkPipelineColorBlendAttachmentState att = {};
2983 att.blendEnable = VK_FALSE;
2984 att.colorWriteMask = 0xf;
2985
Cody Northropf6622dc2015-10-06 10:33:21 -06002986 VkPipelineColorBlendStateCreateInfo cb_ci = {};
2987 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
2988 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06002989 cb_ci.attachmentCount = 1;
2990 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06002991
Tobin Ehlise68360f2015-10-01 11:15:13 -06002992 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002993 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2994 gp_ci.stageCount = 2;
2995 gp_ci.pStages = shaderStages;
2996 gp_ci.pVertexInputState = &vi_ci;
2997 gp_ci.pInputAssemblyState = &ia_ci;
2998 gp_ci.pViewportState = &vp_state_ci;
2999 gp_ci.pRasterizationState = &rs_ci;
3000 gp_ci.pColorBlendState = &cb_ci;
3001 gp_ci.pDynamicState = &dyn_state_ci;
3002 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3003 gp_ci.layout = pipeline_layout;
3004 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003005
3006 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003007 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003008
3009 VkPipeline pipeline;
3010 VkPipelineCache pipelineCache;
3011
Karl Schultz6addd812016-02-02 17:17:23 -07003012 err =
3013 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003014 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003015 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3016 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003017
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003018 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003019
Tobin Ehlisd332f282015-10-02 11:00:56 -06003020 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07003021 // First need to successfully create the PSO from above by setting
3022 // pViewports
3023 m_errorMonitor->SetDesiredFailureMsg(
3024 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3025 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
3026 "scissorCount is 1. These counts must match.");
3027
3028 VkViewport vp = {}; // Just need dummy vp to point to
3029 vp_state_ci.pViewports = &vp;
3030 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3031 &gp_ci, NULL, &pipeline);
3032 ASSERT_VK_SUCCESS(err);
3033 BeginCommandBuffer();
3034 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3035 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3036 VkRect2D scissors[2] = {}; // don't care about data
3037 // Count of 2 doesn't match PSO count of 1
3038 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
3039 Draw(1, 0, 0, 0);
3040
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003041 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07003042
3043 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3044 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3045 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3046 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3047}
3048// Create PSO w/o non-zero scissorCount but no scissor data
3049// Then run second test where dynamic viewportCount doesn't match PSO
3050// viewportCount
3051TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
3052 VkResult err;
3053
3054 m_errorMonitor->SetDesiredFailureMsg(
3055 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3056 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
3057
3058 ASSERT_NO_FATAL_FAILURE(InitState());
3059 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3060
3061 VkDescriptorPoolSize ds_type_count = {};
3062 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3063 ds_type_count.descriptorCount = 1;
3064
3065 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3066 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3067 ds_pool_ci.maxSets = 1;
3068 ds_pool_ci.poolSizeCount = 1;
3069 ds_pool_ci.pPoolSizes = &ds_type_count;
3070
3071 VkDescriptorPool ds_pool;
3072 err =
3073 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
3074 ASSERT_VK_SUCCESS(err);
3075
3076 VkDescriptorSetLayoutBinding dsl_binding = {};
3077 dsl_binding.binding = 0;
3078 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3079 dsl_binding.descriptorCount = 1;
3080 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3081
3082 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3083 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3084 ds_layout_ci.bindingCount = 1;
3085 ds_layout_ci.pBindings = &dsl_binding;
3086
3087 VkDescriptorSetLayout ds_layout;
3088 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3089 &ds_layout);
3090 ASSERT_VK_SUCCESS(err);
3091
3092 VkDescriptorSet descriptorSet;
3093 VkDescriptorSetAllocateInfo alloc_info = {};
3094 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3095 alloc_info.descriptorSetCount = 1;
3096 alloc_info.descriptorPool = ds_pool;
3097 alloc_info.pSetLayouts = &ds_layout;
3098 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3099 &descriptorSet);
3100 ASSERT_VK_SUCCESS(err);
3101
3102 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3103 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3104 pipeline_layout_ci.setLayoutCount = 1;
3105 pipeline_layout_ci.pSetLayouts = &ds_layout;
3106
3107 VkPipelineLayout pipeline_layout;
3108 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3109 &pipeline_layout);
3110 ASSERT_VK_SUCCESS(err);
3111
3112 VkPipelineViewportStateCreateInfo vp_state_ci = {};
3113 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3114 vp_state_ci.scissorCount = 1;
3115 vp_state_ci.pScissors =
3116 NULL; // Null scissor w/ count of 1 should cause error
3117 vp_state_ci.viewportCount = 1;
3118 vp_state_ci.pViewports =
3119 NULL; // vp is dynamic (below) so this won't cause error
3120
3121 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
3122 // Set scissor as dynamic to avoid that error
3123 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
3124 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3125 dyn_state_ci.dynamicStateCount = 1;
3126 dyn_state_ci.pDynamicStates = &vp_state;
3127
3128 VkPipelineShaderStageCreateInfo shaderStages[2];
3129 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
3130
3131 VkShaderObj vs(m_device, bindStateVertShaderText,
3132 VK_SHADER_STAGE_VERTEX_BIT, this);
3133 VkShaderObj fs(m_device, bindStateFragShaderText,
3134 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003135 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003136 // but add it to be able to run on more devices
3137 shaderStages[0] = vs.GetStageCreateInfo();
3138 shaderStages[1] = fs.GetStageCreateInfo();
3139
3140 VkPipelineVertexInputStateCreateInfo vi_ci = {};
3141 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
3142 vi_ci.pNext = nullptr;
3143 vi_ci.vertexBindingDescriptionCount = 0;
3144 vi_ci.pVertexBindingDescriptions = nullptr;
3145 vi_ci.vertexAttributeDescriptionCount = 0;
3146 vi_ci.pVertexAttributeDescriptions = nullptr;
3147
3148 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
3149 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
3150 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3151
3152 VkPipelineRasterizationStateCreateInfo rs_ci = {};
3153 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3154 rs_ci.pNext = nullptr;
3155
Mark Youngc89c6312016-03-31 16:03:20 -06003156 VkPipelineColorBlendAttachmentState att = {};
3157 att.blendEnable = VK_FALSE;
3158 att.colorWriteMask = 0xf;
3159
Karl Schultz6addd812016-02-02 17:17:23 -07003160 VkPipelineColorBlendStateCreateInfo cb_ci = {};
3161 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
3162 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06003163 cb_ci.attachmentCount = 1;
3164 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07003165
3166 VkGraphicsPipelineCreateInfo gp_ci = {};
3167 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3168 gp_ci.stageCount = 2;
3169 gp_ci.pStages = shaderStages;
3170 gp_ci.pVertexInputState = &vi_ci;
3171 gp_ci.pInputAssemblyState = &ia_ci;
3172 gp_ci.pViewportState = &vp_state_ci;
3173 gp_ci.pRasterizationState = &rs_ci;
3174 gp_ci.pColorBlendState = &cb_ci;
3175 gp_ci.pDynamicState = &dyn_state_ci;
3176 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3177 gp_ci.layout = pipeline_layout;
3178 gp_ci.renderPass = renderPass();
3179
3180 VkPipelineCacheCreateInfo pc_ci = {};
3181 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3182
3183 VkPipeline pipeline;
3184 VkPipelineCache pipelineCache;
3185
3186 err =
3187 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
3188 ASSERT_VK_SUCCESS(err);
3189 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3190 &gp_ci, NULL, &pipeline);
3191
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003192 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07003193
3194 // Now hit second fail case where we set scissor w/ different count than PSO
3195 // First need to successfully create the PSO from above by setting
3196 // pViewports
3197 m_errorMonitor->SetDesiredFailureMsg(
3198 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3199 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
3200 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003201
Tobin Ehlisd332f282015-10-02 11:00:56 -06003202 VkRect2D sc = {}; // Just need dummy vp to point to
3203 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07003204 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3205 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06003206 ASSERT_VK_SUCCESS(err);
3207 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003208 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3209 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06003210 VkViewport viewports[2] = {}; // don't care about data
3211 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07003212 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06003213 Draw(1, 0, 0, 0);
3214
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003215 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003216
Chia-I Wuf7458c52015-10-26 21:10:41 +08003217 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3218 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3219 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3220 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003221}
3222
Karl Schultz6addd812016-02-02 17:17:23 -07003223TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003224 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003225 m_errorMonitor->SetDesiredFailureMsg(
3226 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003227 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003228
3229 ASSERT_NO_FATAL_FAILURE(InitState());
3230 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003231
Tony Barbourfe3351b2015-07-28 10:17:20 -06003232 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003233 // Don't care about RenderPass handle b/c error should be flagged before
3234 // that
3235 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
3236 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003237
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003238 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003239}
3240
Karl Schultz6addd812016-02-02 17:17:23 -07003241TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003242 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003243 m_errorMonitor->SetDesiredFailureMsg(
3244 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003245 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003246
3247 ASSERT_NO_FATAL_FAILURE(InitState());
3248 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003249
Tony Barbourfe3351b2015-07-28 10:17:20 -06003250 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003251 // Just create a dummy Renderpass that's non-NULL so we can get to the
3252 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06003253 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003254 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
3255 rp_begin.pNext = NULL;
3256 rp_begin.renderPass = renderPass();
3257 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003258
Karl Schultz6addd812016-02-02 17:17:23 -07003259 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
3260 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003261
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003262 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003263}
3264
Karl Schultz6addd812016-02-02 17:17:23 -07003265TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003266 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07003267 m_errorMonitor->SetDesiredFailureMsg(
3268 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003269 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003270
3271 ASSERT_NO_FATAL_FAILURE(InitState());
3272 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003273
3274 // Renderpass is started here
3275 BeginCommandBuffer();
3276
3277 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003278 vk_testing::Buffer dstBuffer;
3279 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003280
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003281 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003282
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003283 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003284}
3285
Karl Schultz6addd812016-02-02 17:17:23 -07003286TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003287 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07003288 m_errorMonitor->SetDesiredFailureMsg(
3289 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003290 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003291
3292 ASSERT_NO_FATAL_FAILURE(InitState());
3293 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003294
3295 // Renderpass is started here
3296 BeginCommandBuffer();
3297
3298 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003299 vk_testing::Buffer dstBuffer;
3300 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003301
Karl Schultz6addd812016-02-02 17:17:23 -07003302 VkDeviceSize dstOffset = 0;
3303 VkDeviceSize dataSize = 1024;
3304 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003305
Karl Schultz6addd812016-02-02 17:17:23 -07003306 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
3307 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003308
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003309 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003310}
3311
Karl Schultz6addd812016-02-02 17:17:23 -07003312TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003313 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003314 m_errorMonitor->SetDesiredFailureMsg(
3315 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003316 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003317
3318 ASSERT_NO_FATAL_FAILURE(InitState());
3319 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003320
3321 // Renderpass is started here
3322 BeginCommandBuffer();
3323
Michael Lentine0a369f62016-02-03 16:51:46 -06003324 VkClearColorValue clear_color;
3325 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07003326 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
3327 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3328 const int32_t tex_width = 32;
3329 const int32_t tex_height = 32;
3330 VkImageCreateInfo image_create_info = {};
3331 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3332 image_create_info.pNext = NULL;
3333 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3334 image_create_info.format = tex_format;
3335 image_create_info.extent.width = tex_width;
3336 image_create_info.extent.height = tex_height;
3337 image_create_info.extent.depth = 1;
3338 image_create_info.mipLevels = 1;
3339 image_create_info.arrayLayers = 1;
3340 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3341 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3342 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003343
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003344 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07003345 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
3346 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003347
Karl Schultz6addd812016-02-02 17:17:23 -07003348 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
3349 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003350
Karl Schultz6addd812016-02-02 17:17:23 -07003351 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
3352 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003353
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003354 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003355}
3356
Karl Schultz6addd812016-02-02 17:17:23 -07003357TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003358 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003359 m_errorMonitor->SetDesiredFailureMsg(
3360 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003361 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003362
3363 ASSERT_NO_FATAL_FAILURE(InitState());
3364 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003365
3366 // Renderpass is started here
3367 BeginCommandBuffer();
3368
3369 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07003370 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07003371 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
3372 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3373 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
3374 image_create_info.extent.width = 64;
3375 image_create_info.extent.height = 64;
3376 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3377 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003378
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003379 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07003380 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
3381 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003382
Karl Schultz6addd812016-02-02 17:17:23 -07003383 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
3384 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003385
Karl Schultz6addd812016-02-02 17:17:23 -07003386 vkCmdClearDepthStencilImage(
3387 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
3388 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
3389 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003390
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003391 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003392}
3393
Karl Schultz6addd812016-02-02 17:17:23 -07003394TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06003395 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003396 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003397
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003399 "vkCmdClearAttachments: This call "
3400 "must be issued inside an active "
3401 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003402
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003403 ASSERT_NO_FATAL_FAILURE(InitState());
3404 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003405
3406 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003407 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003408 ASSERT_VK_SUCCESS(err);
3409
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06003410 VkClearAttachment color_attachment;
3411 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3412 color_attachment.clearValue.color.float32[0] = 0;
3413 color_attachment.clearValue.color.float32[1] = 0;
3414 color_attachment.clearValue.color.float32[2] = 0;
3415 color_attachment.clearValue.color.float32[3] = 0;
3416 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07003417 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
3418 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
3419 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003420
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003421 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003422}
3423
Karl Schultz6addd812016-02-02 17:17:23 -07003424TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003425 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003426 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003427
Karl Schultz6addd812016-02-02 17:17:23 -07003428 m_errorMonitor->SetDesiredFailureMsg(
3429 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003430 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
3431
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003432 ASSERT_NO_FATAL_FAILURE(InitState());
3433 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003434 uint32_t qfi = 0;
3435 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003436 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3437 buffCI.size = 1024;
3438 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
3439 buffCI.queueFamilyIndexCount = 1;
3440 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003441
3442 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003443 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003444 ASSERT_VK_SUCCESS(err);
3445
3446 BeginCommandBuffer();
3447 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003448 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3449 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003450 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07003451 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
3452 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003453
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003454 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003455
Chia-I Wuf7458c52015-10-26 21:10:41 +08003456 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003457}
3458
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07003459TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
3460 // Create an out-of-range queueFamilyIndex
3461 m_errorMonitor->SetDesiredFailureMsg(
3462 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06003463 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07003464
3465 ASSERT_NO_FATAL_FAILURE(InitState());
3466 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3467 VkBufferCreateInfo buffCI = {};
3468 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3469 buffCI.size = 1024;
3470 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
3471 buffCI.queueFamilyIndexCount = 1;
3472 // Introduce failure by specifying invalid queue_family_index
3473 uint32_t qfi = 777;
3474 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06003475 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07003476
3477 VkBuffer ib;
3478 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
3479
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003480 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07003481}
3482
Karl Schultz6addd812016-02-02 17:17:23 -07003483TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
3484 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
3485 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003486
Karl Schultz6addd812016-02-02 17:17:23 -07003487 m_errorMonitor->SetDesiredFailureMsg(
3488 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003489 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003490
3491 ASSERT_NO_FATAL_FAILURE(InitState());
3492 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003493
3494 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003495 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003496 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
3497 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003498
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003499 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003500}
3501
Karl Schultz6addd812016-02-02 17:17:23 -07003502TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003503 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07003504 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003505
Karl Schultz6addd812016-02-02 17:17:23 -07003506 m_errorMonitor->SetDesiredFailureMsg(
3507 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor "
3508 "type VK_DESCRIPTOR_TYPE_SAMPLER that "
3509 "does not match ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003510
Tobin Ehlis3b780662015-05-28 12:11:26 -06003511 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003512 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003513 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003514 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3515 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003516
3517 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003518 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3519 ds_pool_ci.pNext = NULL;
3520 ds_pool_ci.maxSets = 1;
3521 ds_pool_ci.poolSizeCount = 1;
3522 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06003523
Tobin Ehlis3b780662015-05-28 12:11:26 -06003524 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003525 err =
3526 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003527 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06003528 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003529 dsl_binding.binding = 0;
3530 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3531 dsl_binding.descriptorCount = 1;
3532 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3533 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003534
Tony Barboureb254902015-07-15 12:50:33 -06003535 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003536 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3537 ds_layout_ci.pNext = NULL;
3538 ds_layout_ci.bindingCount = 1;
3539 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003540
Tobin Ehlis3b780662015-05-28 12:11:26 -06003541 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003542 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3543 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003544 ASSERT_VK_SUCCESS(err);
3545
3546 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003547 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003548 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003549 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003550 alloc_info.descriptorPool = ds_pool;
3551 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003552 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3553 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003554 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003555
Tony Barboureb254902015-07-15 12:50:33 -06003556 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003557 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3558 sampler_ci.pNext = NULL;
3559 sampler_ci.magFilter = VK_FILTER_NEAREST;
3560 sampler_ci.minFilter = VK_FILTER_NEAREST;
3561 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3562 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3563 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3564 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3565 sampler_ci.mipLodBias = 1.0;
3566 sampler_ci.anisotropyEnable = VK_FALSE;
3567 sampler_ci.maxAnisotropy = 1;
3568 sampler_ci.compareEnable = VK_FALSE;
3569 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3570 sampler_ci.minLod = 1.0;
3571 sampler_ci.maxLod = 1.0;
3572 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3573 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Mark Lobodzinski52ac6582015-09-01 15:42:56 -06003574
Tobin Ehlis3b780662015-05-28 12:11:26 -06003575 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003576 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003577 ASSERT_VK_SUCCESS(err);
3578
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003579 VkDescriptorImageInfo info = {};
3580 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003581
3582 VkWriteDescriptorSet descriptor_write;
3583 memset(&descriptor_write, 0, sizeof(descriptor_write));
3584 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003585 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003586 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003587 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003588 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003589 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003590
3591 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3592
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003593 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003594
Chia-I Wuf7458c52015-10-26 21:10:41 +08003595 vkDestroySampler(m_device->device(), sampler, NULL);
3596 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3597 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003598}
3599
Karl Schultz6addd812016-02-02 17:17:23 -07003600TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003601 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07003602 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003603
Karl Schultz6addd812016-02-02 17:17:23 -07003604 m_errorMonitor->SetDesiredFailureMsg(
3605 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of "
3606 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET "
3607 "is out of bounds for matching binding");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003608
Tobin Ehlis3b780662015-05-28 12:11:26 -06003609 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003610 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003611 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003612 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3613 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003614
3615 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003616 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3617 ds_pool_ci.pNext = NULL;
3618 ds_pool_ci.maxSets = 1;
3619 ds_pool_ci.poolSizeCount = 1;
3620 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06003621
Tobin Ehlis3b780662015-05-28 12:11:26 -06003622 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003623 err =
3624 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003625 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003626
Tony Barboureb254902015-07-15 12:50:33 -06003627 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003628 dsl_binding.binding = 0;
3629 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3630 dsl_binding.descriptorCount = 1;
3631 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3632 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06003633
3634 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003635 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3636 ds_layout_ci.pNext = NULL;
3637 ds_layout_ci.bindingCount = 1;
3638 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003639
Tobin Ehlis3b780662015-05-28 12:11:26 -06003640 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003641 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3642 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003643 ASSERT_VK_SUCCESS(err);
3644
3645 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003646 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003647 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003648 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003649 alloc_info.descriptorPool = ds_pool;
3650 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003651 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3652 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003653 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003654
Tony Barboureb254902015-07-15 12:50:33 -06003655 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003656 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3657 sampler_ci.pNext = NULL;
3658 sampler_ci.magFilter = VK_FILTER_NEAREST;
3659 sampler_ci.minFilter = VK_FILTER_NEAREST;
3660 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3661 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3662 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3663 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3664 sampler_ci.mipLodBias = 1.0;
3665 sampler_ci.anisotropyEnable = VK_FALSE;
3666 sampler_ci.maxAnisotropy = 1;
3667 sampler_ci.compareEnable = VK_FALSE;
3668 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3669 sampler_ci.minLod = 1.0;
3670 sampler_ci.maxLod = 1.0;
3671 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3672 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06003673
Tobin Ehlis3b780662015-05-28 12:11:26 -06003674 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003675 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003676 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003677
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003678 VkDescriptorImageInfo info = {};
3679 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003680
3681 VkWriteDescriptorSet descriptor_write;
3682 memset(&descriptor_write, 0, sizeof(descriptor_write));
3683 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003684 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003685 descriptor_write.dstArrayElement =
3686 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08003687 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003688 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003689 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003690 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003691
3692 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3693
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003694 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003695
Chia-I Wuf7458c52015-10-26 21:10:41 +08003696 vkDestroySampler(m_device->device(), sampler, NULL);
3697 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3698 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003699}
3700
Karl Schultz6addd812016-02-02 17:17:23 -07003701TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
3702 // Create layout w/ count of 1 and attempt update to that layout w/ binding
3703 // index 2
3704 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003705
Karl Schultz6addd812016-02-02 17:17:23 -07003706 m_errorMonitor->SetDesiredFailureMsg(
3707 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003708 " does not have binding to match update binding ");
3709
Tobin Ehlis3b780662015-05-28 12:11:26 -06003710 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003711 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003712 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003713 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3714 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003715
3716 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003717 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3718 ds_pool_ci.pNext = NULL;
3719 ds_pool_ci.maxSets = 1;
3720 ds_pool_ci.poolSizeCount = 1;
3721 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06003722
Tobin Ehlis3b780662015-05-28 12:11:26 -06003723 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003724 err =
3725 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003726 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003727
Tony Barboureb254902015-07-15 12:50:33 -06003728 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003729 dsl_binding.binding = 0;
3730 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3731 dsl_binding.descriptorCount = 1;
3732 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3733 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06003734
3735 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003736 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3737 ds_layout_ci.pNext = NULL;
3738 ds_layout_ci.bindingCount = 1;
3739 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003740 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003741 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3742 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003743 ASSERT_VK_SUCCESS(err);
3744
3745 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003746 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003747 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003748 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003749 alloc_info.descriptorPool = ds_pool;
3750 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003751 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3752 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003753 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003754
Tony Barboureb254902015-07-15 12:50:33 -06003755 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003756 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3757 sampler_ci.pNext = NULL;
3758 sampler_ci.magFilter = VK_FILTER_NEAREST;
3759 sampler_ci.minFilter = VK_FILTER_NEAREST;
3760 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3761 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3762 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3763 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3764 sampler_ci.mipLodBias = 1.0;
3765 sampler_ci.anisotropyEnable = VK_FALSE;
3766 sampler_ci.maxAnisotropy = 1;
3767 sampler_ci.compareEnable = VK_FALSE;
3768 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3769 sampler_ci.minLod = 1.0;
3770 sampler_ci.maxLod = 1.0;
3771 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3772 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06003773
Tobin Ehlis3b780662015-05-28 12:11:26 -06003774 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003775 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003776 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003777
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003778 VkDescriptorImageInfo info = {};
3779 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003780
3781 VkWriteDescriptorSet descriptor_write;
3782 memset(&descriptor_write, 0, sizeof(descriptor_write));
3783 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003784 descriptor_write.dstSet = descriptorSet;
3785 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003786 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003787 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003788 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003789 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003790
3791 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3792
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003793 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003794
Chia-I Wuf7458c52015-10-26 21:10:41 +08003795 vkDestroySampler(m_device->device(), sampler, NULL);
3796 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3797 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003798}
3799
Karl Schultz6addd812016-02-02 17:17:23 -07003800TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
3801 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
3802 // types
3803 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003804
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003806 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003807
Tobin Ehlis3b780662015-05-28 12:11:26 -06003808 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003809
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003810 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003811 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3812 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003813
3814 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003815 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3816 ds_pool_ci.pNext = NULL;
3817 ds_pool_ci.maxSets = 1;
3818 ds_pool_ci.poolSizeCount = 1;
3819 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06003820
Tobin Ehlis3b780662015-05-28 12:11:26 -06003821 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003822 err =
3823 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003824 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06003825 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003826 dsl_binding.binding = 0;
3827 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3828 dsl_binding.descriptorCount = 1;
3829 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3830 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003831
Tony Barboureb254902015-07-15 12:50:33 -06003832 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003833 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3834 ds_layout_ci.pNext = NULL;
3835 ds_layout_ci.bindingCount = 1;
3836 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003837
Tobin Ehlis3b780662015-05-28 12:11:26 -06003838 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003839 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3840 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003841 ASSERT_VK_SUCCESS(err);
3842
3843 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003844 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003845 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003846 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003847 alloc_info.descriptorPool = ds_pool;
3848 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003849 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3850 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003851 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003852
Tony Barboureb254902015-07-15 12:50:33 -06003853 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003854 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3855 sampler_ci.pNext = NULL;
3856 sampler_ci.magFilter = VK_FILTER_NEAREST;
3857 sampler_ci.minFilter = VK_FILTER_NEAREST;
3858 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3859 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3860 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3861 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3862 sampler_ci.mipLodBias = 1.0;
3863 sampler_ci.anisotropyEnable = VK_FALSE;
3864 sampler_ci.maxAnisotropy = 1;
3865 sampler_ci.compareEnable = VK_FALSE;
3866 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3867 sampler_ci.minLod = 1.0;
3868 sampler_ci.maxLod = 1.0;
3869 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3870 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003871 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003872 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003873 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003874
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003875 VkDescriptorImageInfo info = {};
3876 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003877
3878 VkWriteDescriptorSet descriptor_write;
3879 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07003880 descriptor_write.sType =
3881 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003882 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003883 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003884 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003885 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003886 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003887
3888 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3889
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003890 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003891
Chia-I Wuf7458c52015-10-26 21:10:41 +08003892 vkDestroySampler(m_device->device(), sampler, NULL);
3893 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3894 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003895}
3896
Karl Schultz6addd812016-02-02 17:17:23 -07003897TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003898 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07003899 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003900
Karl Schultz6addd812016-02-02 17:17:23 -07003901 m_errorMonitor->SetDesiredFailureMsg(
3902 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003903 "Attempt to update descriptor with invalid sampler 0xbaadbeef");
3904
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003905 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003906 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
3907 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003908 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003909 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3910 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003911
3912 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003913 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3914 ds_pool_ci.pNext = NULL;
3915 ds_pool_ci.maxSets = 1;
3916 ds_pool_ci.poolSizeCount = 1;
3917 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003918
3919 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003920 err =
3921 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003922 ASSERT_VK_SUCCESS(err);
3923
3924 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003925 dsl_binding.binding = 0;
3926 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3927 dsl_binding.descriptorCount = 1;
3928 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3929 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003930
3931 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003932 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3933 ds_layout_ci.pNext = NULL;
3934 ds_layout_ci.bindingCount = 1;
3935 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003936 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003937 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3938 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003939 ASSERT_VK_SUCCESS(err);
3940
3941 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003942 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003943 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003944 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003945 alloc_info.descriptorPool = ds_pool;
3946 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003947 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3948 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003949 ASSERT_VK_SUCCESS(err);
3950
Karl Schultz6addd812016-02-02 17:17:23 -07003951 VkSampler sampler =
3952 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003953
3954 VkDescriptorImageInfo descriptor_info;
3955 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
3956 descriptor_info.sampler = sampler;
3957
3958 VkWriteDescriptorSet descriptor_write;
3959 memset(&descriptor_write, 0, sizeof(descriptor_write));
3960 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003961 descriptor_write.dstSet = descriptorSet;
3962 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003963 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003964 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3965 descriptor_write.pImageInfo = &descriptor_info;
3966
3967 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3968
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003969 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003970
Chia-I Wuf7458c52015-10-26 21:10:41 +08003971 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3972 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003973}
3974
Karl Schultz6addd812016-02-02 17:17:23 -07003975TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
3976 // Create a single combined Image/Sampler descriptor and send it an invalid
3977 // imageView
3978 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003979
Karl Schultz6addd812016-02-02 17:17:23 -07003980 m_errorMonitor->SetDesiredFailureMsg(
3981 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003982 "Attempt to update descriptor with invalid imageView 0xbaadbeef");
3983
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003984 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003985 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003986 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
3987 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003988
3989 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003990 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3991 ds_pool_ci.pNext = NULL;
3992 ds_pool_ci.maxSets = 1;
3993 ds_pool_ci.poolSizeCount = 1;
3994 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003995
3996 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003997 err =
3998 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003999 ASSERT_VK_SUCCESS(err);
4000
4001 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004002 dsl_binding.binding = 0;
4003 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4004 dsl_binding.descriptorCount = 1;
4005 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4006 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004007
4008 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004009 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4010 ds_layout_ci.pNext = NULL;
4011 ds_layout_ci.bindingCount = 1;
4012 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004013 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004014 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4015 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004016 ASSERT_VK_SUCCESS(err);
4017
4018 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004019 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004020 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004021 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004022 alloc_info.descriptorPool = ds_pool;
4023 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004024 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4025 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004026 ASSERT_VK_SUCCESS(err);
4027
4028 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004029 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4030 sampler_ci.pNext = NULL;
4031 sampler_ci.magFilter = VK_FILTER_NEAREST;
4032 sampler_ci.minFilter = VK_FILTER_NEAREST;
4033 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4034 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4035 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4036 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4037 sampler_ci.mipLodBias = 1.0;
4038 sampler_ci.anisotropyEnable = VK_FALSE;
4039 sampler_ci.maxAnisotropy = 1;
4040 sampler_ci.compareEnable = VK_FALSE;
4041 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4042 sampler_ci.minLod = 1.0;
4043 sampler_ci.maxLod = 1.0;
4044 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4045 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004046
4047 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004048 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004049 ASSERT_VK_SUCCESS(err);
4050
Karl Schultz6addd812016-02-02 17:17:23 -07004051 VkImageView view =
4052 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004053
4054 VkDescriptorImageInfo descriptor_info;
4055 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
4056 descriptor_info.sampler = sampler;
4057 descriptor_info.imageView = view;
4058
4059 VkWriteDescriptorSet descriptor_write;
4060 memset(&descriptor_write, 0, sizeof(descriptor_write));
4061 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004062 descriptor_write.dstSet = descriptorSet;
4063 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004064 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004065 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4066 descriptor_write.pImageInfo = &descriptor_info;
4067
4068 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4069
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004070 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004071
Chia-I Wuf7458c52015-10-26 21:10:41 +08004072 vkDestroySampler(m_device->device(), sampler, NULL);
4073 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4074 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004075}
4076
Karl Schultz6addd812016-02-02 17:17:23 -07004077TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
4078 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
4079 // into the other
4080 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004081
Karl Schultz6addd812016-02-02 17:17:23 -07004082 m_errorMonitor->SetDesiredFailureMsg(
4083 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Copy descriptor update index 0, update "
4084 "count #1, has src update descriptor "
4085 "type VK_DESCRIPTOR_TYPE_SAMPLER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004086
Tobin Ehlis04356f92015-10-27 16:35:27 -06004087 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004088 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004089 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004090 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4091 ds_type_count[0].descriptorCount = 1;
4092 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
4093 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004094
4095 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004096 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4097 ds_pool_ci.pNext = NULL;
4098 ds_pool_ci.maxSets = 1;
4099 ds_pool_ci.poolSizeCount = 2;
4100 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004101
4102 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004103 err =
4104 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004105 ASSERT_VK_SUCCESS(err);
4106 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004107 dsl_binding[0].binding = 0;
4108 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4109 dsl_binding[0].descriptorCount = 1;
4110 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4111 dsl_binding[0].pImmutableSamplers = NULL;
4112 dsl_binding[1].binding = 1;
4113 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4114 dsl_binding[1].descriptorCount = 1;
4115 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
4116 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004117
4118 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004119 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4120 ds_layout_ci.pNext = NULL;
4121 ds_layout_ci.bindingCount = 2;
4122 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004123
4124 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004125 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4126 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004127 ASSERT_VK_SUCCESS(err);
4128
4129 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004130 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004131 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004132 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004133 alloc_info.descriptorPool = ds_pool;
4134 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004135 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4136 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004137 ASSERT_VK_SUCCESS(err);
4138
4139 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004140 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4141 sampler_ci.pNext = NULL;
4142 sampler_ci.magFilter = VK_FILTER_NEAREST;
4143 sampler_ci.minFilter = VK_FILTER_NEAREST;
4144 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4145 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4146 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4147 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4148 sampler_ci.mipLodBias = 1.0;
4149 sampler_ci.anisotropyEnable = VK_FALSE;
4150 sampler_ci.maxAnisotropy = 1;
4151 sampler_ci.compareEnable = VK_FALSE;
4152 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4153 sampler_ci.minLod = 1.0;
4154 sampler_ci.maxLod = 1.0;
4155 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4156 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004157
4158 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004159 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004160 ASSERT_VK_SUCCESS(err);
4161
4162 VkDescriptorImageInfo info = {};
4163 info.sampler = sampler;
4164
4165 VkWriteDescriptorSet descriptor_write;
4166 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
4167 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004168 descriptor_write.dstSet = descriptorSet;
4169 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08004170 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004171 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4172 descriptor_write.pImageInfo = &info;
4173 // This write update should succeed
4174 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4175 // Now perform a copy update that fails due to type mismatch
4176 VkCopyDescriptorSet copy_ds_update;
4177 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4178 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4179 copy_ds_update.srcSet = descriptorSet;
4180 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004181 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004182 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08004183 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06004184 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4185
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004186 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06004187 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07004188 m_errorMonitor->SetDesiredFailureMsg(
4189 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004190 "Copy descriptor update 0 has srcBinding 3 which is out of bounds ");
Tobin Ehlis04356f92015-10-27 16:35:27 -06004191 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4192 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4193 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004194 copy_ds_update.srcBinding =
4195 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004196 copy_ds_update.dstSet = descriptorSet;
4197 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004198 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06004199 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4200
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004201 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004202
Tobin Ehlis04356f92015-10-27 16:35:27 -06004203 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07004204 m_errorMonitor->SetDesiredFailureMsg(
4205 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004206 "Copy descriptor src update is out of bounds for matching binding 1 ");
4207
Tobin Ehlis04356f92015-10-27 16:35:27 -06004208 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4209 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4210 copy_ds_update.srcSet = descriptorSet;
4211 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004212 copy_ds_update.dstSet = descriptorSet;
4213 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004214 copy_ds_update.descriptorCount =
4215 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06004216 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4217
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004218 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06004219
Chia-I Wuf7458c52015-10-26 21:10:41 +08004220 vkDestroySampler(m_device->device(), sampler, NULL);
4221 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4222 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004223}
4224
Karl Schultz6addd812016-02-02 17:17:23 -07004225TEST_F(VkLayerTest, NumSamplesMismatch) {
4226 // Create CommandBuffer where MSAA samples doesn't match RenderPass
4227 // sampleCount
4228 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004229
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004231 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004232
Tobin Ehlis3b780662015-05-28 12:11:26 -06004233 ASSERT_NO_FATAL_FAILURE(InitState());
4234 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004235 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06004236 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004237 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004238
4239 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004240 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4241 ds_pool_ci.pNext = NULL;
4242 ds_pool_ci.maxSets = 1;
4243 ds_pool_ci.poolSizeCount = 1;
4244 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004245
Tobin Ehlis3b780662015-05-28 12:11:26 -06004246 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004247 err =
4248 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004249 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004250
Tony Barboureb254902015-07-15 12:50:33 -06004251 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08004252 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06004253 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08004254 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004255 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4256 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004257
Tony Barboureb254902015-07-15 12:50:33 -06004258 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4259 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4260 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004261 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004262 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004263
Tobin Ehlis3b780662015-05-28 12:11:26 -06004264 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004265 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4266 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004267 ASSERT_VK_SUCCESS(err);
4268
4269 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004270 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004271 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004272 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004273 alloc_info.descriptorPool = ds_pool;
4274 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004275 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4276 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004277 ASSERT_VK_SUCCESS(err);
4278
Tony Barboureb254902015-07-15 12:50:33 -06004279 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004280 pipe_ms_state_ci.sType =
4281 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4282 pipe_ms_state_ci.pNext = NULL;
4283 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
4284 pipe_ms_state_ci.sampleShadingEnable = 0;
4285 pipe_ms_state_ci.minSampleShading = 1.0;
4286 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004287
Tony Barboureb254902015-07-15 12:50:33 -06004288 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004289 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4290 pipeline_layout_ci.pNext = NULL;
4291 pipeline_layout_ci.setLayoutCount = 1;
4292 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004293
4294 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004295 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4296 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004297 ASSERT_VK_SUCCESS(err);
4298
Karl Schultz6addd812016-02-02 17:17:23 -07004299 VkShaderObj vs(m_device, bindStateVertShaderText,
4300 VK_SHADER_STAGE_VERTEX_BIT, this);
4301 VkShaderObj fs(m_device, bindStateFragShaderText,
4302 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004303 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004304 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004305 VkPipelineObj pipe(m_device);
4306 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004307 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06004308 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004309 pipe.SetMSAA(&pipe_ms_state_ci);
4310 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06004311
Tony Barbourfe3351b2015-07-28 10:17:20 -06004312 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004313 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4314 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06004315
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004316 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004317
Chia-I Wuf7458c52015-10-26 21:10:41 +08004318 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4319 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4320 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004321}
Tobin Ehlis0f10db52016-04-04 10:00:21 -06004322#ifdef ADD_BACK_IN_WHEN_CHECK_IS_BACK // TODO : Re-enable when GH256 fixed
Mark Youngc89c6312016-03-31 16:03:20 -06004323TEST_F(VkLayerTest, NumBlendAttachMismatch) {
4324 // Create Pipeline where the number of blend attachments doesn't match the
4325 // number of color attachments. In this case, we don't add any color
4326 // blend attachments even though we have a color attachment.
4327 VkResult err;
4328
4329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4330 "Mismatch between blend state attachment");
4331
4332 ASSERT_NO_FATAL_FAILURE(InitState());
4333 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4334 VkDescriptorPoolSize ds_type_count = {};
4335 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4336 ds_type_count.descriptorCount = 1;
4337
4338 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4339 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4340 ds_pool_ci.pNext = NULL;
4341 ds_pool_ci.maxSets = 1;
4342 ds_pool_ci.poolSizeCount = 1;
4343 ds_pool_ci.pPoolSizes = &ds_type_count;
4344
4345 VkDescriptorPool ds_pool;
4346 err =
4347 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4348 ASSERT_VK_SUCCESS(err);
4349
4350 VkDescriptorSetLayoutBinding dsl_binding = {};
4351 dsl_binding.binding = 0;
4352 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4353 dsl_binding.descriptorCount = 1;
4354 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4355 dsl_binding.pImmutableSamplers = NULL;
4356
4357 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4358 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4359 ds_layout_ci.pNext = NULL;
4360 ds_layout_ci.bindingCount = 1;
4361 ds_layout_ci.pBindings = &dsl_binding;
4362
4363 VkDescriptorSetLayout ds_layout;
4364 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4365 &ds_layout);
4366 ASSERT_VK_SUCCESS(err);
4367
4368 VkDescriptorSet descriptorSet;
4369 VkDescriptorSetAllocateInfo alloc_info = {};
4370 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4371 alloc_info.descriptorSetCount = 1;
4372 alloc_info.descriptorPool = ds_pool;
4373 alloc_info.pSetLayouts = &ds_layout;
4374 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4375 &descriptorSet);
4376 ASSERT_VK_SUCCESS(err);
4377
4378 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
4379 pipe_ms_state_ci.sType =
4380 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4381 pipe_ms_state_ci.pNext = NULL;
4382 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
4383 pipe_ms_state_ci.sampleShadingEnable = 0;
4384 pipe_ms_state_ci.minSampleShading = 1.0;
4385 pipe_ms_state_ci.pSampleMask = NULL;
4386
4387 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4388 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4389 pipeline_layout_ci.pNext = NULL;
4390 pipeline_layout_ci.setLayoutCount = 1;
4391 pipeline_layout_ci.pSetLayouts = &ds_layout;
4392
4393 VkPipelineLayout pipeline_layout;
4394 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4395 &pipeline_layout);
4396 ASSERT_VK_SUCCESS(err);
4397
4398 VkShaderObj vs(m_device, bindStateVertShaderText,
4399 VK_SHADER_STAGE_VERTEX_BIT, this);
4400 VkShaderObj fs(m_device, bindStateFragShaderText,
4401 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004402 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06004403 // but add it to be able to run on more devices
4404 VkPipelineObj pipe(m_device);
4405 pipe.AddShader(&vs);
4406 pipe.AddShader(&fs);
4407 pipe.SetMSAA(&pipe_ms_state_ci);
4408 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4409
4410 BeginCommandBuffer();
4411 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4412 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4413
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004414 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06004415
4416 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4417 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4418 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4419}
Tony Barbour4e81a202016-04-04 11:09:40 -06004420#endif //ADD_BACK_IN_WHEN_CHECK_IS_BACK
Karl Schultz6addd812016-02-02 17:17:23 -07004421TEST_F(VkLayerTest, ClearCmdNoDraw) {
4422 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
4423 // to issuing a Draw
4424 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004425
Karl Schultz6addd812016-02-02 17:17:23 -07004426 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07004427 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004428 "vkCmdClearAttachments() issued on CB object ");
4429
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004430 ASSERT_NO_FATAL_FAILURE(InitState());
4431 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06004432
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004433 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004434 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4435 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004436
4437 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004438 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4439 ds_pool_ci.pNext = NULL;
4440 ds_pool_ci.maxSets = 1;
4441 ds_pool_ci.poolSizeCount = 1;
4442 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004443
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004444 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004445 err =
4446 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004447 ASSERT_VK_SUCCESS(err);
4448
Tony Barboureb254902015-07-15 12:50:33 -06004449 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004450 dsl_binding.binding = 0;
4451 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4452 dsl_binding.descriptorCount = 1;
4453 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4454 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004455
Tony Barboureb254902015-07-15 12:50:33 -06004456 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004457 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4458 ds_layout_ci.pNext = NULL;
4459 ds_layout_ci.bindingCount = 1;
4460 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004461
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004462 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004463 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4464 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004465 ASSERT_VK_SUCCESS(err);
4466
4467 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004468 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004469 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004470 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004471 alloc_info.descriptorPool = ds_pool;
4472 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004473 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4474 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004475 ASSERT_VK_SUCCESS(err);
4476
Tony Barboureb254902015-07-15 12:50:33 -06004477 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004478 pipe_ms_state_ci.sType =
4479 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4480 pipe_ms_state_ci.pNext = NULL;
4481 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
4482 pipe_ms_state_ci.sampleShadingEnable = 0;
4483 pipe_ms_state_ci.minSampleShading = 1.0;
4484 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004485
Tony Barboureb254902015-07-15 12:50:33 -06004486 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004487 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4488 pipeline_layout_ci.pNext = NULL;
4489 pipeline_layout_ci.setLayoutCount = 1;
4490 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004491
4492 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004493 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4494 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004495 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004496
Karl Schultz6addd812016-02-02 17:17:23 -07004497 VkShaderObj vs(m_device, bindStateVertShaderText,
4498 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06004499 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07004500 // on more devices
4501 VkShaderObj fs(m_device, bindStateFragShaderText,
4502 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004503
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004504 VkPipelineObj pipe(m_device);
4505 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004506 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004507 pipe.SetMSAA(&pipe_ms_state_ci);
4508 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06004509
4510 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004511
Karl Schultz6addd812016-02-02 17:17:23 -07004512 // Main thing we care about for this test is that the VkImage obj we're
4513 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004514 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004515 VkClearAttachment color_attachment;
4516 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4517 color_attachment.clearValue.color.float32[0] = 1.0;
4518 color_attachment.clearValue.color.float32[1] = 1.0;
4519 color_attachment.clearValue.color.float32[2] = 1.0;
4520 color_attachment.clearValue.color.float32[3] = 1.0;
4521 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004522 VkClearRect clear_rect = {
4523 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004524
Karl Schultz6addd812016-02-02 17:17:23 -07004525 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4526 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004527
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004528 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004529
Chia-I Wuf7458c52015-10-26 21:10:41 +08004530 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4531 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4532 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004533}
4534
Karl Schultz6addd812016-02-02 17:17:23 -07004535TEST_F(VkLayerTest, VtxBufferBadIndex) {
4536 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004537
Karl Schultz6addd812016-02-02 17:17:23 -07004538 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004539 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07004540 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004541
Tobin Ehlis502480b2015-06-24 15:53:07 -06004542 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06004543 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06004544 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06004545
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004546 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004547 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4548 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004549
4550 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004551 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4552 ds_pool_ci.pNext = NULL;
4553 ds_pool_ci.maxSets = 1;
4554 ds_pool_ci.poolSizeCount = 1;
4555 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004556
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004557 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004558 err =
4559 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004560 ASSERT_VK_SUCCESS(err);
4561
Tony Barboureb254902015-07-15 12:50:33 -06004562 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004563 dsl_binding.binding = 0;
4564 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4565 dsl_binding.descriptorCount = 1;
4566 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4567 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004568
Tony Barboureb254902015-07-15 12:50:33 -06004569 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004570 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4571 ds_layout_ci.pNext = NULL;
4572 ds_layout_ci.bindingCount = 1;
4573 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004574
Tobin Ehlis502480b2015-06-24 15:53:07 -06004575 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004576 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4577 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004578 ASSERT_VK_SUCCESS(err);
4579
4580 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004581 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004582 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004583 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004584 alloc_info.descriptorPool = ds_pool;
4585 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004586 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4587 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004588 ASSERT_VK_SUCCESS(err);
4589
Tony Barboureb254902015-07-15 12:50:33 -06004590 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004591 pipe_ms_state_ci.sType =
4592 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4593 pipe_ms_state_ci.pNext = NULL;
4594 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
4595 pipe_ms_state_ci.sampleShadingEnable = 0;
4596 pipe_ms_state_ci.minSampleShading = 1.0;
4597 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004598
Tony Barboureb254902015-07-15 12:50:33 -06004599 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004600 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4601 pipeline_layout_ci.pNext = NULL;
4602 pipeline_layout_ci.setLayoutCount = 1;
4603 pipeline_layout_ci.pSetLayouts = &ds_layout;
4604 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004605
Karl Schultz6addd812016-02-02 17:17:23 -07004606 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4607 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004608 ASSERT_VK_SUCCESS(err);
4609
Karl Schultz6addd812016-02-02 17:17:23 -07004610 VkShaderObj vs(m_device, bindStateVertShaderText,
4611 VK_SHADER_STAGE_VERTEX_BIT, this);
4612 VkShaderObj fs(m_device, bindStateFragShaderText,
4613 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004614 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004615 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004616 VkPipelineObj pipe(m_device);
4617 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004618 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06004619 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004620 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004621 pipe.SetViewport(m_viewports);
4622 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004623 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06004624
4625 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004626 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4627 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06004628 // Don't care about actual data, just need to get to draw to flag error
4629 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07004630 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
4631 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06004632 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06004633 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004634
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004635 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004636
Chia-I Wuf7458c52015-10-26 21:10:41 +08004637 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4638 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4639 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004640}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004641#endif // DRAW_STATE_TESTS
4642
Tobin Ehlis0788f522015-05-26 16:11:58 -06004643#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06004644#if GTEST_IS_THREADSAFE
4645struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004646 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004647 VkEvent event;
4648 bool bailout;
4649};
4650
Karl Schultz6addd812016-02-02 17:17:23 -07004651extern "C" void *AddToCommandBuffer(void *arg) {
4652 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004653
Karl Schultz6addd812016-02-02 17:17:23 -07004654 for (int i = 0; i < 10000; i++) {
4655 vkCmdSetEvent(data->commandBuffer, data->event,
4656 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004657 if (data->bailout) {
4658 break;
4659 }
4660 }
4661 return NULL;
4662}
4663
Karl Schultz6addd812016-02-02 17:17:23 -07004664TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06004665 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004666
Karl Schultz6addd812016-02-02 17:17:23 -07004667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4668 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004669
Mike Stroyanaccf7692015-05-12 16:00:45 -06004670 ASSERT_NO_FATAL_FAILURE(InitState());
4671 ASSERT_NO_FATAL_FAILURE(InitViewport());
4672 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4673
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004674 // Calls AllocateCommandBuffers
4675 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06004676
4677 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004678 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004679
4680 VkEventCreateInfo event_info;
4681 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004682 VkResult err;
4683
4684 memset(&event_info, 0, sizeof(event_info));
4685 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4686
Chia-I Wuf7458c52015-10-26 21:10:41 +08004687 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004688 ASSERT_VK_SUCCESS(err);
4689
Mike Stroyanaccf7692015-05-12 16:00:45 -06004690 err = vkResetEvent(device(), event);
4691 ASSERT_VK_SUCCESS(err);
4692
4693 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004694 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004695 data.event = event;
4696 data.bailout = false;
4697 m_errorMonitor->SetBailout(&data.bailout);
4698 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06004699 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004700 // Add many entries to command buffer from this thread at the same time.
4701 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06004702
Mike Stroyan4268d1f2015-07-13 14:45:35 -06004703 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004704 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004705
Mike Stroyan10b8cb72016-01-22 15:22:03 -07004706 m_errorMonitor->SetBailout(NULL);
4707
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004708 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004709
Chia-I Wuf7458c52015-10-26 21:10:41 +08004710 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004711}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004712#endif // GTEST_IS_THREADSAFE
4713#endif // THREADING_TESTS
4714
Chris Forbes9f7ff632015-05-25 11:13:08 +12004715#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07004716TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004718 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004719
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004720 ASSERT_NO_FATAL_FAILURE(InitState());
4721 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4722
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004723 VkShaderModule module;
4724 VkShaderModuleCreateInfo moduleCreateInfo;
4725 struct icd_spv_header spv;
4726
4727 spv.magic = ICD_SPV_MAGIC;
4728 spv.version = ICD_SPV_VERSION;
4729 spv.gen_magic = 0;
4730
4731 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4732 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07004733 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004734 moduleCreateInfo.codeSize = 4;
4735 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004736 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004737
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004738 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004739}
4740
Karl Schultz6addd812016-02-02 17:17:23 -07004741TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004743 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004744
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004745 ASSERT_NO_FATAL_FAILURE(InitState());
4746 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4747
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004748 VkShaderModule module;
4749 VkShaderModuleCreateInfo moduleCreateInfo;
4750 struct icd_spv_header spv;
4751
4752 spv.magic = ~ICD_SPV_MAGIC;
4753 spv.version = ICD_SPV_VERSION;
4754 spv.gen_magic = 0;
4755
4756 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4757 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07004758 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004759 moduleCreateInfo.codeSize = sizeof(spv) + 10;
4760 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004761 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004762
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004763 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004764}
4765
Karl Schultz6addd812016-02-02 17:17:23 -07004766TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004768 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004769
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004770 ASSERT_NO_FATAL_FAILURE(InitState());
4771 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4772
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004773 VkShaderModule module;
4774 VkShaderModuleCreateInfo moduleCreateInfo;
4775 struct icd_spv_header spv;
4776
4777 spv.magic = ICD_SPV_MAGIC;
4778 spv.version = ~ICD_SPV_VERSION;
4779 spv.gen_magic = 0;
4780
4781 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4782 moduleCreateInfo.pNext = NULL;
4783
Karl Schultz6addd812016-02-02 17:17:23 -07004784 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004785 moduleCreateInfo.codeSize = sizeof(spv) + 10;
4786 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004787 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004788
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004789 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004790}
4791
Karl Schultz6addd812016-02-02 17:17:23 -07004792TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004793 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004794 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004795
Chris Forbes9f7ff632015-05-25 11:13:08 +12004796 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06004797 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12004798
4799 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12004800 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12004801 "\n"
4802 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07004803 "out gl_PerVertex {\n"
4804 " vec4 gl_Position;\n"
4805 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12004806 "void main(){\n"
4807 " gl_Position = vec4(1);\n"
4808 " x = 0;\n"
4809 "}\n";
4810 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12004811 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12004812 "\n"
4813 "layout(location=0) out vec4 color;\n"
4814 "void main(){\n"
4815 " color = vec4(1);\n"
4816 "}\n";
4817
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004818 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4819 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12004820
4821 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08004822 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12004823 pipe.AddShader(&vs);
4824 pipe.AddShader(&fs);
4825
Chris Forbes9f7ff632015-05-25 11:13:08 +12004826 VkDescriptorSetObj descriptorSet(m_device);
4827 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004828 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12004829
Tony Barbour5781e8f2015-08-04 16:23:11 -06004830 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12004831
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004832 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12004833}
Chris Forbes9f7ff632015-05-25 11:13:08 +12004834
Karl Schultz6addd812016-02-02 17:17:23 -07004835TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004837 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004838
Chris Forbes59cb88d2015-05-25 11:13:13 +12004839 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06004840 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12004841
4842 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12004843 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12004844 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07004845 "out gl_PerVertex {\n"
4846 " vec4 gl_Position;\n"
4847 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12004848 "void main(){\n"
4849 " gl_Position = vec4(1);\n"
4850 "}\n";
4851 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12004852 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12004853 "\n"
4854 "layout(location=0) in float x;\n"
4855 "layout(location=0) out vec4 color;\n"
4856 "void main(){\n"
4857 " color = vec4(x);\n"
4858 "}\n";
4859
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004860 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4861 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12004862
4863 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08004864 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12004865 pipe.AddShader(&vs);
4866 pipe.AddShader(&fs);
4867
Chris Forbes59cb88d2015-05-25 11:13:13 +12004868 VkDescriptorSetObj descriptorSet(m_device);
4869 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004870 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12004871
Tony Barbour5781e8f2015-08-04 16:23:11 -06004872 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12004873
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004874 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12004875}
4876
Karl Schultz6addd812016-02-02 17:17:23 -07004877TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13004878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004879 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13004880
4881 ASSERT_NO_FATAL_FAILURE(InitState());
4882 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4883
4884 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12004885 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13004886 "\n"
4887 "out gl_PerVertex {\n"
4888 " vec4 gl_Position;\n"
4889 "};\n"
4890 "void main(){\n"
4891 " gl_Position = vec4(1);\n"
4892 "}\n";
4893 char const *fsSource =
4894 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13004895 "\n"
4896 "in block { layout(location=0) float x; } ins;\n"
4897 "layout(location=0) out vec4 color;\n"
4898 "void main(){\n"
4899 " color = vec4(ins.x);\n"
4900 "}\n";
4901
4902 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4903 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4904
4905 VkPipelineObj pipe(m_device);
4906 pipe.AddColorAttachment();
4907 pipe.AddShader(&vs);
4908 pipe.AddShader(&fs);
4909
4910 VkDescriptorSetObj descriptorSet(m_device);
4911 descriptorSet.AppendDummy();
4912 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
4913
4914 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
4915
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004916 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13004917}
4918
Karl Schultz6addd812016-02-02 17:17:23 -07004919TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13004920 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13004921 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07004922 "output arr[2] of float32' vs 'ptr to "
4923 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13004924
4925 ASSERT_NO_FATAL_FAILURE(InitState());
4926 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4927
4928 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12004929 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13004930 "\n"
4931 "layout(location=0) out float x[2];\n"
4932 "out gl_PerVertex {\n"
4933 " vec4 gl_Position;\n"
4934 "};\n"
4935 "void main(){\n"
4936 " x[0] = 0; x[1] = 0;\n"
4937 " gl_Position = vec4(1);\n"
4938 "}\n";
4939 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12004940 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13004941 "\n"
4942 "layout(location=0) in float x[3];\n"
4943 "layout(location=0) out vec4 color;\n"
4944 "void main(){\n"
4945 " color = vec4(x[0] + x[1] + x[2]);\n"
4946 "}\n";
4947
4948 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4949 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4950
4951 VkPipelineObj pipe(m_device);
4952 pipe.AddColorAttachment();
4953 pipe.AddShader(&vs);
4954 pipe.AddShader(&fs);
4955
4956 VkDescriptorSetObj descriptorSet(m_device);
4957 descriptorSet.AppendDummy();
4958 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
4959
4960 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
4961
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004962 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13004963}
4964
Karl Schultz6addd812016-02-02 17:17:23 -07004965TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004966 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004967 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004968
Chris Forbesb56af562015-05-25 11:13:17 +12004969 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06004970 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12004971
4972 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12004973 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12004974 "\n"
4975 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07004976 "out gl_PerVertex {\n"
4977 " vec4 gl_Position;\n"
4978 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12004979 "void main(){\n"
4980 " x = 0;\n"
4981 " gl_Position = vec4(1);\n"
4982 "}\n";
4983 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12004984 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12004985 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07004986 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12004987 "layout(location=0) out vec4 color;\n"
4988 "void main(){\n"
4989 " color = vec4(x);\n"
4990 "}\n";
4991
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004992 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4993 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12004994
4995 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08004996 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12004997 pipe.AddShader(&vs);
4998 pipe.AddShader(&fs);
4999
Chris Forbesb56af562015-05-25 11:13:17 +12005000 VkDescriptorSetObj descriptorSet(m_device);
5001 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005002 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12005003
Tony Barbour5781e8f2015-08-04 16:23:11 -06005004 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12005005
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005006 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12005007}
5008
Karl Schultz6addd812016-02-02 17:17:23 -07005009TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13005010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005011 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13005012
5013 ASSERT_NO_FATAL_FAILURE(InitState());
5014 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5015
5016 char const *vsSource =
5017 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13005018 "\n"
5019 "out block { layout(location=0) int x; } outs;\n"
5020 "out gl_PerVertex {\n"
5021 " vec4 gl_Position;\n"
5022 "};\n"
5023 "void main(){\n"
5024 " outs.x = 0;\n"
5025 " gl_Position = vec4(1);\n"
5026 "}\n";
5027 char const *fsSource =
5028 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13005029 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005030 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13005031 "layout(location=0) out vec4 color;\n"
5032 "void main(){\n"
5033 " color = vec4(ins.x);\n"
5034 "}\n";
5035
5036 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5037 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5038
5039 VkPipelineObj pipe(m_device);
5040 pipe.AddColorAttachment();
5041 pipe.AddShader(&vs);
5042 pipe.AddShader(&fs);
5043
5044 VkDescriptorSetObj descriptorSet(m_device);
5045 descriptorSet.AppendDummy();
5046 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5047
5048 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5049
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005050 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13005051}
5052
5053TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
5054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5055 "location 0.0 which is not written by vertex shader");
5056
5057 ASSERT_NO_FATAL_FAILURE(InitState());
5058 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5059
5060 char const *vsSource =
5061 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13005062 "\n"
5063 "out block { layout(location=1) float x; } outs;\n"
5064 "out gl_PerVertex {\n"
5065 " vec4 gl_Position;\n"
5066 "};\n"
5067 "void main(){\n"
5068 " outs.x = 0;\n"
5069 " gl_Position = vec4(1);\n"
5070 "}\n";
5071 char const *fsSource =
5072 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13005073 "\n"
5074 "in block { layout(location=0) float x; } ins;\n"
5075 "layout(location=0) out vec4 color;\n"
5076 "void main(){\n"
5077 " color = vec4(ins.x);\n"
5078 "}\n";
5079
5080 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5081 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5082
5083 VkPipelineObj pipe(m_device);
5084 pipe.AddColorAttachment();
5085 pipe.AddShader(&vs);
5086 pipe.AddShader(&fs);
5087
5088 VkDescriptorSetObj descriptorSet(m_device);
5089 descriptorSet.AppendDummy();
5090 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5091
5092 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5093
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005094 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13005095}
5096
5097TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
5098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5099 "location 0.1 which is not written by vertex shader");
5100
5101 ASSERT_NO_FATAL_FAILURE(InitState());
5102 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5103
5104 char const *vsSource =
5105 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13005106 "\n"
5107 "out block { layout(location=0, component=0) float x; } outs;\n"
5108 "out gl_PerVertex {\n"
5109 " vec4 gl_Position;\n"
5110 "};\n"
5111 "void main(){\n"
5112 " outs.x = 0;\n"
5113 " gl_Position = vec4(1);\n"
5114 "}\n";
5115 char const *fsSource =
5116 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13005117 "\n"
5118 "in block { layout(location=0, component=1) float x; } ins;\n"
5119 "layout(location=0) out vec4 color;\n"
5120 "void main(){\n"
5121 " color = vec4(ins.x);\n"
5122 "}\n";
5123
5124 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5125 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5126
5127 VkPipelineObj pipe(m_device);
5128 pipe.AddColorAttachment();
5129 pipe.AddShader(&vs);
5130 pipe.AddShader(&fs);
5131
5132 VkDescriptorSetObj descriptorSet(m_device);
5133 descriptorSet.AppendDummy();
5134 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5135
5136 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5137
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005138 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13005139}
5140
Karl Schultz6addd812016-02-02 17:17:23 -07005141TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005143 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005144
Chris Forbesde136e02015-05-25 11:13:28 +12005145 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005146 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12005147
5148 VkVertexInputBindingDescription input_binding;
5149 memset(&input_binding, 0, sizeof(input_binding));
5150
5151 VkVertexInputAttributeDescription input_attrib;
5152 memset(&input_attrib, 0, sizeof(input_attrib));
5153 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5154
5155 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005156 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12005157 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005158 "out gl_PerVertex {\n"
5159 " vec4 gl_Position;\n"
5160 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12005161 "void main(){\n"
5162 " gl_Position = vec4(1);\n"
5163 "}\n";
5164 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005165 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12005166 "\n"
5167 "layout(location=0) out vec4 color;\n"
5168 "void main(){\n"
5169 " color = vec4(1);\n"
5170 "}\n";
5171
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005172 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5173 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12005174
5175 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005176 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12005177 pipe.AddShader(&vs);
5178 pipe.AddShader(&fs);
5179
5180 pipe.AddVertexInputBindings(&input_binding, 1);
5181 pipe.AddVertexInputAttribs(&input_attrib, 1);
5182
Chris Forbesde136e02015-05-25 11:13:28 +12005183 VkDescriptorSetObj descriptorSet(m_device);
5184 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005185 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12005186
Tony Barbour5781e8f2015-08-04 16:23:11 -06005187 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12005188
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005189 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12005190}
5191
Karl Schultz6addd812016-02-02 17:17:23 -07005192TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005194 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13005195
5196 ASSERT_NO_FATAL_FAILURE(InitState());
5197 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5198
5199 VkVertexInputBindingDescription input_binding;
5200 memset(&input_binding, 0, sizeof(input_binding));
5201
5202 VkVertexInputAttributeDescription input_attrib;
5203 memset(&input_attrib, 0, sizeof(input_attrib));
5204 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5205
5206 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005207 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13005208 "\n"
5209 "layout(location=1) in float x;\n"
5210 "out gl_PerVertex {\n"
5211 " vec4 gl_Position;\n"
5212 "};\n"
5213 "void main(){\n"
5214 " gl_Position = vec4(x);\n"
5215 "}\n";
5216 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005217 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13005218 "\n"
5219 "layout(location=0) out vec4 color;\n"
5220 "void main(){\n"
5221 " color = vec4(1);\n"
5222 "}\n";
5223
5224 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5225 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5226
5227 VkPipelineObj pipe(m_device);
5228 pipe.AddColorAttachment();
5229 pipe.AddShader(&vs);
5230 pipe.AddShader(&fs);
5231
5232 pipe.AddVertexInputBindings(&input_binding, 1);
5233 pipe.AddVertexInputAttribs(&input_attrib, 1);
5234
5235 VkDescriptorSetObj descriptorSet(m_device);
5236 descriptorSet.AppendDummy();
5237 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5238
5239 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5240
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005241 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13005242}
5243
Karl Schultz6addd812016-02-02 17:17:23 -07005244TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
5245 m_errorMonitor->SetDesiredFailureMsg(
5246 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005247 "VS consumes input at location 0 but not provided");
5248
Chris Forbes62e8e502015-05-25 11:13:29 +12005249 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005250 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12005251
5252 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005253 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12005254 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005255 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07005256 "out gl_PerVertex {\n"
5257 " vec4 gl_Position;\n"
5258 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12005259 "void main(){\n"
5260 " gl_Position = x;\n"
5261 "}\n";
5262 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005263 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12005264 "\n"
5265 "layout(location=0) out vec4 color;\n"
5266 "void main(){\n"
5267 " color = vec4(1);\n"
5268 "}\n";
5269
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005270 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5271 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12005272
5273 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005274 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12005275 pipe.AddShader(&vs);
5276 pipe.AddShader(&fs);
5277
Chris Forbes62e8e502015-05-25 11:13:29 +12005278 VkDescriptorSetObj descriptorSet(m_device);
5279 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005280 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12005281
Tony Barbour5781e8f2015-08-04 16:23:11 -06005282 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12005283
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005284 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12005285}
5286
Karl Schultz6addd812016-02-02 17:17:23 -07005287TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
5288 m_errorMonitor->SetDesiredFailureMsg(
5289 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005290 "location 0 does not match VS input type");
5291
Chris Forbesc97d98e2015-05-25 11:13:31 +12005292 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005293 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12005294
5295 VkVertexInputBindingDescription input_binding;
5296 memset(&input_binding, 0, sizeof(input_binding));
5297
5298 VkVertexInputAttributeDescription input_attrib;
5299 memset(&input_attrib, 0, sizeof(input_attrib));
5300 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5301
5302 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005303 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12005304 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005305 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07005306 "out gl_PerVertex {\n"
5307 " vec4 gl_Position;\n"
5308 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12005309 "void main(){\n"
5310 " gl_Position = vec4(x);\n"
5311 "}\n";
5312 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005313 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12005314 "\n"
5315 "layout(location=0) out vec4 color;\n"
5316 "void main(){\n"
5317 " color = vec4(1);\n"
5318 "}\n";
5319
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005320 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5321 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12005322
5323 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005324 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12005325 pipe.AddShader(&vs);
5326 pipe.AddShader(&fs);
5327
5328 pipe.AddVertexInputBindings(&input_binding, 1);
5329 pipe.AddVertexInputAttribs(&input_attrib, 1);
5330
Chris Forbesc97d98e2015-05-25 11:13:31 +12005331 VkDescriptorSetObj descriptorSet(m_device);
5332 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005333 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12005334
Tony Barbour5781e8f2015-08-04 16:23:11 -06005335 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12005336
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005337 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12005338}
5339
Chris Forbesc68b43c2016-04-06 11:18:47 +12005340TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
5341 m_errorMonitor->SetDesiredFailureMsg(
5342 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5343 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
5344
5345 ASSERT_NO_FATAL_FAILURE(InitState());
5346 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5347
5348 char const *vsSource =
5349 "#version 450\n"
5350 "\n"
5351 "out gl_PerVertex {\n"
5352 " vec4 gl_Position;\n"
5353 "};\n"
5354 "void main(){\n"
5355 " gl_Position = vec4(1);\n"
5356 "}\n";
5357 char const *fsSource =
5358 "#version 450\n"
5359 "\n"
5360 "layout(location=0) out vec4 color;\n"
5361 "void main(){\n"
5362 " color = vec4(1);\n"
5363 "}\n";
5364
5365 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5366 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5367
5368 VkPipelineObj pipe(m_device);
5369 pipe.AddColorAttachment();
5370 pipe.AddShader(&vs);
5371 pipe.AddShader(&vs);
5372 pipe.AddShader(&fs);
5373
5374 VkDescriptorSetObj descriptorSet(m_device);
5375 descriptorSet.AppendDummy();
5376 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5377
5378 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5379
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005380 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12005381}
5382
Karl Schultz6addd812016-02-02 17:17:23 -07005383TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005384 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13005385
5386 ASSERT_NO_FATAL_FAILURE(InitState());
5387 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5388
5389 VkVertexInputBindingDescription input_binding;
5390 memset(&input_binding, 0, sizeof(input_binding));
5391
5392 VkVertexInputAttributeDescription input_attribs[2];
5393 memset(input_attribs, 0, sizeof(input_attribs));
5394
5395 for (int i = 0; i < 2; i++) {
5396 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
5397 input_attribs[i].location = i;
5398 }
5399
5400 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005401 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005402 "\n"
5403 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005404 "out gl_PerVertex {\n"
5405 " vec4 gl_Position;\n"
5406 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005407 "void main(){\n"
5408 " gl_Position = x[0] + x[1];\n"
5409 "}\n";
5410 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005411 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005412 "\n"
5413 "layout(location=0) out vec4 color;\n"
5414 "void main(){\n"
5415 " color = vec4(1);\n"
5416 "}\n";
5417
5418 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5419 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5420
5421 VkPipelineObj pipe(m_device);
5422 pipe.AddColorAttachment();
5423 pipe.AddShader(&vs);
5424 pipe.AddShader(&fs);
5425
5426 pipe.AddVertexInputBindings(&input_binding, 1);
5427 pipe.AddVertexInputAttribs(input_attribs, 2);
5428
5429 VkDescriptorSetObj descriptorSet(m_device);
5430 descriptorSet.AppendDummy();
5431 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5432
5433 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5434
5435 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005436 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13005437}
5438
Chris Forbes2682b242015-11-24 11:13:14 +13005439TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
5440{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005441 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13005442
5443 ASSERT_NO_FATAL_FAILURE(InitState());
5444 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5445
5446 VkVertexInputBindingDescription input_binding;
5447 memset(&input_binding, 0, sizeof(input_binding));
5448
5449 VkVertexInputAttributeDescription input_attribs[2];
5450 memset(input_attribs, 0, sizeof(input_attribs));
5451
5452 for (int i = 0; i < 2; i++) {
5453 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
5454 input_attribs[i].location = i;
5455 }
5456
5457 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005458 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005459 "\n"
5460 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07005461 "out gl_PerVertex {\n"
5462 " vec4 gl_Position;\n"
5463 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005464 "void main(){\n"
5465 " gl_Position = x[0] + x[1];\n"
5466 "}\n";
5467 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005468 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005469 "\n"
5470 "layout(location=0) out vec4 color;\n"
5471 "void main(){\n"
5472 " color = vec4(1);\n"
5473 "}\n";
5474
5475 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5476 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5477
5478 VkPipelineObj pipe(m_device);
5479 pipe.AddColorAttachment();
5480 pipe.AddShader(&vs);
5481 pipe.AddShader(&fs);
5482
5483 pipe.AddVertexInputBindings(&input_binding, 1);
5484 pipe.AddVertexInputAttribs(input_attribs, 2);
5485
5486 VkDescriptorSetObj descriptorSet(m_device);
5487 descriptorSet.AppendDummy();
5488 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5489
5490 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5491
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005492 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13005493}
Chris Forbes2682b242015-11-24 11:13:14 +13005494
Chris Forbes4ea14fc2016-04-04 18:52:54 +12005495TEST_F(VkLayerTest, CreatePipelineSimplePositive)
5496{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005497 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12005498
5499 ASSERT_NO_FATAL_FAILURE(InitState());
5500 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5501
5502 char const *vsSource =
5503 "#version 450\n"
5504 "out gl_PerVertex {\n"
5505 " vec4 gl_Position;\n"
5506 "};\n"
5507 "void main(){\n"
5508 " gl_Position = vec4(0);\n"
5509 "}\n";
5510 char const *fsSource =
5511 "#version 450\n"
5512 "\n"
5513 "layout(location=0) out vec4 color;\n"
5514 "void main(){\n"
5515 " color = vec4(1);\n"
5516 "}\n";
5517
5518 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5519 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5520
5521 VkPipelineObj pipe(m_device);
5522 pipe.AddColorAttachment();
5523 pipe.AddShader(&vs);
5524 pipe.AddShader(&fs);
5525
5526 VkDescriptorSetObj descriptorSet(m_device);
5527 descriptorSet.AppendDummy();
5528 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5529
5530 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5531
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005532 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12005533}
5534
Chris Forbes912c9192016-04-05 17:50:35 +12005535TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
5536{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005537 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12005538
5539 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
5540
5541 ASSERT_NO_FATAL_FAILURE(InitState());
5542 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5543
5544 char const *vsSource =
5545 "#version 450\n"
5546 "out gl_PerVertex {\n"
5547 " vec4 gl_Position;\n"
5548 "};\n"
5549 "layout(location=0) out vec3 x;\n"
5550 "layout(location=1) out ivec3 y;\n"
5551 "layout(location=2) out vec3 z;\n"
5552 "void main(){\n"
5553 " gl_Position = vec4(0);\n"
5554 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
5555 "}\n";
5556 char const *fsSource =
5557 "#version 450\n"
5558 "\n"
5559 "layout(location=0) out vec4 color;\n"
5560 "layout(location=0) in float x;\n"
5561 "layout(location=1) flat in int y;\n"
5562 "layout(location=2) in vec2 z;\n"
5563 "void main(){\n"
5564 " color = vec4(1 + x + y + z.x);\n"
5565 "}\n";
5566
5567 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5568 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5569
5570 VkPipelineObj pipe(m_device);
5571 pipe.AddColorAttachment();
5572 pipe.AddShader(&vs);
5573 pipe.AddShader(&fs);
5574
5575 VkDescriptorSetObj descriptorSet(m_device);
5576 descriptorSet.AppendDummy();
5577 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5578
5579 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5580
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005581 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12005582}
5583
Chris Forbes4ea14fc2016-04-04 18:52:54 +12005584TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
5585{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005586 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12005587
5588 ASSERT_NO_FATAL_FAILURE(InitState());
5589 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5590
Chris Forbesc1e852d2016-04-04 19:26:42 +12005591 if (!m_device->phy().features().tessellationShader) {
5592 printf("Device does not support tessellation shaders; skipped.\n");
5593 return;
5594 }
5595
Chris Forbes4ea14fc2016-04-04 18:52:54 +12005596 char const *vsSource =
5597 "#version 450\n"
5598 "void main(){}\n";
5599 char const *tcsSource =
5600 "#version 450\n"
5601 "layout(location=0) out int x[];\n"
5602 "layout(vertices=3) out;\n"
5603 "void main(){\n"
5604 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
5605 " gl_TessLevelInner[0] = 1;\n"
5606 " x[gl_InvocationID] = gl_InvocationID;\n"
5607 "}\n";
5608 char const *tesSource =
5609 "#version 450\n"
5610 "layout(triangles, equal_spacing, cw) in;\n"
5611 "layout(location=0) in int x[];\n"
5612 "out gl_PerVertex { vec4 gl_Position; };\n"
5613 "void main(){\n"
5614 " gl_Position.xyz = gl_TessCoord;\n"
5615 " gl_Position.w = x[0] + x[1] + x[2];\n"
5616 "}\n";
5617 char const *fsSource =
5618 "#version 450\n"
5619 "layout(location=0) out vec4 color;\n"
5620 "void main(){\n"
5621 " color = vec4(1);\n"
5622 "}\n";
5623
5624 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5625 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
5626 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
5627 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5628
5629 VkPipelineInputAssemblyStateCreateInfo iasci{
5630 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
5631 nullptr,
5632 0,
5633 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
5634 VK_FALSE};
5635
Chris Forbesb4cacb62016-04-04 19:15:00 +12005636 VkPipelineTessellationStateCreateInfo tsci{
5637 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
5638 nullptr,
5639 0,
5640 3};
5641
Chris Forbes4ea14fc2016-04-04 18:52:54 +12005642 VkPipelineObj pipe(m_device);
5643 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12005644 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12005645 pipe.AddColorAttachment();
5646 pipe.AddShader(&vs);
5647 pipe.AddShader(&tcs);
5648 pipe.AddShader(&tes);
5649 pipe.AddShader(&fs);
5650
5651 VkDescriptorSetObj descriptorSet(m_device);
5652 descriptorSet.AppendDummy();
5653 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5654
5655 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5656
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005657 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12005658}
5659
Chris Forbesa0ab8152016-04-20 13:34:27 +12005660TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
5661{
5662 m_errorMonitor->ExpectSuccess();
5663
5664 ASSERT_NO_FATAL_FAILURE(InitState());
5665 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5666
5667 if (!m_device->phy().features().geometryShader) {
5668 printf("Device does not support geometry shaders; skipped.\n");
5669 return;
5670 }
5671
5672 char const *vsSource =
5673 "#version 450\n"
5674 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
5675 "void main(){\n"
5676 " vs_out.x = vec4(1);\n"
5677 "}\n";
5678 char const *gsSource =
5679 "#version 450\n"
5680 "layout(triangles) in;\n"
5681 "layout(triangle_strip, max_vertices=3) out;\n"
5682 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
5683 "out gl_PerVertex { vec4 gl_Position; };\n"
5684 "void main() {\n"
5685 " gl_Position = gs_in[0].x;\n"
5686 " EmitVertex();\n"
5687 "}\n";
5688 char const *fsSource =
5689 "#version 450\n"
5690 "layout(location=0) out vec4 color;\n"
5691 "void main(){\n"
5692 " color = vec4(1);\n"
5693 "}\n";
5694
5695 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5696 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
5697 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5698
5699 VkPipelineObj pipe(m_device);
5700 pipe.AddColorAttachment();
5701 pipe.AddShader(&vs);
5702 pipe.AddShader(&gs);
5703 pipe.AddShader(&fs);
5704
5705 VkDescriptorSetObj descriptorSet(m_device);
5706 descriptorSet.AppendDummy();
5707 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5708
5709 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5710
5711 m_errorMonitor->VerifyNotFound();
5712}
5713
Chris Forbesa0193bc2016-04-04 19:19:47 +12005714TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
5715{
5716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5717 "is per-vertex in tessellation control shader stage "
5718 "but per-patch in tessellation evaluation shader stage");
5719
5720 ASSERT_NO_FATAL_FAILURE(InitState());
5721 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5722
Chris Forbesc1e852d2016-04-04 19:26:42 +12005723 if (!m_device->phy().features().tessellationShader) {
5724 printf("Device does not support tessellation shaders; skipped.\n");
5725 return;
5726 }
5727
Chris Forbesa0193bc2016-04-04 19:19:47 +12005728 char const *vsSource =
5729 "#version 450\n"
5730 "void main(){}\n";
5731 char const *tcsSource =
5732 "#version 450\n"
5733 "layout(location=0) out int x[];\n"
5734 "layout(vertices=3) out;\n"
5735 "void main(){\n"
5736 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
5737 " gl_TessLevelInner[0] = 1;\n"
5738 " x[gl_InvocationID] = gl_InvocationID;\n"
5739 "}\n";
5740 char const *tesSource =
5741 "#version 450\n"
5742 "layout(triangles, equal_spacing, cw) in;\n"
5743 "layout(location=0) patch in int x;\n"
5744 "out gl_PerVertex { vec4 gl_Position; };\n"
5745 "void main(){\n"
5746 " gl_Position.xyz = gl_TessCoord;\n"
5747 " gl_Position.w = x;\n"
5748 "}\n";
5749 char const *fsSource =
5750 "#version 450\n"
5751 "layout(location=0) out vec4 color;\n"
5752 "void main(){\n"
5753 " color = vec4(1);\n"
5754 "}\n";
5755
5756 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5757 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
5758 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
5759 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5760
5761 VkPipelineInputAssemblyStateCreateInfo iasci{
5762 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
5763 nullptr,
5764 0,
5765 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
5766 VK_FALSE};
5767
5768 VkPipelineTessellationStateCreateInfo tsci{
5769 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
5770 nullptr,
5771 0,
5772 3};
5773
5774 VkPipelineObj pipe(m_device);
5775 pipe.SetInputAssembly(&iasci);
5776 pipe.SetTessellation(&tsci);
5777 pipe.AddColorAttachment();
5778 pipe.AddShader(&vs);
5779 pipe.AddShader(&tcs);
5780 pipe.AddShader(&tes);
5781 pipe.AddShader(&fs);
5782
5783 VkDescriptorSetObj descriptorSet(m_device);
5784 descriptorSet.AppendDummy();
5785 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5786
5787 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5788
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005789 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12005790}
5791
Karl Schultz6addd812016-02-02 17:17:23 -07005792TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
5793 m_errorMonitor->SetDesiredFailureMsg(
5794 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005795 "Duplicate vertex input binding descriptions for binding 0");
5796
Chris Forbes280ba2c2015-06-12 11:16:41 +12005797 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005798 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12005799
5800 /* Two binding descriptions for binding 0 */
5801 VkVertexInputBindingDescription input_bindings[2];
5802 memset(input_bindings, 0, sizeof(input_bindings));
5803
5804 VkVertexInputAttributeDescription input_attrib;
5805 memset(&input_attrib, 0, sizeof(input_attrib));
5806 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5807
5808 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005809 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005810 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005811 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07005812 "out gl_PerVertex {\n"
5813 " vec4 gl_Position;\n"
5814 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005815 "void main(){\n"
5816 " gl_Position = vec4(x);\n"
5817 "}\n";
5818 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005819 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005820 "\n"
5821 "layout(location=0) out vec4 color;\n"
5822 "void main(){\n"
5823 " color = vec4(1);\n"
5824 "}\n";
5825
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005826 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5827 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12005828
5829 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005830 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12005831 pipe.AddShader(&vs);
5832 pipe.AddShader(&fs);
5833
5834 pipe.AddVertexInputBindings(input_bindings, 2);
5835 pipe.AddVertexInputAttribs(&input_attrib, 1);
5836
Chris Forbes280ba2c2015-06-12 11:16:41 +12005837 VkDescriptorSetObj descriptorSet(m_device);
5838 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005839 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12005840
Tony Barbour5781e8f2015-08-04 16:23:11 -06005841 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12005842
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005843 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12005844}
Chris Forbes8f68b562015-05-25 11:13:32 +12005845
Chris Forbes35efec72016-04-21 14:32:08 +12005846TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
5847 m_errorMonitor->ExpectSuccess();
5848
5849 ASSERT_NO_FATAL_FAILURE(InitState());
5850 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5851
5852 if (!m_device->phy().features().tessellationShader) {
5853 printf("Device does not support 64bit vertex attributes; skipped.\n");
5854 return;
5855 }
5856
5857 VkVertexInputBindingDescription input_bindings[1];
5858 memset(input_bindings, 0, sizeof(input_bindings));
5859
5860 VkVertexInputAttributeDescription input_attribs[4];
5861 memset(input_attribs, 0, sizeof(input_attribs));
5862 input_attribs[0].location = 0;
5863 input_attribs[0].offset = 0;
5864 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
5865 input_attribs[1].location = 2;
5866 input_attribs[1].offset = 32;
5867 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
5868 input_attribs[2].location = 4;
5869 input_attribs[2].offset = 64;
5870 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
5871 input_attribs[3].location = 6;
5872 input_attribs[3].offset = 96;
5873 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
5874
5875 char const *vsSource =
5876 "#version 450\n"
5877 "\n"
5878 "layout(location=0) in dmat4 x;\n"
5879 "out gl_PerVertex {\n"
5880 " vec4 gl_Position;\n"
5881 "};\n"
5882 "void main(){\n"
5883 " gl_Position = vec4(x[0][0]);\n"
5884 "}\n";
5885 char const *fsSource =
5886 "#version 450\n"
5887 "\n"
5888 "layout(location=0) out vec4 color;\n"
5889 "void main(){\n"
5890 " color = vec4(1);\n"
5891 "}\n";
5892
5893 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5894 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5895
5896 VkPipelineObj pipe(m_device);
5897 pipe.AddColorAttachment();
5898 pipe.AddShader(&vs);
5899 pipe.AddShader(&fs);
5900
5901 pipe.AddVertexInputBindings(input_bindings, 1);
5902 pipe.AddVertexInputAttribs(input_attribs, 4);
5903
5904 VkDescriptorSetObj descriptorSet(m_device);
5905 descriptorSet.AppendDummy();
5906 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5907
5908 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5909
5910 m_errorMonitor->VerifyNotFound();
5911}
5912
Karl Schultz6addd812016-02-02 17:17:23 -07005913TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005914 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005915 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005916
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005917 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005918
5919 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005920 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005921 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005922 "out gl_PerVertex {\n"
5923 " vec4 gl_Position;\n"
5924 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005925 "void main(){\n"
5926 " gl_Position = vec4(1);\n"
5927 "}\n";
5928 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005929 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005930 "\n"
5931 "void main(){\n"
5932 "}\n";
5933
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005934 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5935 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005936
5937 VkPipelineObj pipe(m_device);
5938 pipe.AddShader(&vs);
5939 pipe.AddShader(&fs);
5940
Chia-I Wu08accc62015-07-07 11:50:03 +08005941 /* set up CB 0, not written */
5942 pipe.AddColorAttachment();
5943 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005944
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005945 VkDescriptorSetObj descriptorSet(m_device);
5946 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005947 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005948
Tony Barbour5781e8f2015-08-04 16:23:11 -06005949 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005950
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005951 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005952}
5953
Karl Schultz6addd812016-02-02 17:17:23 -07005954TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07005955 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005956 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005957 "FS writes to output location 1 with no matching attachment");
5958
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005959 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005960
5961 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005962 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005963 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005964 "out gl_PerVertex {\n"
5965 " vec4 gl_Position;\n"
5966 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005967 "void main(){\n"
5968 " gl_Position = vec4(1);\n"
5969 "}\n";
5970 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005971 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005972 "\n"
5973 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005974 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005975 "void main(){\n"
5976 " x = vec4(1);\n"
5977 " y = vec4(1);\n"
5978 "}\n";
5979
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005980 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5981 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005982
5983 VkPipelineObj pipe(m_device);
5984 pipe.AddShader(&vs);
5985 pipe.AddShader(&fs);
5986
Chia-I Wu08accc62015-07-07 11:50:03 +08005987 /* set up CB 0, not written */
5988 pipe.AddColorAttachment();
5989 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005990 /* FS writes CB 1, but we don't configure it */
5991
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005992 VkDescriptorSetObj descriptorSet(m_device);
5993 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005994 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005995
Tony Barbour5781e8f2015-08-04 16:23:11 -06005996 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005997
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005998 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005999}
6000
Karl Schultz6addd812016-02-02 17:17:23 -07006001TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006002 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006003 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006004
Chris Forbesa36d69e2015-05-25 11:13:44 +12006005 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12006006
6007 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006008 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12006009 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006010 "out gl_PerVertex {\n"
6011 " vec4 gl_Position;\n"
6012 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12006013 "void main(){\n"
6014 " gl_Position = vec4(1);\n"
6015 "}\n";
6016 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006017 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12006018 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006019 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12006020 "void main(){\n"
6021 " x = ivec4(1);\n"
6022 "}\n";
6023
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006024 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6025 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12006026
6027 VkPipelineObj pipe(m_device);
6028 pipe.AddShader(&vs);
6029 pipe.AddShader(&fs);
6030
Chia-I Wu08accc62015-07-07 11:50:03 +08006031 /* set up CB 0; type is UNORM by default */
6032 pipe.AddColorAttachment();
6033 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12006034
Chris Forbesa36d69e2015-05-25 11:13:44 +12006035 VkDescriptorSetObj descriptorSet(m_device);
6036 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006037 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12006038
Tony Barbour5781e8f2015-08-04 16:23:11 -06006039 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12006040
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006041 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12006042}
Chris Forbes7b1b8932015-06-05 14:43:36 +12006043
Karl Schultz6addd812016-02-02 17:17:23 -07006044TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006045 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006046 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006047
Chris Forbes556c76c2015-08-14 12:04:59 +12006048 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12006049
6050 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006051 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12006052 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006053 "out gl_PerVertex {\n"
6054 " vec4 gl_Position;\n"
6055 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12006056 "void main(){\n"
6057 " gl_Position = vec4(1);\n"
6058 "}\n";
6059 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006060 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12006061 "\n"
6062 "layout(location=0) out vec4 x;\n"
6063 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6064 "void main(){\n"
6065 " x = vec4(bar.y);\n"
6066 "}\n";
6067
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006068 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6069 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12006070
Chris Forbes556c76c2015-08-14 12:04:59 +12006071 VkPipelineObj pipe(m_device);
6072 pipe.AddShader(&vs);
6073 pipe.AddShader(&fs);
6074
6075 /* set up CB 0; type is UNORM by default */
6076 pipe.AddColorAttachment();
6077 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6078
6079 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006080 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12006081
6082 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6083
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006084 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12006085}
6086
Chris Forbes5c59e902016-02-26 16:56:09 +13006087TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
6088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6089 "not declared in layout");
6090
6091 ASSERT_NO_FATAL_FAILURE(InitState());
6092
6093 char const *vsSource =
6094 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13006095 "\n"
6096 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
6097 "out gl_PerVertex {\n"
6098 " vec4 gl_Position;\n"
6099 "};\n"
6100 "void main(){\n"
6101 " gl_Position = vec4(consts.x);\n"
6102 "}\n";
6103 char const *fsSource =
6104 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13006105 "\n"
6106 "layout(location=0) out vec4 x;\n"
6107 "void main(){\n"
6108 " x = vec4(1);\n"
6109 "}\n";
6110
6111 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6112 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6113
6114 VkPipelineObj pipe(m_device);
6115 pipe.AddShader(&vs);
6116 pipe.AddShader(&fs);
6117
6118 /* set up CB 0; type is UNORM by default */
6119 pipe.AddColorAttachment();
6120 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6121
6122 VkDescriptorSetObj descriptorSet(m_device);
6123 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6124
6125 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6126
6127 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006128 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13006129}
6130
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006131#endif // SHADER_CHECKER_TESTS
6132
6133#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06006134TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07006135 m_errorMonitor->SetDesiredFailureMsg(
6136 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006137 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006138
6139 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006140
6141 // Create an image
6142 VkImage image;
6143
Karl Schultz6addd812016-02-02 17:17:23 -07006144 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6145 const int32_t tex_width = 32;
6146 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006147
6148 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006149 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6150 image_create_info.pNext = NULL;
6151 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6152 image_create_info.format = tex_format;
6153 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006154 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07006155 image_create_info.extent.depth = 1;
6156 image_create_info.mipLevels = 1;
6157 image_create_info.arrayLayers = 1;
6158 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6159 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6160 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6161 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006162
6163 // Introduce error by sending down a bogus width extent
6164 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006165 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006166
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006167 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006168}
6169
Mark Youngc48c4c12016-04-11 14:26:49 -06006170TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
6171 m_errorMonitor->SetDesiredFailureMsg(
6172 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6173 "CreateImage extents is 0 for at least one required dimension");
6174
6175 ASSERT_NO_FATAL_FAILURE(InitState());
6176
6177 // Create an image
6178 VkImage image;
6179
6180 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6181 const int32_t tex_width = 32;
6182 const int32_t tex_height = 32;
6183
6184 VkImageCreateInfo image_create_info = {};
6185 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6186 image_create_info.pNext = NULL;
6187 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6188 image_create_info.format = tex_format;
6189 image_create_info.extent.width = tex_width;
6190 image_create_info.extent.height = tex_height;
6191 image_create_info.extent.depth = 1;
6192 image_create_info.mipLevels = 1;
6193 image_create_info.arrayLayers = 1;
6194 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6195 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6196 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6197 image_create_info.flags = 0;
6198
6199 // Introduce error by sending down a bogus width extent
6200 image_create_info.extent.width = 0;
6201 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6202
6203 m_errorMonitor->VerifyFound();
6204}
6205
Karl Schultz6addd812016-02-02 17:17:23 -07006206TEST_F(VkLayerTest, UpdateBufferAlignment) {
6207 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06006208
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006210 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006211
Mike Stroyana3082432015-09-25 13:39:21 -06006212 ASSERT_NO_FATAL_FAILURE(InitState());
6213
6214 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
6215 vk_testing::Buffer buffer;
6216 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
6217
6218 BeginCommandBuffer();
6219 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006220 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006221 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006222
Mike Stroyana3082432015-09-25 13:39:21 -06006223 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006225 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006226
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006227 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006228 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006229 EndCommandBuffer();
6230}
6231
Karl Schultz6addd812016-02-02 17:17:23 -07006232TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006234 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06006235
6236 ASSERT_NO_FATAL_FAILURE(InitState());
6237
6238 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
6239 vk_testing::Buffer buffer;
6240 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
6241
6242 BeginCommandBuffer();
6243 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006244 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006245 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006246
Mike Stroyana3082432015-09-25 13:39:21 -06006247 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006249 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006250
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006251 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006252
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006253 m_errorMonitor->VerifyFound();
6254
Mike Stroyana3082432015-09-25 13:39:21 -06006255 EndCommandBuffer();
6256}
6257
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006258#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12006259
Tobin Ehliscde08892015-09-22 10:11:37 -06006260#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006261TEST_F(VkLayerTest, InvalidImageView) {
6262 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06006263
Karl Schultz6addd812016-02-02 17:17:23 -07006264 m_errorMonitor->SetDesiredFailureMsg(
6265 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006266 "vkCreateImageView called with baseMipLevel 10 ");
6267
Tobin Ehliscde08892015-09-22 10:11:37 -06006268 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06006269
Mike Stroyana3082432015-09-25 13:39:21 -06006270 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07006271 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06006272
Karl Schultz6addd812016-02-02 17:17:23 -07006273 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6274 const int32_t tex_width = 32;
6275 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06006276
6277 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006278 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6279 image_create_info.pNext = NULL;
6280 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6281 image_create_info.format = tex_format;
6282 image_create_info.extent.width = tex_width;
6283 image_create_info.extent.height = tex_height;
6284 image_create_info.extent.depth = 1;
6285 image_create_info.mipLevels = 1;
6286 image_create_info.arrayLayers = 1;
6287 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6288 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6289 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6290 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06006291
Chia-I Wuf7458c52015-10-26 21:10:41 +08006292 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06006293 ASSERT_VK_SUCCESS(err);
6294
6295 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006296 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6297 image_view_create_info.image = image;
6298 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6299 image_view_create_info.format = tex_format;
6300 image_view_create_info.subresourceRange.layerCount = 1;
6301 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
6302 image_view_create_info.subresourceRange.levelCount = 1;
6303 image_view_create_info.subresourceRange.aspectMask =
6304 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06006305
6306 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07006307 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6308 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06006309
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006310 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06006311}
Mike Stroyana3082432015-09-25 13:39:21 -06006312
Karl Schultz6addd812016-02-02 17:17:23 -07006313TEST_F(VkLayerTest, InvalidImageViewAspect) {
6314 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006315
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006317 "vkCreateImageView: Color image "
6318 "formats must have ONLY the "
6319 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006320
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006321 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006322
6323 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07006324 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006325
Karl Schultz6addd812016-02-02 17:17:23 -07006326 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6327 const int32_t tex_width = 32;
6328 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006329
6330 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006331 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6332 image_create_info.pNext = NULL;
6333 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6334 image_create_info.format = tex_format;
6335 image_create_info.extent.width = tex_width;
6336 image_create_info.extent.height = tex_height;
6337 image_create_info.extent.depth = 1;
6338 image_create_info.mipLevels = 1;
6339 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6340 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6341 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6342 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006343
Chia-I Wuf7458c52015-10-26 21:10:41 +08006344 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006345 ASSERT_VK_SUCCESS(err);
6346
6347 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006348 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6349 image_view_create_info.image = image;
6350 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6351 image_view_create_info.format = tex_format;
6352 image_view_create_info.subresourceRange.baseMipLevel = 0;
6353 image_view_create_info.subresourceRange.levelCount = 1;
6354 // Cause an error by setting an invalid image aspect
6355 image_view_create_info.subresourceRange.aspectMask =
6356 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006357
6358 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07006359 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6360 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006361
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006362 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006363}
6364
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006365TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07006366 VkResult err;
6367 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006368
Karl Schultz6addd812016-02-02 17:17:23 -07006369 m_errorMonitor->SetDesiredFailureMsg(
6370 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006371 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006372
Mike Stroyana3082432015-09-25 13:39:21 -06006373 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006374
6375 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006376 VkImage srcImage;
6377 VkImage dstImage;
6378 VkDeviceMemory srcMem;
6379 VkDeviceMemory destMem;
6380 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006381
6382 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006383 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6384 image_create_info.pNext = NULL;
6385 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6386 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6387 image_create_info.extent.width = 32;
6388 image_create_info.extent.height = 32;
6389 image_create_info.extent.depth = 1;
6390 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006391 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07006392 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6393 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6394 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6395 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006396
Karl Schultz6addd812016-02-02 17:17:23 -07006397 err =
6398 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006399 ASSERT_VK_SUCCESS(err);
6400
Karl Schultz6addd812016-02-02 17:17:23 -07006401 err =
6402 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006403 ASSERT_VK_SUCCESS(err);
6404
6405 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006406 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006407 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6408 memAlloc.pNext = NULL;
6409 memAlloc.allocationSize = 0;
6410 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006411
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006412 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006413 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006414 pass =
6415 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006416 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006417 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006418 ASSERT_VK_SUCCESS(err);
6419
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006420 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006421 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006422 pass =
6423 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006424 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006425 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006426 ASSERT_VK_SUCCESS(err);
6427
6428 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6429 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006430 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006431 ASSERT_VK_SUCCESS(err);
6432
6433 BeginCommandBuffer();
6434 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006435 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006436 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006437 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006438 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06006439 copyRegion.srcOffset.x = 0;
6440 copyRegion.srcOffset.y = 0;
6441 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006442 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006443 copyRegion.dstSubresource.mipLevel = 0;
6444 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006445 // Introduce failure by forcing the dst layerCount to differ from src
6446 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006447 copyRegion.dstOffset.x = 0;
6448 copyRegion.dstOffset.y = 0;
6449 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006450 copyRegion.extent.width = 1;
6451 copyRegion.extent.height = 1;
6452 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006453 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6454 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006455 EndCommandBuffer();
6456
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006457 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006458
Chia-I Wuf7458c52015-10-26 21:10:41 +08006459 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006460 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006461 vkFreeMemory(m_device->device(), srcMem, NULL);
6462 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006463}
6464
Karl Schultz6addd812016-02-02 17:17:23 -07006465TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006466 VkResult err;
6467 bool pass;
6468
6469 // Create color images with different format sizes and try to copy between them
6470 m_errorMonitor->SetDesiredFailureMsg(
6471 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6472 "vkCmdCopyImage called with unmatched source and dest image format sizes");
6473
6474 ASSERT_NO_FATAL_FAILURE(InitState());
6475
6476 // Create two images of different types and try to copy between them
6477 VkImage srcImage;
6478 VkImage dstImage;
6479 VkDeviceMemory srcMem;
6480 VkDeviceMemory destMem;
6481 VkMemoryRequirements memReqs;
6482
6483 VkImageCreateInfo image_create_info = {};
6484 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6485 image_create_info.pNext = NULL;
6486 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6487 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6488 image_create_info.extent.width = 32;
6489 image_create_info.extent.height = 32;
6490 image_create_info.extent.depth = 1;
6491 image_create_info.mipLevels = 1;
6492 image_create_info.arrayLayers = 1;
6493 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6494 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6495 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6496 image_create_info.flags = 0;
6497
6498 err =
6499 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
6500 ASSERT_VK_SUCCESS(err);
6501
6502 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6503 // Introduce failure by creating second image with a different-sized format.
6504 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
6505
6506 err =
6507 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
6508 ASSERT_VK_SUCCESS(err);
6509
6510 // Allocate memory
6511 VkMemoryAllocateInfo memAlloc = {};
6512 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6513 memAlloc.pNext = NULL;
6514 memAlloc.allocationSize = 0;
6515 memAlloc.memoryTypeIndex = 0;
6516
6517 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
6518 memAlloc.allocationSize = memReqs.size;
6519 pass =
6520 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
6521 ASSERT_TRUE(pass);
6522 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
6523 ASSERT_VK_SUCCESS(err);
6524
6525 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
6526 memAlloc.allocationSize = memReqs.size;
6527 pass =
6528 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
6529 ASSERT_TRUE(pass);
6530 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
6531 ASSERT_VK_SUCCESS(err);
6532
6533 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6534 ASSERT_VK_SUCCESS(err);
6535 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
6536 ASSERT_VK_SUCCESS(err);
6537
6538 BeginCommandBuffer();
6539 VkImageCopy copyRegion;
6540 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6541 copyRegion.srcSubresource.mipLevel = 0;
6542 copyRegion.srcSubresource.baseArrayLayer = 0;
6543 copyRegion.srcSubresource.layerCount = 0;
6544 copyRegion.srcOffset.x = 0;
6545 copyRegion.srcOffset.y = 0;
6546 copyRegion.srcOffset.z = 0;
6547 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6548 copyRegion.dstSubresource.mipLevel = 0;
6549 copyRegion.dstSubresource.baseArrayLayer = 0;
6550 copyRegion.dstSubresource.layerCount = 0;
6551 copyRegion.dstOffset.x = 0;
6552 copyRegion.dstOffset.y = 0;
6553 copyRegion.dstOffset.z = 0;
6554 copyRegion.extent.width = 1;
6555 copyRegion.extent.height = 1;
6556 copyRegion.extent.depth = 1;
6557 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6558 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6559 EndCommandBuffer();
6560
6561 m_errorMonitor->VerifyFound();
6562
6563 vkDestroyImage(m_device->device(), srcImage, NULL);
6564 vkDestroyImage(m_device->device(), dstImage, NULL);
6565 vkFreeMemory(m_device->device(), srcMem, NULL);
6566 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006567}
6568
Karl Schultz6addd812016-02-02 17:17:23 -07006569TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
6570 VkResult err;
6571 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006572
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006573 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006574 m_errorMonitor->SetDesiredFailureMsg(
6575 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006576 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006577
Mike Stroyana3082432015-09-25 13:39:21 -06006578 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006579
6580 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006581 VkImage srcImage;
6582 VkImage dstImage;
6583 VkDeviceMemory srcMem;
6584 VkDeviceMemory destMem;
6585 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006586
6587 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006588 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6589 image_create_info.pNext = NULL;
6590 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6591 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6592 image_create_info.extent.width = 32;
6593 image_create_info.extent.height = 32;
6594 image_create_info.extent.depth = 1;
6595 image_create_info.mipLevels = 1;
6596 image_create_info.arrayLayers = 1;
6597 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6598 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6599 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6600 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006601
Karl Schultz6addd812016-02-02 17:17:23 -07006602 err =
6603 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006604 ASSERT_VK_SUCCESS(err);
6605
Karl Schultzbdb75952016-04-19 11:36:49 -06006606 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6607
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006608 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07006609 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006610 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
6611 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006612
Karl Schultz6addd812016-02-02 17:17:23 -07006613 err =
6614 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006615 ASSERT_VK_SUCCESS(err);
6616
6617 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006618 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006619 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6620 memAlloc.pNext = NULL;
6621 memAlloc.allocationSize = 0;
6622 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006623
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006624 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006625 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006626 pass =
6627 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006628 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006629 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006630 ASSERT_VK_SUCCESS(err);
6631
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006632 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006633 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006634 pass =
6635 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006636 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006637 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006638 ASSERT_VK_SUCCESS(err);
6639
6640 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6641 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006642 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006643 ASSERT_VK_SUCCESS(err);
6644
6645 BeginCommandBuffer();
6646 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006647 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006648 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006649 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006650 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006651 copyRegion.srcOffset.x = 0;
6652 copyRegion.srcOffset.y = 0;
6653 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006654 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006655 copyRegion.dstSubresource.mipLevel = 0;
6656 copyRegion.dstSubresource.baseArrayLayer = 0;
6657 copyRegion.dstSubresource.layerCount = 0;
6658 copyRegion.dstOffset.x = 0;
6659 copyRegion.dstOffset.y = 0;
6660 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006661 copyRegion.extent.width = 1;
6662 copyRegion.extent.height = 1;
6663 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006664 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6665 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006666 EndCommandBuffer();
6667
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006668 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006669
Chia-I Wuf7458c52015-10-26 21:10:41 +08006670 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006671 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006672 vkFreeMemory(m_device->device(), srcMem, NULL);
6673 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006674}
6675
Karl Schultz6addd812016-02-02 17:17:23 -07006676TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
6677 VkResult err;
6678 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006679
Karl Schultz6addd812016-02-02 17:17:23 -07006680 m_errorMonitor->SetDesiredFailureMsg(
6681 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006682 "vkCmdResolveImage called with source sample count less than 2.");
6683
Mike Stroyana3082432015-09-25 13:39:21 -06006684 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006685
6686 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07006687 VkImage srcImage;
6688 VkImage dstImage;
6689 VkDeviceMemory srcMem;
6690 VkDeviceMemory destMem;
6691 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006692
6693 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006694 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6695 image_create_info.pNext = NULL;
6696 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6697 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6698 image_create_info.extent.width = 32;
6699 image_create_info.extent.height = 1;
6700 image_create_info.extent.depth = 1;
6701 image_create_info.mipLevels = 1;
6702 image_create_info.arrayLayers = 1;
6703 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6704 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6705 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6706 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006707
Karl Schultz6addd812016-02-02 17:17:23 -07006708 err =
6709 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006710 ASSERT_VK_SUCCESS(err);
6711
Karl Schultz6addd812016-02-02 17:17:23 -07006712 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6713 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006714
Karl Schultz6addd812016-02-02 17:17:23 -07006715 err =
6716 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006717 ASSERT_VK_SUCCESS(err);
6718
6719 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006720 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006721 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6722 memAlloc.pNext = NULL;
6723 memAlloc.allocationSize = 0;
6724 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006725
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006726 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006727 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006728 pass =
6729 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006730 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006731 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006732 ASSERT_VK_SUCCESS(err);
6733
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006734 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006735 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006736 pass =
6737 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006738 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006739 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006740 ASSERT_VK_SUCCESS(err);
6741
6742 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6743 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006744 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006745 ASSERT_VK_SUCCESS(err);
6746
6747 BeginCommandBuffer();
6748 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006749 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6750 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006751 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006752 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006753 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006754 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006755 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006756 resolveRegion.srcOffset.x = 0;
6757 resolveRegion.srcOffset.y = 0;
6758 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006759 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006760 resolveRegion.dstSubresource.mipLevel = 0;
6761 resolveRegion.dstSubresource.baseArrayLayer = 0;
6762 resolveRegion.dstSubresource.layerCount = 0;
6763 resolveRegion.dstOffset.x = 0;
6764 resolveRegion.dstOffset.y = 0;
6765 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006766 resolveRegion.extent.width = 1;
6767 resolveRegion.extent.height = 1;
6768 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006769 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6770 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006771 EndCommandBuffer();
6772
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006773 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006774
Chia-I Wuf7458c52015-10-26 21:10:41 +08006775 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006776 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006777 vkFreeMemory(m_device->device(), srcMem, NULL);
6778 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006779}
6780
Karl Schultz6addd812016-02-02 17:17:23 -07006781TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
6782 VkResult err;
6783 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006784
Karl Schultz6addd812016-02-02 17:17:23 -07006785 m_errorMonitor->SetDesiredFailureMsg(
6786 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006787 "vkCmdResolveImage called with dest sample count greater than 1.");
6788
Mike Stroyana3082432015-09-25 13:39:21 -06006789 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006790
6791 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07006792 VkImage srcImage;
6793 VkImage dstImage;
6794 VkDeviceMemory srcMem;
6795 VkDeviceMemory destMem;
6796 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006797
6798 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006799 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6800 image_create_info.pNext = NULL;
6801 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6802 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6803 image_create_info.extent.width = 32;
6804 image_create_info.extent.height = 1;
6805 image_create_info.extent.depth = 1;
6806 image_create_info.mipLevels = 1;
6807 image_create_info.arrayLayers = 1;
6808 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6809 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6810 // Note: Some implementations expect color attachment usage for any
6811 // multisample surface
6812 image_create_info.usage =
6813 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6814 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006815
Karl Schultz6addd812016-02-02 17:17:23 -07006816 err =
6817 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006818 ASSERT_VK_SUCCESS(err);
6819
Karl Schultz6addd812016-02-02 17:17:23 -07006820 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6821 // Note: Some implementations expect color attachment usage for any
6822 // multisample surface
6823 image_create_info.usage =
6824 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006825
Karl Schultz6addd812016-02-02 17:17:23 -07006826 err =
6827 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006828 ASSERT_VK_SUCCESS(err);
6829
6830 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006831 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006832 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6833 memAlloc.pNext = NULL;
6834 memAlloc.allocationSize = 0;
6835 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006836
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006837 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006838 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006839 pass =
6840 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006841 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006842 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006843 ASSERT_VK_SUCCESS(err);
6844
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006845 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006846 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006847 pass =
6848 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006849 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006850 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006851 ASSERT_VK_SUCCESS(err);
6852
6853 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6854 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006855 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006856 ASSERT_VK_SUCCESS(err);
6857
6858 BeginCommandBuffer();
6859 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006860 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6861 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006862 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006863 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006864 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006865 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006866 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006867 resolveRegion.srcOffset.x = 0;
6868 resolveRegion.srcOffset.y = 0;
6869 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006870 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006871 resolveRegion.dstSubresource.mipLevel = 0;
6872 resolveRegion.dstSubresource.baseArrayLayer = 0;
6873 resolveRegion.dstSubresource.layerCount = 0;
6874 resolveRegion.dstOffset.x = 0;
6875 resolveRegion.dstOffset.y = 0;
6876 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006877 resolveRegion.extent.width = 1;
6878 resolveRegion.extent.height = 1;
6879 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006880 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6881 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006882 EndCommandBuffer();
6883
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006884 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006885
Chia-I Wuf7458c52015-10-26 21:10:41 +08006886 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006887 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006888 vkFreeMemory(m_device->device(), srcMem, NULL);
6889 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006890}
6891
Karl Schultz6addd812016-02-02 17:17:23 -07006892TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
6893 VkResult err;
6894 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006895
Karl Schultz6addd812016-02-02 17:17:23 -07006896 m_errorMonitor->SetDesiredFailureMsg(
6897 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006898 "vkCmdResolveImage called with unmatched source and dest formats.");
6899
Mike Stroyana3082432015-09-25 13:39:21 -06006900 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006901
6902 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006903 VkImage srcImage;
6904 VkImage dstImage;
6905 VkDeviceMemory srcMem;
6906 VkDeviceMemory destMem;
6907 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006908
6909 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006910 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6911 image_create_info.pNext = NULL;
6912 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6913 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6914 image_create_info.extent.width = 32;
6915 image_create_info.extent.height = 1;
6916 image_create_info.extent.depth = 1;
6917 image_create_info.mipLevels = 1;
6918 image_create_info.arrayLayers = 1;
6919 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6920 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6921 // Note: Some implementations expect color attachment usage for any
6922 // multisample surface
6923 image_create_info.usage =
6924 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6925 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006926
Karl Schultz6addd812016-02-02 17:17:23 -07006927 err =
6928 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006929 ASSERT_VK_SUCCESS(err);
6930
Karl Schultz6addd812016-02-02 17:17:23 -07006931 // Set format to something other than source image
6932 image_create_info.format = VK_FORMAT_R32_SFLOAT;
6933 // Note: Some implementations expect color attachment usage for any
6934 // multisample surface
6935 image_create_info.usage =
6936 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6937 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006938
Karl Schultz6addd812016-02-02 17:17:23 -07006939 err =
6940 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006941 ASSERT_VK_SUCCESS(err);
6942
6943 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006944 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006945 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6946 memAlloc.pNext = NULL;
6947 memAlloc.allocationSize = 0;
6948 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006949
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006950 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006951 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006952 pass =
6953 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006954 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006955 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006956 ASSERT_VK_SUCCESS(err);
6957
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006958 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006959 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006960 pass =
6961 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006962 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006963 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006964 ASSERT_VK_SUCCESS(err);
6965
6966 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6967 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006968 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006969 ASSERT_VK_SUCCESS(err);
6970
6971 BeginCommandBuffer();
6972 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006973 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6974 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006975 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006976 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006977 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006978 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006979 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006980 resolveRegion.srcOffset.x = 0;
6981 resolveRegion.srcOffset.y = 0;
6982 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006983 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006984 resolveRegion.dstSubresource.mipLevel = 0;
6985 resolveRegion.dstSubresource.baseArrayLayer = 0;
6986 resolveRegion.dstSubresource.layerCount = 0;
6987 resolveRegion.dstOffset.x = 0;
6988 resolveRegion.dstOffset.y = 0;
6989 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006990 resolveRegion.extent.width = 1;
6991 resolveRegion.extent.height = 1;
6992 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006993 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6994 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006995 EndCommandBuffer();
6996
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006997 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006998
Chia-I Wuf7458c52015-10-26 21:10:41 +08006999 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007000 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007001 vkFreeMemory(m_device->device(), srcMem, NULL);
7002 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007003}
7004
Karl Schultz6addd812016-02-02 17:17:23 -07007005TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
7006 VkResult err;
7007 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007008
Karl Schultz6addd812016-02-02 17:17:23 -07007009 m_errorMonitor->SetDesiredFailureMsg(
7010 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007011 "vkCmdResolveImage called with unmatched source and dest image types.");
7012
Mike Stroyana3082432015-09-25 13:39:21 -06007013 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007014
7015 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007016 VkImage srcImage;
7017 VkImage dstImage;
7018 VkDeviceMemory srcMem;
7019 VkDeviceMemory destMem;
7020 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007021
7022 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007023 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7024 image_create_info.pNext = NULL;
7025 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7026 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7027 image_create_info.extent.width = 32;
7028 image_create_info.extent.height = 1;
7029 image_create_info.extent.depth = 1;
7030 image_create_info.mipLevels = 1;
7031 image_create_info.arrayLayers = 1;
7032 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
7033 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7034 // Note: Some implementations expect color attachment usage for any
7035 // multisample surface
7036 image_create_info.usage =
7037 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
7038 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007039
Karl Schultz6addd812016-02-02 17:17:23 -07007040 err =
7041 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007042 ASSERT_VK_SUCCESS(err);
7043
Karl Schultz6addd812016-02-02 17:17:23 -07007044 image_create_info.imageType = VK_IMAGE_TYPE_1D;
7045 // Note: Some implementations expect color attachment usage for any
7046 // multisample surface
7047 image_create_info.usage =
7048 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
7049 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007050
Karl Schultz6addd812016-02-02 17:17:23 -07007051 err =
7052 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007053 ASSERT_VK_SUCCESS(err);
7054
7055 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007056 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007057 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7058 memAlloc.pNext = NULL;
7059 memAlloc.allocationSize = 0;
7060 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007061
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007062 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007063 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007064 pass =
7065 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007066 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007067 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007068 ASSERT_VK_SUCCESS(err);
7069
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007070 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007071 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007072 pass =
7073 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007074 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007075 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007076 ASSERT_VK_SUCCESS(err);
7077
7078 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7079 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007080 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007081 ASSERT_VK_SUCCESS(err);
7082
7083 BeginCommandBuffer();
7084 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07007085 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
7086 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06007087 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007088 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007089 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007090 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007091 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007092 resolveRegion.srcOffset.x = 0;
7093 resolveRegion.srcOffset.y = 0;
7094 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007095 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007096 resolveRegion.dstSubresource.mipLevel = 0;
7097 resolveRegion.dstSubresource.baseArrayLayer = 0;
7098 resolveRegion.dstSubresource.layerCount = 0;
7099 resolveRegion.dstOffset.x = 0;
7100 resolveRegion.dstOffset.y = 0;
7101 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007102 resolveRegion.extent.width = 1;
7103 resolveRegion.extent.height = 1;
7104 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007105 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7106 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007107 EndCommandBuffer();
7108
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007109 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007110
Chia-I Wuf7458c52015-10-26 21:10:41 +08007111 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007112 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007113 vkFreeMemory(m_device->device(), srcMem, NULL);
7114 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007115}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007116
Karl Schultz6addd812016-02-02 17:17:23 -07007117TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007118 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07007119 // to using a DS format, then cause it to hit error due to COLOR_BIT not
7120 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007121 // The image format check comes 2nd in validation so we trigger it first,
7122 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07007123 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007124
Karl Schultz6addd812016-02-02 17:17:23 -07007125 m_errorMonitor->SetDesiredFailureMsg(
7126 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007127 "Combination depth/stencil image formats can have only the ");
7128
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007129 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007130
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007131 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007132 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7133 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007134
7135 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007136 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7137 ds_pool_ci.pNext = NULL;
7138 ds_pool_ci.maxSets = 1;
7139 ds_pool_ci.poolSizeCount = 1;
7140 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007141
7142 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007143 err =
7144 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007145 ASSERT_VK_SUCCESS(err);
7146
7147 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007148 dsl_binding.binding = 0;
7149 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7150 dsl_binding.descriptorCount = 1;
7151 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7152 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007153
7154 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007155 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7156 ds_layout_ci.pNext = NULL;
7157 ds_layout_ci.bindingCount = 1;
7158 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007159 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007160 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7161 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007162 ASSERT_VK_SUCCESS(err);
7163
7164 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007165 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007166 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007167 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007168 alloc_info.descriptorPool = ds_pool;
7169 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007170 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7171 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007172 ASSERT_VK_SUCCESS(err);
7173
Karl Schultz6addd812016-02-02 17:17:23 -07007174 VkImage image_bad;
7175 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007176 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07007177 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007178 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07007179 const int32_t tex_width = 32;
7180 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007181
7182 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007183 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7184 image_create_info.pNext = NULL;
7185 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7186 image_create_info.format = tex_format_bad;
7187 image_create_info.extent.width = tex_width;
7188 image_create_info.extent.height = tex_height;
7189 image_create_info.extent.depth = 1;
7190 image_create_info.mipLevels = 1;
7191 image_create_info.arrayLayers = 1;
7192 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7193 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7194 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
7195 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
7196 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007197
Karl Schultz6addd812016-02-02 17:17:23 -07007198 err =
7199 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007200 ASSERT_VK_SUCCESS(err);
7201 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07007202 image_create_info.usage =
7203 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
7204 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
7205 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007206 ASSERT_VK_SUCCESS(err);
7207
7208 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007209 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7210 image_view_create_info.image = image_bad;
7211 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7212 image_view_create_info.format = tex_format_bad;
7213 image_view_create_info.subresourceRange.baseArrayLayer = 0;
7214 image_view_create_info.subresourceRange.baseMipLevel = 0;
7215 image_view_create_info.subresourceRange.layerCount = 1;
7216 image_view_create_info.subresourceRange.levelCount = 1;
7217 image_view_create_info.subresourceRange.aspectMask =
7218 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007219
7220 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007221 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7222 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007223
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007224 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007225
Chia-I Wuf7458c52015-10-26 21:10:41 +08007226 vkDestroyImage(m_device->device(), image_bad, NULL);
7227 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007228 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7229 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007230}
Tobin Ehliscde08892015-09-22 10:11:37 -06007231#endif // IMAGE_TESTS
7232
Tony Barbour300a6082015-04-07 13:44:53 -06007233int main(int argc, char **argv) {
7234 int result;
7235
Cody Northrop8e54a402016-03-08 22:25:52 -07007236#ifdef ANDROID
7237 int vulkanSupport = InitVulkan();
7238 if (vulkanSupport == 0)
7239 return 1;
7240#endif
7241
Tony Barbour300a6082015-04-07 13:44:53 -06007242 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06007243 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06007244
7245 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
7246
7247 result = RUN_ALL_TESTS();
7248
Tony Barbour6918cd52015-04-09 12:58:51 -06007249 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06007250 return result;
7251}